diff --git a/DEPS b/DEPS
index 44239d6b..27246178 100644
--- a/DEPS
+++ b/DEPS
@@ -105,11 +105,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '5457141b011e1791f5d3406e99de22c208d480f3',
+  'skia_revision': '90b47106a6e196b722ef5c439a0fcf9b85df7c8a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'c5a1fcbf544dc5ca5d901e96e2228d1eb767251b',
+  'v8_revision': 'ba614d6fa9be72bd4703bd3e8eeb457882af74ba',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -165,11 +165,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '846ae9bff247b09aee0f07b2384f6b967b354eff',
+  'catapult_revision': '8498332d304ed3c525591f1cf3cbd4f47869dc73',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
-  'libfuzzer_revision': 'a2d200e6a586f6e291572aafae08e49c71166a5a',
+  'libfuzzer_revision': 'a305a5eb85ed42edc5c965c14f308f576cb245ca',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-node-modules
   # and whatever else without interference from each other.
@@ -954,7 +954,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'ad59bc2906ca854f78db997792afd60eea8fe96a',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '09a2951f46c3fc8c5febe3920c249d848772117f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1106,7 +1106,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '6d2f3f4cb8bac1f7c4a945c73d07a33df74f22f9',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '6f68324adbf52b247e10b33a4e83a586e66cc6df',
+    Var('webrtc_git') + '/src.git' + '@' + '1c718f91de164290a2504ab6e9ba7a36aec0882e',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1137,7 +1137,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@50ebab8640aec4505b7fb38ff5e1d9b6dc9f882a',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4977a156c2fccf953ce6a451d275b7effa4443b1',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/apk/java/AndroidManifest.xml b/android_webview/apk/java/AndroidManifest.xml
index 1e60dc8..ff64d48c 100644
--- a/android_webview/apk/java/AndroidManifest.xml
+++ b/android_webview/apk/java/AndroidManifest.xml
@@ -7,10 +7,10 @@
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
-    package="{{manifest_package|default(package)|default('com.android.webview')}}"
+    package="{{manifest_package|default('com.android.webview')}}"
     tools:ignore="MissingLeanbackLauncher">
-    <uses-sdk android:minSdkVersion="{{min_sdk_version|default(minsdk)|default(21)}}"
-              android:targetSdkVersion="{{target_sdk_version|default(targetsdk)|default(28)}}">
+    <uses-sdk android:minSdkVersion="{{min_sdk_version|default(21)}}"
+              android:targetSdkVersion="{{target_sdk_version|default(28)}}">
     </uses-sdk>
 
     <uses-feature android:name="android.hardware.touchscreen"
@@ -22,7 +22,7 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 
     <application android:label="Android System WebView"
-                 android:icon="@{{manifest_package|default(package)|default('com.android.webview')}}:drawable/icon_webview"
+                 android:icon="@{{manifest_package|default('com.android.webview')}}:drawable/icon_webview"
                  android:name="{{ application_name|default('com.android.webview.chromium.WebViewApplication') }}"
                  android:multiArch="true"
                  android:use32bitAbi="true">
@@ -61,7 +61,7 @@
                          android:process=":webview_service" />
             {% endif %}
         {% endmacro %}
-        {{ common(manifest_package|default(package)|default('com.android.webview'), library|default('libwebviewchromium.so')) }}
+        {{ common(manifest_package|default('com.android.webview'), library|default('libwebviewchromium.so')) }}
         {% if donor_package is defined %}
             <meta-data android:name="com.android.webview.WebViewDonorPackage"
                        android:value="{{ donor_package }}" />
diff --git a/base/message_loop/message_loop_task_runner_unittest.cc b/base/message_loop/message_loop_task_runner_unittest.cc
index c7e9aa0..be7a7a87 100644
--- a/base/message_loop/message_loop_task_runner_unittest.cc
+++ b/base/message_loop/message_loop_task_runner_unittest.cc
@@ -200,8 +200,9 @@
   EXPECT_LT(task_delete_order, reply_delete_order);
 }
 
+// Flaky, see https://crbug.com/856900 for details.
 TEST_F(MessageLoopTaskRunnerTest,
-       PostTaskAndReply_DeadReplyTaskRunnerBehavior) {
+       DISABLED_PostTaskAndReply_DeadReplyTaskRunnerBehavior) {
   // Annotate the scope as having memory leaks to suppress heapchecker reports.
   ANNOTATE_SCOPED_MEMORY_LEAK;
   MessageLoop* task_run_on = nullptr;
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
index 4c8ca89..7b721d8 100644
--- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc
+++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -3281,6 +3281,22 @@
   test_executed.Wait();
 }
 
+TEST_P(SequenceManagerTest, TaskQueueTaskRunnerDetach) {
+  scoped_refptr<TestTaskQueue> queue1 = CreateTaskQueue();
+  EXPECT_TRUE(queue1->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask)));
+  queue1->ShutdownTaskQueue();
+  EXPECT_FALSE(queue1->task_runner()->PostTask(FROM_HERE, BindOnce(&NopTask)));
+
+  // Create without a sequence manager.
+  std::unique_ptr<TimeDomain> time_domain =
+      std::make_unique<internal::RealTimeDomain>();
+  std::unique_ptr<TaskQueueImpl> queue2 = std::make_unique<TaskQueueImpl>(
+      nullptr, time_domain.get(), TaskQueue::Spec("stub"));
+  scoped_refptr<SingleThreadTaskRunner> task_runner2 =
+      queue2->CreateTaskRunner(0);
+  EXPECT_FALSE(task_runner2->PostTask(FROM_HERE, BindOnce(&NopTask)));
+}
+
 TEST_P(SequenceManagerTest, DestructorPostChainDuringShutdown) {
   // Checks that a chain of closures which post other closures on destruction do
   // thing on shutdown.
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 94f30cf2..d3c5878d 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -55,6 +55,10 @@
       should_monitor_quiescence_(spec.should_monitor_quiescence),
       should_notify_observers_(spec.should_notify_observers) {
   DCHECK(time_domain);
+  // SequenceManager can't be set later, so we need to prevent task runners
+  // from posting any tasks.
+  if (!sequence_manager)
+    proxy_->DetachFromTaskQueueImpl();
 }
 
 TaskQueueImpl::~TaskQueueImpl() {
@@ -69,27 +73,6 @@
 #endif
 }
 
-TaskQueueImpl::PostTaskResult::PostTaskResult()
-    : success(false), task(OnceClosure(), Location()) {}
-
-TaskQueueImpl::PostTaskResult::PostTaskResult(bool success,
-                                              TaskQueue::PostedTask task)
-    : success(success), task(std::move(task)) {}
-
-TaskQueueImpl::PostTaskResult::PostTaskResult(PostTaskResult&& move_from)
-    : success(move_from.success), task(std::move(move_from.task)) {}
-
-TaskQueueImpl::PostTaskResult::~PostTaskResult() = default;
-
-TaskQueueImpl::PostTaskResult TaskQueueImpl::PostTaskResult::Success() {
-  return PostTaskResult(true, TaskQueue::PostedTask(OnceClosure(), Location()));
-}
-
-TaskQueueImpl::PostTaskResult TaskQueueImpl::PostTaskResult::Fail(
-    TaskQueue::PostedTask task) {
-  return PostTaskResult(false, std::move(task));
-}
-
 TaskQueueImpl::Task::Task(TaskQueue::PostedTask task,
                           TimeTicks desired_run_time,
                           EnqueueOrder sequence_number)
@@ -197,22 +180,23 @@
   return PlatformThread::CurrentId() == associated_thread_->thread_id;
 }
 
-TaskQueueImpl::PostTaskResult TaskQueueImpl::PostDelayedTask(
-    TaskQueue::PostedTask task) {
-  if (task.delay.is_zero())
-    return PostImmediateTaskImpl(std::move(task));
-
-  return PostDelayedTaskImpl(std::move(task));
+void TaskQueueImpl::PostTask(TaskQueue::PostedTask task) {
+  // This method can only be called if task queue is able to accept tasks,
+  // i.e. has a sequence manager and not being unregistered. This is enforced
+  // by |proxy_| which is detached if this condition not met.
+  if (task.delay.is_zero()) {
+    PostImmediateTaskImpl(std::move(task));
+  } else {
+    PostDelayedTaskImpl(std::move(task));
+  }
 }
 
-TaskQueueImpl::PostTaskResult TaskQueueImpl::PostImmediateTaskImpl(
-    TaskQueue::PostedTask task) {
+void TaskQueueImpl::PostImmediateTaskImpl(TaskQueue::PostedTask task) {
   // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
   // for details.
   CHECK(task.callback);
   AutoLock lock(any_thread_lock_);
-  if (!any_thread().sequence_manager)
-    return PostTaskResult::Fail(std::move(task));
+  DCHECK(any_thread().sequence_manager);
 
   EnqueueOrder sequence_number =
       any_thread().sequence_manager->GetNextSequenceNumber();
@@ -220,19 +204,16 @@
   PushOntoImmediateIncomingQueueLocked(Task(std::move(task),
                                             any_thread().time_domain->Now(),
                                             sequence_number, sequence_number));
-  return PostTaskResult::Success();
 }
 
-TaskQueueImpl::PostTaskResult TaskQueueImpl::PostDelayedTaskImpl(
-    TaskQueue::PostedTask task) {
+void TaskQueueImpl::PostDelayedTaskImpl(TaskQueue::PostedTask task) {
   // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
   // for details.
   CHECK(task.callback);
   DCHECK_GT(task.delay, TimeDelta());
   if (PlatformThread::CurrentId() == associated_thread_->thread_id) {
     // Lock-free fast path for delayed tasks posted from the main thread.
-    if (!main_thread_only().sequence_manager)
-      return PostTaskResult::Fail(std::move(task));
+    DCHECK(main_thread_only().sequence_manager);
 
     EnqueueOrder sequence_number =
         main_thread_only().sequence_manager->GetNextSequenceNumber();
@@ -248,8 +229,7 @@
     // because it causes two main thread tasks to be run.  Should this
     // assumption prove to be false in future, we may need to revisit this.
     AutoLock lock(any_thread_lock_);
-    if (!any_thread().sequence_manager)
-      return PostTaskResult::Fail(std::move(task));
+    DCHECK(any_thread().sequence_manager);
 
     EnqueueOrder sequence_number =
         any_thread().sequence_manager->GetNextSequenceNumber();
@@ -259,7 +239,6 @@
     PushOntoDelayedIncomingQueueLocked(
         Task(std::move(task), time_domain_delayed_run_time, sequence_number));
   }
-  return PostTaskResult::Success();
 }
 
 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread(
diff --git a/base/task/sequence_manager/task_queue_impl.h b/base/task/sequence_manager/task_queue_impl.h
index c0932630..27229b3 100644
--- a/base/task/sequence_manager/task_queue_impl.h
+++ b/base/task/sequence_manager/task_queue_impl.h
@@ -147,22 +147,6 @@
     EnqueueOrder enqueue_order_;
   };
 
-  // A result retuned by PostDelayedTask. When scheduler failed to post a task
-  // due to being shutdown a task is returned to be destroyed outside the lock.
-  struct PostTaskResult {
-    PostTaskResult();
-    PostTaskResult(bool success, TaskQueue::PostedTask task);
-    PostTaskResult(PostTaskResult&& move_from);
-    PostTaskResult(const PostTaskResult& copy_from) = delete;
-    ~PostTaskResult();
-
-    static PostTaskResult Success();
-    static PostTaskResult Fail(TaskQueue::PostedTask task);
-
-    bool success;
-    TaskQueue::PostedTask task;
-  };
-
   // Types of queues TaskQueueImpl is maintaining internally.
   enum class WorkQueueType { kImmediate, kDelayed };
 
@@ -188,7 +172,7 @@
   // TaskQueue implementation.
   const char* GetName() const;
   bool RunsTasksInCurrentSequence() const;
-  PostTaskResult PostDelayedTask(TaskQueue::PostedTask task);
+  void PostTask(TaskQueue::PostedTask task);
   // Require a reference to enclosing task queue for lifetime control.
   std::unique_ptr<TaskQueue::QueueEnabledVoter> CreateQueueEnabledVoter(
       scoped_refptr<TaskQueue> owning_task_queue);
@@ -376,8 +360,8 @@
     bool is_enabled_for_test;
   };
 
-  PostTaskResult PostImmediateTaskImpl(TaskQueue::PostedTask task);
-  PostTaskResult PostDelayedTaskImpl(TaskQueue::PostedTask task);
+  void PostImmediateTaskImpl(TaskQueue::PostedTask task);
+  void PostDelayedTaskImpl(TaskQueue::PostedTask task);
 
   // Push the task onto the |delayed_incoming_queue|. Lock-free main thread
   // only fast path.
diff --git a/base/task/sequence_manager/task_queue_proxy.cc b/base/task/sequence_manager/task_queue_proxy.cc
index 698d37013..4da4d1b 100644
--- a/base/task/sequence_manager/task_queue_proxy.cc
+++ b/base/task/sequence_manager/task_queue_proxy.cc
@@ -21,17 +21,13 @@
 TaskQueueProxy::~TaskQueueProxy() = default;
 
 bool TaskQueueProxy::PostTask(TaskQueue::PostedTask task) const {
+  // NOTE: Task's destructor might attempt to post another task,
+  // so ensure it never happens inside this lock.
   Optional<MoveableAutoLock> lock(AcquireLockIfNeeded());
   if (!task_queue_impl_)
     return false;
-
-  TaskQueueImpl::PostTaskResult result(
-      task_queue_impl_->PostDelayedTask(std::move(task)));
-  // If posting task was unsuccessful then |result| will contain
-  // the original task which should be destructed outside of the lock
-  // because new tasks may be posted in the destrictor.
-  lock = nullopt;
-  return result.success;
+  task_queue_impl_->PostTask(std::move(task));
+  return true;
 }
 
 bool TaskQueueProxy::RunsTasksInCurrentSequence() const {
@@ -46,9 +42,9 @@
 
 void TaskQueueProxy::DetachFromTaskQueueImpl() {
   DCHECK_CALLED_ON_VALID_THREAD(associated_thread_->thread_checker);
+  // |task_queue_impl_| can be read from the main thread without a lock,
+  // but a lock is needed when we write to it.
   AutoLock lock(lock_);
-  // Main thread is the only thread where |task_queue_impl_| is being read
-  // without a lock, which is fine because this function is main thread only.
   task_queue_impl_ = nullptr;
 }
 
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index a7d7f4ee..283e364 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -429,6 +429,8 @@
     test_hooks_->BeginMainFrame(args);
   }
 
+  void RecordEndOfFrameMetrics(base::TimeTicks) override {}
+
   void UpdateLayerTreeHost() override { test_hooks_->UpdateLayerTreeHost(); }
 
   void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
diff --git a/cc/test/stub_layer_tree_host_client.h b/cc/test/stub_layer_tree_host_client.h
index 57d56ffc..fa24c0fa 100644
--- a/cc/test/stub_layer_tree_host_client.h
+++ b/cc/test/stub_layer_tree_host_client.h
@@ -17,6 +17,7 @@
   void WillBeginMainFrame() override {}
   void DidBeginMainFrame() override {}
   void BeginMainFrame(const viz::BeginFrameArgs& args) override {}
+  void RecordEndOfFrameMetrics(base::TimeTicks) override {}
   void BeginMainFrameNotExpectedSoon() override {}
   void BeginMainFrameNotExpectedUntil(base::TimeTicks time) override {}
   void UpdateLayerTreeHost() override {}
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 716021c..a18aa62 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -945,6 +945,10 @@
   RecordWheelAndTouchScrollingCount(*info);
 }
 
+void LayerTreeHost::RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {
+  client_->RecordEndOfFrameMetrics(frame_begin_time);
+}
+
 const base::WeakPtr<InputHandler>& LayerTreeHost::GetInputHandler()
     const {
   return input_handler_weak_ptr_;
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 3531699..d2cd6ed 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -536,6 +536,7 @@
   // Called when the compositor completed page scale animation.
   void DidCompletePageScaleAnimation();
   void ApplyScrollAndScale(ScrollAndScaleSet* info);
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time);
 
   LayerTreeHostClient* client() { return client_; }
 
diff --git a/cc/trees/layer_tree_host_client.h b/cc/trees/layer_tree_host_client.h
index 8950d17b..302521d 100644
--- a/cc/trees/layer_tree_host_client.h
+++ b/cc/trees/layer_tree_host_client.h
@@ -89,6 +89,9 @@
   virtual void DidPresentCompositorFrame(
       uint32_t frame_token,
       const gfx::PresentationFeedback& feedback) = 0;
+  // Record UMA and UKM metrics that require the time from the start of
+  // BeginMainFrame to the Commit, or early out.
+  virtual void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) = 0;
 
  protected:
   virtual ~LayerTreeHostClient() {}
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc
index c84c480f..c89bd779 100644
--- a/cc/trees/proxy_main.cc
+++ b/cc/trees/proxy_main.cc
@@ -228,6 +228,7 @@
   if (skip_commit) {
     TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit_InsideBeginMainFrame",
                          TRACE_EVENT_SCOPE_THREAD);
+    layer_tree_host_->RecordEndOfFrameMetrics(begin_main_frame_start_time);
     std::vector<std::unique_ptr<SwapPromise>> empty_swap_promises;
     ImplThreadTaskRunner()->PostTask(
         FROM_HERE, base::BindOnce(&ProxyImpl::BeginMainFrameAbortedOnImpl,
@@ -274,6 +275,7 @@
   current_pipeline_stage_ = COMMIT_PIPELINE_STAGE;
   if (final_pipeline_stage_ < COMMIT_PIPELINE_STAGE) {
     TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoUpdates", TRACE_EVENT_SCOPE_THREAD);
+    layer_tree_host_->RecordEndOfFrameMetrics(begin_main_frame_start_time);
     std::vector<std::unique_ptr<SwapPromise>> swap_promises =
         layer_tree_host_->GetSwapPromiseManager()->TakeSwapPromises();
     ImplThreadTaskRunner()->PostTask(
@@ -308,6 +310,7 @@
   // coordinated by the Scheduler.
   {
     TRACE_EVENT0("cc", "ProxyMain::BeginMainFrame::commit");
+    layer_tree_host_->RecordEndOfFrameMetrics(begin_main_frame_start_time);
 
     DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
index f3583f0..a91000d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java
@@ -11,7 +11,6 @@
 import android.support.annotation.NonNull;
 import android.support.customtabs.CustomTabsService;
 import android.support.customtabs.CustomTabsService.Relation;
-import android.support.v4.util.Pair;
 import android.text.TextUtils;
 
 import org.chromium.base.CommandLine;
@@ -26,7 +25,6 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.IntentHandler;
 import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.content_public.browser.BrowserStartupController;
 
@@ -38,12 +36,7 @@
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * Used to verify postMessage origin for a designated package name.
@@ -62,7 +55,6 @@
     private static final String USE_AS_ORIGIN = "delegate_permission/common.use_as_origin";
     private static final String HANDLE_ALL_URLS = "delegate_permission/common.handle_all_urls";
 
-    private static Map<Pair<String, Integer>, Set<Origin>> sPackageToCachedOrigins;
     private final OriginVerificationListener mListener;
     private final String mPackageName;
     private final String mSignatureFingerprint;
@@ -95,8 +87,7 @@
     /** Clears all known relations. */
     @VisibleForTesting
     public static void clearCachedVerificationsForTesting() {
-        ThreadUtils.assertOnUiThread();
-        if (sPackageToCachedOrigins != null) sPackageToCachedOrigins.clear();
+        VerificationResultStore.clearStoredRelationships();
     }
 
     /**
@@ -108,15 +99,7 @@
     public static void addVerifiedOriginForPackage(
             String packageName, Origin origin, @Relation int relation) {
         Log.d(TAG, "Adding: %s for %s", packageName, origin);
-        ThreadUtils.assertOnUiThread();
-        if (sPackageToCachedOrigins == null) sPackageToCachedOrigins = new HashMap<>();
-        Set<Origin> cachedOrigins =
-                sPackageToCachedOrigins.get(new Pair<>(packageName, relation));
-        if (cachedOrigins == null) {
-            cachedOrigins = new HashSet<>();
-            sPackageToCachedOrigins.put(new Pair<>(packageName, relation), cachedOrigins);
-        }
-        cachedOrigins.add(origin);
+        VerificationResultStore.addRelationship(new Relationship(packageName, origin, relation));
 
         TrustedWebActivityClient.registerClient(ContextUtils.getApplicationContext(),
                 origin, packageName);
@@ -133,11 +116,8 @@
      * @param relation The Digital Asset Links relation to verify for.
      */
     public static boolean isValidOrigin(String packageName, Origin origin, @Relation int relation) {
-        ThreadUtils.assertOnUiThread();
-        if (sPackageToCachedOrigins == null) return false;
-        Set<Origin> cachedOrigins = sPackageToCachedOrigins.get(new Pair<>(packageName, relation));
-        if (cachedOrigins == null) return false;
-        return cachedOrigins.contains(origin);
+        return VerificationResultStore.isRelationshipSaved(
+                new Relationship(packageName, origin, relation));
     }
 
     /**
@@ -351,28 +331,21 @@
      * Saves the result of a verification to Preferences so we can reuse it when offline.
      */
     private void saveVerificationResult(boolean originVerified) {
-        String link = relationshipToString(mPackageName, mOrigin, mRelation);
-        Set<String> savedLinks;
-        try (StrictModeContext unused = StrictModeContext.allowDiskReads()) {
-            savedLinks = ChromePreferenceManager.getInstance().getVerifiedDigitalAssetLinks();
-        }
+        Relationship relationship = new Relationship(mPackageName, mOrigin, mRelation);
         if (originVerified) {
-            savedLinks.add(link);
+            VerificationResultStore.addRelationship(relationship);
         } else {
-            savedLinks.remove(link);
+            VerificationResultStore.removeRelationship(relationship);
         }
-        ChromePreferenceManager.getInstance().setVerifiedDigitalAssetLinks(savedLinks);
     }
 
     /**
      * Checks for a previously saved verification result.
      */
     private void checkForSavedResult() {
-        String link = relationshipToString(mPackageName, mOrigin, mRelation);
         try (StrictModeContext unused = StrictModeContext.allowDiskReads()) {
-            Set<String> savedLinks =
-                    ChromePreferenceManager.getInstance().getVerifiedDigitalAssetLinks();
-            boolean verified = savedLinks.contains(link);
+            boolean verified = VerificationResultStore.isRelationshipSaved(
+                    new Relationship(mPackageName, mOrigin, mRelation));
 
             BrowserServicesMetrics.recordVerificationResult(verified
                             ? BrowserServicesMetrics.VerificationResult.OFFLINE_SUCCESS
@@ -382,19 +355,13 @@
         }
     }
 
-    private static String relationshipToString(String packageName, Origin origin, int relation) {
-        // Neither package names nor origins contain commas.
-        return packageName + "," + origin + "," + relation;
-    }
-
     /**
      * Removes any data about sites visited from static variables and Android Preferences.
      */
     @CalledByNative
     public static void clearBrowsingData() {
-        ThreadUtils.assertOnUiThread();
-        if (sPackageToCachedOrigins != null) sPackageToCachedOrigins.clear();
-        ChromePreferenceManager.getInstance().setVerifiedDigitalAssetLinks(Collections.emptySet());
+        // TODO(peconn): Move this over to VerificationResultStore.
+        VerificationResultStore.clearStoredRelationships();
     }
 
     private native long nativeInit(Profile profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/Relationship.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/Relationship.java
new file mode 100644
index 0000000..d713bc2
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/Relationship.java
@@ -0,0 +1,33 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.browserservices;
+
+/**
+ * This is a plain-old-data class to store a Digital Asset Link relationship [1].
+ *
+ * [1] https://developers.google.com/digital-asset-links/v1/getting-started
+ */
+public class Relationship {
+    public final String packageName;
+    public final Origin origin;
+    public final int relation;
+
+    /** Creates a {@link Relationship} to hold relationship details. */
+    public Relationship(String packageName, Origin origin, int relation) {
+        this.packageName = packageName;
+        this.origin = origin;
+        this.relation = relation;
+    }
+
+    /**
+     * Serializes the Relationship to a String. This is used when storing relationships in
+     * AndroidPreferences, so needs to be stable.
+     */
+    @Override
+    public String toString() {
+        // Neither package names nor origins contain commas.
+        return packageName + "," + origin + "," + relation;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/VerificationResultStore.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/VerificationResultStore.java
new file mode 100644
index 0000000..29a9523b
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/VerificationResultStore.java
@@ -0,0 +1,54 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.browserservices;
+
+import org.chromium.base.StrictModeContext;
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Stores the results of Digital Asset Link verifications performed by {@link OriginVerifier}.
+ *
+ * Lifecycle: This is a utility class with static methods, it won't be instantiated.
+ * Thread safety: Methods can be called on any thread.
+ */
+public class VerificationResultStore {
+    /* package */ static void addRelationship(Relationship relationship) {
+        Set<String> savedLinks = getRelationships();
+        savedLinks.add(relationship.toString());
+        setRelationships(savedLinks);
+    }
+
+    /* package */ static void removeRelationship(Relationship relationship) {
+        Set<String> savedLinks = getRelationships();
+        savedLinks.remove(relationship.toString());
+        setRelationships(savedLinks);
+    }
+
+    /* package */ static boolean isRelationshipSaved(Relationship relationship) {
+        return getRelationships().contains(relationship.toString());
+    }
+
+    /* package */ static void clearStoredRelationships() {
+        ThreadUtils.assertOnUiThread();
+        setRelationships(Collections.emptySet());
+    }
+
+    private static Set<String> getRelationships() {
+        // In case we're called on the UI thread and Preferences haven't been read before.
+        try (StrictModeContext unused = StrictModeContext.allowDiskReads()) {
+            return ChromePreferenceManager.getInstance().getVerifiedDigitalAssetLinks();
+        }
+    }
+
+    private static void setRelationships(Set<String> relationships) {
+        ChromePreferenceManager.getInstance().setVerifiedDigitalAssetLinks(relationships);
+    }
+
+    private VerificationResultStore() {}
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java
index bc58f2f..d492de7c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactDetails.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.contacts_picker;
 
-import android.graphics.Bitmap;
 import android.support.annotation.Nullable;
 import android.util.JsonWriter;
 
@@ -28,26 +27,19 @@
     // The list of phone numbers registered for this contact.
     private List<String> mPhoneNumbers;
 
-    // The image associated with this contact.
-    private Bitmap mBitmap;
-
     /**
      * The ContactDetails constructor.
      * @param id The unique identifier of this contact.
      * @param displayName The display name of this contact.
      * @param emails The emails registered for this contact.
      * @param phoneNumbers The phone numbers registered for this contact.
-     * @param bitmap The image associated with this contact.
      */
-    public ContactDetails(String id, String displayName, List<String> emails,
-            List<String> phoneNumbers, Bitmap bitmap) {
+    public ContactDetails(
+            String id, String displayName, List<String> emails, List<String> phoneNumbers) {
         mDisplayName = displayName;
         mEmails = emails;
         mPhoneNumbers = phoneNumbers;
         mId = id;
-        // TODO(finnur): Investigate LRU caching for bitmaps.
-        // TODO(finnur): Investigate a changed approach for handling bitmaps.
-        mBitmap = bitmap;
     }
 
     /**
@@ -59,11 +51,11 @@
     }
 
     /**
-     * Accessor for the contact image.
-     * @return The image as bitmap.
+     * Accessor for the ID.
+     * @return The ID of the contact.
      */
-    public Bitmap getContactImage() {
-        return mBitmap;
+    public String getId() {
+        return mId;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java
index 95f8f45..b90fb356 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java
@@ -26,6 +26,9 @@
  * A container class for a view showing a contact in the Contacts Picker.
  */
 public class ContactView extends SelectableItemView<ContactDetails> {
+    // The length of the fade in animation (in ms).
+    private static final int IMAGE_FADE_IN_DURATION = 150;
+
     // Our context.
     private Context mContext;
 
@@ -116,8 +119,9 @@
      * Completes the initialization of the ContactView. Must be called before the
      * {@link ContactView} can respond to click events.
      * @param contactDetails The details about the contact represented by this ContactView.
+     * @param bitmap The icon to show for the contact (or null if not loaded yet).
      */
-    public void initialize(ContactDetails contactDetails) {
+    public void initialize(ContactDetails contactDetails, Bitmap icon) {
         resetTile();
 
         mContactDetails = contactDetails;
@@ -126,7 +130,6 @@
         String displayName = contactDetails.getDisplayName();
         mDisplayName.setText(displayName);
         mDetailsView.setText(contactDetails.getContactDetailsAsString());
-        Bitmap icon = contactDetails.getContactImage();
         if (icon == null) {
             icon = mCategoryView.getIconGenerator().generateIconForText(
                     contactDetails.getDisplayNameAbbreviation(), 2);
@@ -142,6 +145,16 @@
     }
 
     /**
+     * Sets the icon to display for the contact and fade it into view.
+     * @param icon The icon to display.
+     */
+    public void setIconBitmap(Bitmap icon) {
+        mImage.setImageBitmap(icon);
+        mImage.setAlpha(0.0f);
+        mImage.animate().alpha(1.0f).setDuration(IMAGE_FADE_IN_DURATION).start();
+    }
+
+    /**
      * Resets the view to its starting state, which is necessary when the view is about to be
      * re-used.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactViewHolder.java
new file mode 100644
index 0000000..c0d733e
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ContactViewHolder.java
@@ -0,0 +1,84 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.contacts_picker;
+
+import android.content.ContentResolver;
+import android.graphics.Bitmap;
+import android.support.v7.widget.RecyclerView.ViewHolder;
+
+import org.chromium.base.task.AsyncTask;
+
+/**
+ * Holds on to a {@link ContactView} that displays information about a contact.
+ */
+public class ContactViewHolder
+        extends ViewHolder implements FetchIconWorkerTask.IconRetrievedCallback {
+    // Our parent category.
+    private final PickerCategoryView mCategoryView;
+
+    // The Content Resolver to use for the lookup.
+    private final ContentResolver mContentResolver;
+
+    // The contact view we are holding on to.
+    private final ContactView mItemView;
+
+    // The details for the contact.
+    private ContactDetails mContact;
+
+    // A worker task for asynchronously retrieving icons off the main thread.
+    private FetchIconWorkerTask mWorkerTask;
+
+    /**
+     * The PickerBitmapViewHolder.
+     * @param itemView The {@link ContactView} for the contact.
+     * @param categoryView The {@link CategoryView} showing the contacts.
+     * @param contentResolver The {@link ContentResolver} to use for the lookup.
+     */
+    public ContactViewHolder(ContactView itemView, PickerCategoryView categoryView,
+            ContentResolver contentResolver) {
+        super(itemView);
+        mCategoryView = categoryView;
+        mContentResolver = contentResolver;
+        mItemView = itemView;
+    }
+
+    /**
+     * Sets the contact details to show in the itemview. If the image is not found in the cache,
+     * an asynchronous worker task is created to load it.
+     * @param contact The contact details to show.
+     */
+    public void setContactDetails(ContactDetails contact) {
+        mContact = contact;
+
+        Bitmap icon = mCategoryView.getIconCache().getBitmap(mContact.getId());
+        if (icon == null) {
+            mWorkerTask = new FetchIconWorkerTask(mContact.getId(), mContentResolver, this);
+            mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        }
+        mItemView.initialize(contact, icon);
+    }
+
+    /**
+     * Cancels the worker task to retrieve the icon.
+     */
+    public void cancelIconRetrieval() {
+        mWorkerTask.cancel(true);
+        mWorkerTask = null;
+    }
+
+    // FetchIconWorkerTask.IconRetrievedCallback:
+
+    @Override
+    public void iconRetrieved(Bitmap icon, String contactId) {
+        if (icon == null) return;
+        if (!contactId.equals(mContact.getId())) return;
+
+        if (mCategoryView.getIconCache().getBitmap(contactId) == null) {
+            mCategoryView.getIconCache().putBitmap(contactId, icon);
+        }
+
+        mItemView.setIconBitmap(icon);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/FetchIconWorkerTask.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/FetchIconWorkerTask.java
new file mode 100644
index 0000000..6137892
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/FetchIconWorkerTask.java
@@ -0,0 +1,101 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.contacts_picker;
+
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.provider.ContactsContract;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.task.AsyncTask;
+
+import java.io.ByteArrayInputStream;
+
+/**
+ * A worker task to retrieve images for contacts.
+ */
+class FetchIconWorkerTask extends AsyncTask<Bitmap> {
+    /**
+     * An interface to use to communicate back the results to the client.
+     */
+    public interface IconRetrievedCallback {
+        /**
+         * A callback to define to receive the icon for a contact.
+         * @param icon The icon retrieved.
+         * @param contactId The id of the contact the icon refers to.
+         */
+        void iconRetrieved(Bitmap icon, String contactId);
+    }
+
+    // The ID of the contact to look up.
+    private String mContactId;
+
+    // The content resolver to use for looking up
+    private ContentResolver mContentResolver;
+
+    // The callback to use to communicate the results.
+    private IconRetrievedCallback mCallback;
+
+    /**
+     * A FetchIconWorkerTask constructor.
+     * @param id The id of the contact to look up.
+     * @param contentResolver The ContentResolver to use for the lookup.
+     * @param callback The callback to use to communicate back the results.
+     */
+    public FetchIconWorkerTask(
+            String id, ContentResolver contentResolver, IconRetrievedCallback callback) {
+        mContactId = id;
+        mContentResolver = contentResolver;
+        mCallback = callback;
+    }
+
+    /**
+     * Fetches the icon of a particular contact (in a background thread).
+     * @return The icon representing a contact (returned as Bitmap).
+     */
+    @Override
+    protected Bitmap doInBackground() {
+        assert !ThreadUtils.runningOnUiThread();
+
+        if (isCancelled()) return null;
+
+        Uri contactUri = ContentUris.withAppendedId(
+                ContactsContract.Contacts.CONTENT_URI, Long.parseLong(mContactId));
+        Uri photoUri =
+                Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
+        Cursor cursor = mContentResolver.query(
+                photoUri, new String[] {ContactsContract.Contacts.Photo.PHOTO}, null, null, null);
+        if (cursor == null) return null;
+        try {
+            if (cursor.moveToFirst()) {
+                byte[] data = cursor.getBlob(0);
+                if (data != null) {
+                    // TODO(finnur): Before launching, verify images have already been re-encoded.
+                    return BitmapFactory.decodeStream(new ByteArrayInputStream(data));
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+        return null;
+    }
+
+    /**
+     * Communicates the results back to the client. Called on the UI thread.
+     * @param icon The icon retrieved.
+     */
+    @Override
+    protected void onPostExecute(Bitmap icon) {
+        assert ThreadUtils.runningOnUiThread();
+
+        if (isCancelled()) return;
+
+        mCallback.iconRetrieved(icon, mContactId);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java
index 4e1a66ab..6875e5e3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java
@@ -10,7 +10,6 @@
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.support.v7.widget.RecyclerView.Adapter;
-import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 
@@ -24,7 +23,7 @@
 /**
  * A data adapter for the Contacts Picker.
  */
-public class PickerAdapter extends Adapter<ViewHolder> {
+public class PickerAdapter extends Adapter<ContactViewHolder> {
     // The category view to use to show the contacts.
     private PickerCategoryView mCategoryView;
 
@@ -37,19 +36,6 @@
     // A list of search result indices into the larger data set.
     private ArrayList<Integer> mSearchResults;
 
-    /**
-     * Holds on to a {@link ContactView} that displays information about a contact.
-     */
-    public class ContactViewHolder extends ViewHolder {
-        /**
-         * The ContactViewHolder.
-         * @param itemView The {@link ContactView} view for showing the contact details.
-         */
-        public ContactViewHolder(ContactView itemView) {
-            super(itemView);
-        }
-    }
-
     private static final String[] PROJECTION = {
             ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY,
             ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
@@ -122,7 +108,7 @@
             String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
             String name = cursor.getString(
                     cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
-            contacts.add(new ContactDetails(id, name, emailMap.get(id), phoneMap.get(id), null));
+            contacts.add(new ContactDetails(id, name, emailMap.get(id), phoneMap.get(id)));
         } while (cursor.moveToNext());
 
         cursor.close();
@@ -132,15 +118,15 @@
     // RecyclerView.Adapter:
 
     @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+    public ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         ContactView itemView = (ContactView) LayoutInflater.from(parent.getContext())
                                        .inflate(R.layout.contact_view, parent, false);
         itemView.setCategoryView(mCategoryView);
-        return new ContactViewHolder(itemView);
+        return new ContactViewHolder(itemView, mCategoryView, mContentResolver);
     }
 
     @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
+    public void onBindViewHolder(ContactViewHolder holder, int position) {
         ContactDetails contact;
         if (mSearchResults == null) {
             contact = mContactDetails.get(position);
@@ -148,7 +134,8 @@
             Integer index = mSearchResults.get(position);
             contact = mContactDetails.get(index);
         }
-        ((ContactView) holder.itemView).initialize(contact);
+
+        holder.setContactDetails(contact);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java
index 1acc872..d3abaad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java
@@ -18,6 +18,9 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.BitmapCache;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.util.ConversionUtils;
 import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
 import org.chromium.chrome.browser.widget.selection.SelectableListToolbar;
@@ -37,9 +40,10 @@
  * A class for keeping track of common data associated with showing contact details in
  * the contacts picker, for example the RecyclerView.
  */
-public class PickerCategoryView extends RelativeLayout
-        implements View.OnClickListener, SelectionDelegate.SelectionObserver<ContactDetails>,
-                   SelectableListToolbar.SearchDelegate {
+public class PickerCategoryView
+        extends RelativeLayout implements View.OnClickListener, RecyclerView.RecyclerListener,
+                                          SelectionDelegate.SelectionObserver<ContactDetails>,
+                                          SelectableListToolbar.SearchDelegate {
     // Constants for the RoundedIconGenerator.
     private static final int ICON_SIZE_DP = 32;
     private static final int ICON_CORNER_RADIUS_DP = 20;
@@ -51,6 +55,9 @@
     // The view containing the RecyclerView and the toolbar, etc.
     private SelectableListLayout<ContactDetails> mSelectableListLayout;
 
+    // Our activity.
+    private ChromeActivity mActivity;
+
     // The callback to notify the listener of decisions reached in the picker.
     private ContactsPickerListener mListener;
 
@@ -72,6 +79,9 @@
     // The {@link SelectionDelegate} keeping track of which contacts are selected.
     private SelectionDelegate<ContactDetails> mSelectionDelegate;
 
+    // A cache for contact images, lazily created.
+    private BitmapCache mBitmapCache;
+
     // The search icon.
     private ImageView mSearchButton;
 
@@ -106,6 +116,7 @@
     public PickerCategoryView(Context context, boolean multiSelectionAllowed) {
         super(context);
 
+        mActivity = (ChromeActivity) context;
         mMultiSelectionAllowed = multiSelectionAllowed;
 
         mSelectionDelegate = new SelectionDelegate<ContactDetails>();
@@ -151,6 +162,13 @@
         mLayoutManager = new LinearLayoutManager(context);
         mRecyclerView.setHasFixedSize(true);
         mRecyclerView.setLayoutManager(mLayoutManager);
+
+        // Each image (on a Pixel 2 phone) is about 30-40K. Calculate a proportional amount of the
+        // available memory, but cap it at 5MB.
+        final long maxMemory = ConversionUtils.bytesToKilobytes(Runtime.getRuntime().maxMemory());
+        int iconCacheSizeKb = (int) (maxMemory / 8); // 1/8th of the available memory.
+        mBitmapCache = new BitmapCache(mActivity.getChromeApplication().getReferencePool(),
+                Math.min(iconCacheSizeKb, 5 * ConversionUtils.BYTES_PER_MEGABYTE));
     }
 
     /**
@@ -237,6 +255,14 @@
                         : GONE);
     }
 
+    // RecyclerView.RecyclerListener:
+
+    @Override
+    public void onViewRecycled(RecyclerView.ViewHolder holder) {
+        ContactViewHolder bitmapHolder = (ContactViewHolder) holder;
+        bitmapHolder.cancelIconRetrieval();
+    }
+
     // OnClickListener:
 
     @Override
@@ -275,6 +301,10 @@
         return mIconGenerator;
     }
 
+    public BitmapCache getIconCache() {
+        return mBitmapCache;
+    }
+
     /**
      * Notifies any listeners that one or more contacts have been selected.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
index 8a15338..f057bb3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -37,6 +37,7 @@
 import org.chromium.chrome.browser.ntp.NewTabPage.OnSearchBoxScrollListener;
 import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.suggestions.SiteSection;
 import org.chromium.chrome.browser.suggestions.SiteSectionViewHolder;
@@ -289,6 +290,9 @@
         SiteSuggestion data = getTileGroup().getHomepageTileData();
         if (data == null) return;
 
+        // Only show the IPH bubble for users with a customized homepage.
+        if (HomepageManager.getInstance().getPrefHomepageUseDefaultUri()) return;
+
         final Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile());
         if (!tracker.shouldTriggerHelpUI(FeatureConstants.HOMEPAGE_TILE_FEATURE)) return;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java
index 974c574f..14163eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/snackbar/Snackbar.java
@@ -255,4 +255,8 @@
     boolean isTypePersistent() {
         return mType == TYPE_PERSISTENT;
     }
+
+    /** So tests can trigger a press on a Snackbar. */
+    @VisibleForTesting
+    public Object getActionDataForTesting() { return mActionData; }
 }
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 23ab067..6233b44 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -163,11 +163,13 @@
   "java/src/org/chromium/chrome/browser/browserservices/Origin.java",
   "java/src/org/chromium/chrome/browser/browserservices/OriginVerifier.java",
   "java/src/org/chromium/chrome/browser/browserservices/PostMessageHandler.java",
+  "java/src/org/chromium/chrome/browser/browserservices/Relationship.java",
   "java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java",
   "java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityDisclosure.java",
-  "java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUi.java",
   "java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityOpenTimeRecorder.java",
+  "java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUi.java",
   "java/src/org/chromium/chrome/browser/browserservices/UkmRecorder.java",
+  "java/src/org/chromium/chrome/browser/browserservices/VerificationResultStore.java",
   "java/src/org/chromium/chrome/browser/browsing_data/UrlFilters.java",
   "java/src/org/chromium/chrome/browser/childaccounts/ChildAccountFeedbackReporter.java",
   "java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java",
@@ -269,6 +271,8 @@
   "java/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerDialog.java",
   "java/src/org/chromium/chrome/browser/contacts_picker/ContactsPickerToolbar.java",
   "java/src/org/chromium/chrome/browser/contacts_picker/ContactView.java",
+  "java/src/org/chromium/chrome/browser/contacts_picker/ContactViewHolder.java",
+  "java/src/org/chromium/chrome/browser/contacts_picker/FetchIconWorkerTask.java",
   "java/src/org/chromium/chrome/browser/contacts_picker/PickerAdapter.java",
   "java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java",
   "java/src/org/chromium/chrome/browser/content/ContentUtils.java",
@@ -2183,6 +2187,7 @@
   "junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetControllerTest.java",
   "junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java",
   "junit/src/org/chromium/chrome/browser/browseractions/BrowserActionsIntentTest.java",
+  "junit/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityDisclosureTest.java",
   "junit/src/org/chromium/chrome/browser/compositor/animation/CompositorAnimatorTest.java",
   "junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java",
   "junit/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImplTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
index c4089e9c..fa1d835 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -285,6 +285,7 @@
      */
     @Test
     @SmallTest
+    @DisabledTest(message = "https://crbug.com/888129")
     @Feature({"NewTabPage", "FeedNewTabPage"})
     @ParameterAnnotations.UseMethodParameter(InterestFeedParams.class)
     public void testFocusFakebox(boolean interestFeedEnabled) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityDisclosureTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityDisclosureTest.java
new file mode 100644
index 0000000..f0cb0ffd
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityDisclosureTest.java
@@ -0,0 +1,115 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.browserservices;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.res.Resources;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
+import org.chromium.chrome.browser.snackbar.Snackbar;
+import org.chromium.chrome.browser.snackbar.SnackbarManager;
+
+/**
+ * Tests for {@link TrustedWebActivityDisclosure}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class TrustedWebActivityDisclosureTest {
+    private static final String TWA_PACKAGE = "com.example.twa";
+
+    @Mock public Resources mResources;
+    @Mock public ChromePreferenceManager mPreferences;
+    @Mock public SnackbarManager mSnackbarManager;
+
+    private TrustedWebActivityDisclosure mDisclosure;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        doReturn("any string").when(mResources).getString(anyInt());
+        doReturn(false).when(mPreferences).hasUserAcceptedTwaDisclosureForPackage(anyString());
+
+        mDisclosure = new TrustedWebActivityDisclosure(mResources, mPreferences);
+    }
+
+    @Test
+    @Feature("TrustedWebActivities")
+    public void showIsIdempotent() {
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+
+        verify(mSnackbarManager).showSnackbar(any());
+    }
+
+    @Test
+    @Feature("TrustedWebActivities")
+    public void hideIsIdempotent() {
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+
+        mDisclosure.dismissSnackbarIfNeeded(mSnackbarManager);
+        mDisclosure.dismissSnackbarIfNeeded(mSnackbarManager);
+
+        verify(mSnackbarManager).dismissSnackbars(any());
+    }
+
+    @Test
+    @Feature("TrustedWebActivities")
+    public void noShowIfAlreadyAccepted() {
+        doReturn(true).when(mPreferences).hasUserAcceptedTwaDisclosureForPackage(anyString());
+
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+
+        verify(mSnackbarManager, times(0)).showSnackbar(any());
+    }
+
+    @Test
+    @Feature("TrustedWebActivities")
+    public void recordDismiss() {
+        ArgumentCaptor<Snackbar> snackbarCaptor = ArgumentCaptor.forClass(Snackbar.class);
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+
+        verify(mSnackbarManager).showSnackbar(snackbarCaptor.capture());
+
+        // Dismiss the Snackbar.
+        // TODO(peconn): Refactor Snackbar to make this a bit cleaner.
+        snackbarCaptor.getValue().getController().onAction(
+                snackbarCaptor.getValue().getActionDataForTesting());
+
+        verify(mPreferences).setUserAcceptedTwaDisclosureForPackage(TWA_PACKAGE);
+    }
+
+    @Test
+    @Feature("TrustedWebActivities")
+    public void doNothingOnNoSnackbarAction() {
+        ArgumentCaptor<Snackbar> snackbarCaptor = ArgumentCaptor.forClass(Snackbar.class);
+        mDisclosure.showSnackbarIfNeeded(mSnackbarManager, TWA_PACKAGE);
+
+        verify(mSnackbarManager).showSnackbar(snackbarCaptor.capture());
+
+        // Dismiss the Snackbar.
+        // TODO(peconn): Refactor Snackbar to make this a bit cleaner.
+        snackbarCaptor.getValue().getController().onDismissNoAction(
+                snackbarCaptor.getValue().getActionDataForTesting());
+
+        verify(mPreferences, times(0)).setUserAcceptedTwaDisclosureForPackage(anyString());
+    }
+}
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index aee74e1..338a1c8 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3017,17 +3017,17 @@
   <message name="IDS_AD_MORE_OPTIONS_BUTTON" desc="Admin-facing. Text on the 'More options' button on the Active Directory domain join screen.">
     More options
   </message>
-  <message name="IDS_AD_UNLOCK_CONFIG" desc="Admin-facing. Text on the button which opens 'Enter unlocking password' dialog on the Active Directory domain join screen.">
-    Unlock configuration
+  <message name="IDS_AD_UNLOCK_TITLE_MESSAGE" desc="Admin-facing. Title on the configuration password step on the Active Directory domain join screen.">
+    Get configuration info
   </message>
-  <message name="IDS_AD_UNLOCK_CONFIG_UNLOCK_BUTTON" desc="Admin-facing. Text on the button to use entered password to unlock domain join configuration.">
-    Unlock
+  <message name="IDS_AD_UNLOCK_SUBTITLE_MESSAGE" desc="Admin-facing. Subtitle on the configuration password step on the Active Directory domain join screen.">
+    Enter admin-provided password to get configuration info
   </message>
   <message name="IDS_AD_UNLOCK_CONFIG_PASSWORD" desc="Admin-facing. Label for unlocking password input field on the Active Directory domain join screen.">
-    Password to unlock
+    Enter admin-provided password
   </message>
   <message name="IDS_AD_UNLOCK_INCORRECT_PASSWORD" desc="Admin-facing. Error that is shown when incorrect unlocking password was entered.">
-    Incorrect password
+    Wrong password, try again
   </message>
   <message name="IDS_AD_UNLOCK_PASSWORD_SKIP" desc="Admin-facing. Text on the button which skips entering unlocking password step.">
     Skip
@@ -3071,8 +3071,8 @@
   <message name="IDS_AD_DEVICE_NAME_TOO_LONG" desc="Admin-facing alert message. Admin entered a device name that was too long.">
     The device name is too long. Enter a shorter name to try again.
   </message>
-  <message name="IDS_AD_DEVICE_NAME_DOESNT_MATCH_REGEX" desc="Admin-facing. Alert message about device name does not match regular expression">
-    The device name must match regular expression <ph name="REGEX">$1<ex>^DEVICE_\d+$</ex></ph>.
+  <message name="IDS_AD_DEVICE_NAME_INVALID_FORMAT" desc="Admin-facing. Alert message about device name does not match regular expression">
+    Incorrect format, please try again
   </message>
   <message name="IDS_AD_USER_DENIED_TO_JOIN_DEVICE" desc="Admin-facing alert message. Admin doesn’t have privileges to add devices to the domain. 'Devices' refers to Chromebook computers. 'Domain' is the Windows domain that accounts are registered to.">
     Can't join the domain. Check your account to see if you have sufficient privileges to add devices.
@@ -3099,9 +3099,6 @@
   <message name="IDS_AD_DOMAIN_AUTH_WELCOME_MESSAGE" desc="Welcome message on the Active Directory Authentication user screen. Include the domain (realm) the device joined to.">
     Sign in to <ph name="REALM">$1<ex>example.com</ex></ph>
   </message>
-  <message name="IDS_AD_ENROLLMENT_LOGIN_USER" desc="Label for userPrincipalName input field on the Active Directory domain join user screen. Looks like user@example.com where example.com is the realm.">
-    Username (e.g. user@example.com)
-  </message>
   <message name="IDS_AD_AUTH_LOGIN_USER" desc="Label for userPrincipalName input field on the Active Directory authentication user screen.">
     Username
   </message>
@@ -3132,8 +3129,8 @@
   <message name="IDS_AD_PASSWORD_CHANGE_PASSWORDS_MISMATCH_ERROR" desc="Error message in case new password fields does not match on the Active Directory password change dialog.">
     Passwords do not match.
   </message>
-  <message name="IDS_AD_CONFIRM_BUTTON" desc="Text on the 'Confirm' button on the 'More options' dialog.">
-    Confirm
+  <message name="IDS_AD_SAVE_BUTTON" desc="Text on the 'Save' button on the 'More options' dialog.">
+    Save
   </message>
   <message name="IDS_AD_CANCEL_BUTTON" desc="Text on the 'Cancel' button on the 'More options' dialog.">
     Cancel
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index baf8b49..3fd20ff 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -111,10 +111,6 @@
     "autofill/personal_data_manager_factory.h",
     "autofill/risk_util.cc",
     "autofill/risk_util.h",
-    "autofill/strike_database.cc",
-    "autofill/strike_database.h",
-    "autofill/test_strike_database.cc",
-    "autofill/test_strike_database.h",
     "autofill/validation_rules_storage_factory.cc",
     "autofill/validation_rules_storage_factory.h",
     "background_fetch/background_fetch_delegate_factory.cc",
@@ -1701,7 +1697,6 @@
     "//chrome:strings",
     "//chrome/app/resources:platform_locale_settings",
     "//chrome/app/theme:theme_resources",
-    "//chrome/browser/autofill:strike_data",
     "//chrome/browser/devtools",
     "//chrome/browser/media:media_engagement_preload_proto",
     "//chrome/browser/media:mojo_bindings",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index cc2151f..f79e606e 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2391,11 +2391,6 @@
     {"mac-v2-sandbox", flag_descriptions::kMacV2SandboxName,
      flag_descriptions::kMacV2SandboxDescription, kOsMac,
      FEATURE_VALUE_TYPE(features::kMacV2Sandbox)},
-    {"mac-views-native-app-windows",
-     flag_descriptions::kMacViewsNativeAppWindowsName,
-     flag_descriptions::kMacViewsNativeAppWindowsDescription, kOsMac,
-     ENABLE_DISABLE_VALUE_TYPE(switches::kEnableMacViewsNativeAppWindows,
-                               switches::kDisableMacViewsNativeAppWindows)},
     {"mac-views-task-manager", flag_descriptions::kMacViewsTaskManagerName,
      flag_descriptions::kMacViewsTaskManagerDescription, kOsMac,
      FEATURE_VALUE_TYPE(features::kViewsTaskManager)},
diff --git a/chrome/browser/android/contextualsearch/contextual_search_context.cc b/chrome/browser/android/contextualsearch/contextual_search_context.cc
index 73eb05723..dd776aeba 100644
--- a/chrome/browser/android/contextualsearch/contextual_search_context.cc
+++ b/chrome/browser/android/contextualsearch/contextual_search_context.cc
@@ -134,9 +134,12 @@
   std::string html_lang;
   std::string cld_language;
   bool is_cld_reliable;
+  std::string canonical_html_root_language;
+  std::string canonical_content_language;
   std::string language = translate::DeterminePageLanguage(
       content_language, html_lang, this->surrounding_text, &cld_language,
-      &is_cld_reliable);
+      &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   // Make sure we return an empty string when unreliable or an unknown result.
   if (!is_cld_reliable || language == translate::kUnknownLanguageCode)
     language = "";
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index 0d53973..6c9658f 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -1638,7 +1638,13 @@
 
 - (BOOL)application:(NSApplication*)application
     continueUserActivity:(NSUserActivity*)userActivity
+#if !defined(MAC_OS_X_VERSION_10_14) || \
+    MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_14
       restorationHandler:(void (^)(NSArray*))restorationHandler
+#else
+      restorationHandler:
+          (void (^)(NSArray<id<NSUserActivityRestoring>>*))restorationHandler
+#endif
     API_AVAILABLE(macos(10.10)) {
   if (![userActivity.activityType
           isEqualToString:NSUserActivityTypeBrowsingWeb]) {
diff --git a/chrome/browser/apps/platform_apps/api/browser/browser_api.cc b/chrome/browser/apps/platform_apps/api/browser/browser_api.cc
index 43b7049..28575e8f 100644
--- a/chrome/browser/apps/platform_apps/api/browser/browser_api.cc
+++ b/chrome/browser/apps/platform_apps/api/browser/browser_api.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/common/apps/platform_apps/api/browser.h"
 
-namespace apps {
+namespace chrome_apps {
 namespace api {
 
 BrowserOpenTabFunction::~BrowserOpenTabFunction() {}
@@ -35,4 +35,4 @@
 }
 
 }  // namespace api
-}  // namespace apps
+}  // namespace chrome_apps
diff --git a/chrome/browser/apps/platform_apps/api/browser/browser_api.h b/chrome/browser/apps/platform_apps/api/browser/browser_api.h
index 9fbf2ae1..31eaf0e 100644
--- a/chrome/browser/apps/platform_apps/api/browser/browser_api.h
+++ b/chrome/browser/apps/platform_apps/api/browser/browser_api.h
@@ -7,7 +7,7 @@
 
 #include "extensions/browser/extension_function.h"
 
-namespace apps {
+namespace chrome_apps {
 namespace api {
 
 class BrowserOpenTabFunction : public UIThreadExtensionFunction {
@@ -21,6 +21,6 @@
 };
 
 }  // namespace api
-}  // namespace apps
+}  // namespace chrome_apps
 
 #endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_BROWSER_API_H_
diff --git a/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.cc b/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.cc
index dfbeda3..f0328571 100644
--- a/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.cc
+++ b/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.cc
@@ -11,11 +11,13 @@
 #endif
 
 namespace chrome_apps {
+namespace api {
 
 void EnsureAPIBrowserContextKeyedServiceFactoriesBuilt() {
 #if defined(OS_CHROMEOS)
-  apps::EasyUnlockPrivateAPI::GetFactoryInstance();
+  EasyUnlockPrivateAPI::GetFactoryInstance();
 #endif
 }
 
+}  // namespace api
 }  // namespace chrome_apps
diff --git a/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.h b/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.h
index 32fbcf9..d345c09 100644
--- a/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.h
+++ b/chrome/browser/apps/platform_apps/api/browser_context_keyed_service_factories.h
@@ -6,11 +6,13 @@
 #define CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
 
 namespace chrome_apps {
+namespace api {
 
 // Ensures the existence of any BrowserContextKeyedServiceFactory provided by
 // the Chrome Apps API code.
 void EnsureAPIBrowserContextKeyedServiceFactoriesBuilt();
 
+}  // namespace api
 }  // namespace chrome_apps
 
 #endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_API_BROWSER_CONTEXT_KEYED_SERVICE_FACTORIES_H_
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.cc b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.cc
index 2d9225b..7e86e84 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.cc
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.cc
@@ -57,9 +57,8 @@
 
 using proximity_auth::ScreenlockState;
 
-namespace apps {
-
-namespace easy_unlock_private = api::easy_unlock_private;
+namespace chrome_apps {
+namespace api {
 
 namespace {
 
@@ -434,9 +433,11 @@
   return RespondNow(NoArguments());
 }
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
 
 template <>
-void apps::EasyUnlockPrivateAPI::Factory::DeclareFactoryDependencies() {
+void chrome_apps::api::EasyUnlockPrivateAPI::Factory::
+    DeclareFactoryDependencies() {
   DependsOn(EasyUnlockPrivateConnectionResourceManager::GetFactoryInstance());
 }
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.h b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.h
index 90ba36a..cc3e256 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.h
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api.h
@@ -33,7 +33,8 @@
 class BluetoothLowEnergyConnectionFinder;
 }
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 
 class EasyUnlockPrivateConnectionManager;
 
@@ -177,9 +178,11 @@
   DISALLOW_COPY_AND_ASSIGN(EasyUnlockPrivateSetupConnectionSendFunction);
 };
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
 
 template <>
-void apps::EasyUnlockPrivateAPI::Factory::DeclareFactoryDependencies();
+void chrome_apps::api::EasyUnlockPrivateAPI::Factory::
+    DeclareFactoryDependencies();
 
 #endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_API_EASY_UNLOCK_PRIVATE_EASY_UNLOCK_PRIVATE_API_H_
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc
index 95851e9..1aa9ce0 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_api_chromeos_unittest.cc
@@ -19,7 +19,8 @@
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/value_builder.h"
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 namespace {
 
 using cryptauth::FakeConnection;
@@ -111,4 +112,5 @@
 }
 
 }  // namespace
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.cc b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.cc
index 741c837..6d0b3d6 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.cc
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.cc
@@ -7,7 +7,8 @@
 #include "base/lazy_instance.h"
 #include "components/cryptauth/connection.h"
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 
 static base::LazyInstance<EasyUnlockPrivateConnectionResourceManagerFactory>::
     DestructorAtExit g_easy_unlock_private_connection_factory =
@@ -31,10 +32,11 @@
   return persistent_;
 }
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
 
 template <>
 EasyUnlockPrivateConnectionResourceManagerFactory*
 EasyUnlockPrivateConnectionResourceManager::GetFactoryInstance() {
-  return apps::g_easy_unlock_private_connection_factory.Pointer();
+  return chrome_apps::api::g_easy_unlock_private_connection_factory.Pointer();
 }
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.h b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.h
index 1f04ffa..6b17d66 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.h
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection.h
@@ -17,7 +17,8 @@
 class Connection;
 }  // namespace cryptauth
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 
 // An ApiResource wrapper for a cryptauth::Connection.
 class EasyUnlockPrivateConnection : public extensions::ApiResource {
@@ -54,10 +55,12 @@
   DISALLOW_COPY_AND_ASSIGN(EasyUnlockPrivateConnection);
 };
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
 
 using EasyUnlockPrivateConnectionResourceManager =
-    extensions::ApiResourceManager<apps::EasyUnlockPrivateConnection>;
+    extensions::ApiResourceManager<
+        chrome_apps::api::EasyUnlockPrivateConnection>;
 using EasyUnlockPrivateConnectionResourceManagerFactory =
     extensions::BrowserContextKeyedAPIFactory<
         EasyUnlockPrivateConnectionResourceManager>;
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.cc b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
index b55eb1b..6a4fed7b 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.cc
@@ -16,22 +16,23 @@
 using cryptauth::Connection;
 using cryptauth::WireMessage;
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 namespace {
 
 const char kEasyUnlockFeatureName[] = "easy_unlock";
 
-api::easy_unlock_private::ConnectionStatus ToApiConnectionStatus(
+easy_unlock_private::ConnectionStatus ToApiConnectionStatus(
     Connection::Status status) {
   switch (status) {
     case Connection::Status::DISCONNECTED:
-      return api::easy_unlock_private::CONNECTION_STATUS_DISCONNECTED;
+      return easy_unlock_private::CONNECTION_STATUS_DISCONNECTED;
     case Connection::Status::IN_PROGRESS:
-      return api::easy_unlock_private::CONNECTION_STATUS_IN_PROGRESS;
+      return easy_unlock_private::CONNECTION_STATUS_IN_PROGRESS;
     case Connection::Status::CONNECTED:
-      return api::easy_unlock_private::CONNECTION_STATUS_CONNECTED;
+      return easy_unlock_private::CONNECTION_STATUS_CONNECTED;
   }
-  return api::easy_unlock_private::CONNECTION_STATUS_NONE;
+  return easy_unlock_private::CONNECTION_STATUS_NONE;
 }
 
 }  // namespace
@@ -74,14 +75,14 @@
   return connection_id;
 }
 
-api::easy_unlock_private::ConnectionStatus
+easy_unlock_private::ConnectionStatus
 EasyUnlockPrivateConnectionManager::ConnectionStatus(
     const extensions::Extension* extension,
     int connection_id) const {
   Connection* connection = GetConnection(extension->id(), connection_id);
   if (connection)
     return ToApiConnectionStatus(connection->status());
-  return api::easy_unlock_private::CONNECTION_STATUS_NONE;
+  return easy_unlock_private::CONNECTION_STATUS_NONE;
 }
 
 std::string EasyUnlockPrivateConnectionManager::GetDeviceAddress(
@@ -121,11 +122,11 @@
     Connection::Status old_status,
     Connection::Status new_status) {
   std::string event_name =
-      api::easy_unlock_private::OnConnectionStatusChanged::kEventName;
+      easy_unlock_private::OnConnectionStatusChanged::kEventName;
   extensions::events::HistogramValue histogram_value =
       extensions::events::EASY_UNLOCK_PRIVATE_ON_CONNECTION_STATUS_CHANGED;
   std::unique_ptr<base::ListValue> args =
-      api::easy_unlock_private::OnConnectionStatusChanged::Create(
+      easy_unlock_private::OnConnectionStatusChanged::Create(
           0, ToApiConnectionStatus(old_status),
           ToApiConnectionStatus(new_status));
   DispatchConnectionEvent(event_name, histogram_value, connection,
@@ -135,12 +136,12 @@
 void EasyUnlockPrivateConnectionManager::OnMessageReceived(
     const Connection& connection,
     const WireMessage& message) {
-  std::string event_name = api::easy_unlock_private::OnDataReceived::kEventName;
+  std::string event_name = easy_unlock_private::OnDataReceived::kEventName;
   extensions::events::HistogramValue histogram_value =
       extensions::events::EASY_UNLOCK_PRIVATE_ON_DATA_RECEIVED;
   std::vector<uint8_t> data(message.body().begin(), message.body().end());
   std::unique_ptr<base::ListValue> args =
-      api::easy_unlock_private::OnDataReceived::Create(0, data);
+      easy_unlock_private::OnDataReceived::Create(0, data);
   DispatchConnectionEvent(event_name, histogram_value, &connection,
                           std::move(args));
 }
@@ -154,13 +155,12 @@
     return;
   }
 
-  std::string event_name =
-      api::easy_unlock_private::OnSendCompleted::kEventName;
+  std::string event_name = easy_unlock_private::OnSendCompleted::kEventName;
   extensions::events::HistogramValue histogram_value =
       extensions::events::EASY_UNLOCK_PRIVATE_ON_SEND_COMPLETED;
   std::vector<uint8_t> data(message.payload().begin(), message.payload().end());
   std::unique_ptr<base::ListValue> args =
-      api::easy_unlock_private::OnSendCompleted::Create(0, data, success);
+      easy_unlock_private::OnSendCompleted::Create(0, data, success);
   DispatchConnectionEvent(event_name, histogram_value, &connection,
                           std::move(args));
 }
@@ -224,4 +224,5 @@
   return 0;
 }
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
diff --git a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.h b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.h
index efcf38e0..25778a0 100644
--- a/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.h
+++ b/chrome/browser/apps/platform_apps/api/easy_unlock_private/easy_unlock_private_connection_manager.h
@@ -25,7 +25,8 @@
 class Extension;
 }
 
-namespace apps {
+namespace chrome_apps {
+namespace api {
 
 // EasyUnlockPrivateConnectionManager is used by the EasyUnlockPrivateAPI to
 // interface with cryptauth::Connection.
@@ -43,7 +44,7 @@
                     bool persistent);
 
   // Returns the status of the connection with |connection_id|.
-  api::easy_unlock_private::ConnectionStatus ConnectionStatus(
+  easy_unlock_private::ConnectionStatus ConnectionStatus(
       const extensions::Extension* extension,
       int connection_id) const;
 
@@ -110,6 +111,7 @@
   DISALLOW_COPY_AND_ASSIGN(EasyUnlockPrivateConnectionManager);
 };
 
-}  // namespace apps
+}  // namespace api
+}  // namespace chrome_apps
 
 #endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_API_EASY_UNLOCK_PRIVATE_EASY_UNLOCK_PRIVATE_CONNECTION_MANAGER_H_
diff --git a/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.cc b/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.cc
index 6e954da..4ab6b96 100644
--- a/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.cc
+++ b/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.cc
@@ -6,14 +6,14 @@
 
 #include "chrome/browser/apps/platform_apps/api/generated_api_registration.h"
 
-namespace apps {
+namespace chrome_apps {
 
 ChromeAppsBrowserAPIProvider::ChromeAppsBrowserAPIProvider() = default;
 ChromeAppsBrowserAPIProvider::~ChromeAppsBrowserAPIProvider() = default;
 
 void ChromeAppsBrowserAPIProvider::RegisterExtensionFunctions(
     ExtensionFunctionRegistry* registry) {
-  apps::api::ChromeAppsGeneratedFunctionRegistry::RegisterAll(registry);
+  api::ChromeAppsGeneratedFunctionRegistry::RegisterAll(registry);
 }
 
-}  // namespace apps
+}  // namespace chrome_apps
diff --git a/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h b/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h
index ff8272d0..90065bf 100644
--- a/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h
+++ b/chrome/browser/apps/platform_apps/chrome_apps_browser_api_provider.h
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "extensions/browser/extensions_browser_api_provider.h"
 
-namespace apps {
+namespace chrome_apps {
 
 class ChromeAppsBrowserAPIProvider
     : public extensions::ExtensionsBrowserAPIProvider {
@@ -23,6 +23,6 @@
   DISALLOW_COPY_AND_ASSIGN(ChromeAppsBrowserAPIProvider);
 };
 
-}  // namespace apps
+}  // namespace chrome_apps
 
 #endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_CHROME_APPS_BROWSER_API_PROVIDER_H_
diff --git a/chrome/browser/autofill/BUILD.gn b/chrome/browser/autofill/BUILD.gn
deleted file mode 100644
index d8592026..0000000
--- a/chrome/browser/autofill/BUILD.gn
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/protobuf/proto_library.gni")
-
-proto_library("strike_data") {
-  sources = [
-    "strike_data.proto",
-  ]
-}
diff --git a/chrome/browser/autofill/test_strike_database.h b/chrome/browser/autofill/test_strike_database.h
deleted file mode 100644
index 3ef7850..0000000
--- a/chrome/browser/autofill/test_strike_database.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_AUTOFILL_TEST_STRIKE_DATABASE_H_
-#define CHROME_BROWSER_AUTOFILL_TEST_STRIKE_DATABASE_H_
-
-#include "chrome/browser/autofill/strike_database.h"
-
-namespace autofill {
-
-class TestStrikeDatabase : public StrikeDatabase {
- public:
-  TestStrikeDatabase(const base::FilePath& database_dir);
-
-  void AddEntries(
-      std::vector<std::pair<std::string, StrikeData>> entries_to_add,
-      const SetValueCallback& callback);
-};
-
-}  // namespace autofill
-
-#endif  // CHROME_BROWSER_AUTOFILL_TEST_STRIKE_DATABASE_H_
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 584b643..ede0218 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -268,7 +268,7 @@
   extensions_browser_client_ =
       std::make_unique<extensions::ChromeExtensionsBrowserClient>();
   extensions_browser_client_->AddAPIProvider(
-      std::make_unique<apps::ChromeAppsBrowserAPIProvider>());
+      std::make_unique<chrome_apps::ChromeAppsBrowserAPIProvider>());
   extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
 #endif
 
diff --git a/chrome/browser/browser_switcher/ieem_sitelist_parser.cc b/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
index 3c4b84c..4ba28b5 100644
--- a/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
+++ b/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
@@ -18,7 +18,6 @@
 using namespace data_decoder;  // For |GetXmlElement...()| helper functions.
 
 const char kInvalidRootElement[] = "Invalid XML root element";
-const char kVersion2Unsupported[] = "IEEM Schema v2 is currently unsupported";
 
 const char kSchema1RulesElement[] = "rules";
 const char kSchema1EmieElement[] = "emie";
@@ -30,6 +29,9 @@
 const char kSchema1TrueValue[] = "true";
 
 const char kSchema2SiteListElement[] = "site-list";
+const char kSchema2SiteElement[] = "site";
+const char kSchema2SiteUrlAttribute[] = "url";
+const char kSchema2SiteOpenInElement[] = "open-in";
 
 std::vector<const base::Value*> GetChildrenWithTag(const base::Value& node,
                                                    const std::string& tag) {
@@ -104,9 +106,25 @@
 // Parses Enterprise Mode schema 2 files according to:
 // https://technet.microsoft.com/itpro/internet-explorer/ie11-deploy-guide/enterprise-mode-schema-version-2-guidance
 void ParseIeFileVersionTwo(const base::Value& xml, ParsedXml* result) {
-  // TODO(crbug/884837): Implement v2 schema parsing.
   DCHECK(IsXmlElementNamed(xml, kSchema2SiteListElement));
-  result->error = kVersion2Unsupported;
+  // Iterate over <site> elements. Notably, skip <created-by> elements.
+  for (const base::Value* site_node :
+       GetChildrenWithTag(xml, kSchema2SiteElement)) {
+    std::string url =
+        GetXmlElementAttribute(*site_node, kSchema2SiteUrlAttribute);
+    base::TrimWhitespaceASCII(url, base::TRIM_ALL, &url);
+    if (url.empty())
+      continue;
+    // Read all sub-elements and keep the content of the <open-in> element.
+    std::string mode;
+    for (const base::Value* open_in_node :
+         GetChildrenWithTag(*site_node, kSchema2SiteOpenInElement)) {
+      GetXmlElementText(*open_in_node, &mode);
+    }
+    base::TrimWhitespaceASCII(mode, base::TRIM_ALL, &mode);
+    std::string prefix = (mode.empty() || mode == "none") ? "!" : "";
+    result->sitelist.push_back(prefix + url);
+  }
 }
 
 void RawXmlParsed(ParseIeemXmlCallback callback,
diff --git a/chrome/browser/browser_switcher/ieem_sitelist_parser_browsertest.cc b/chrome/browser/browser_switcher/ieem_sitelist_parser_browsertest.cc
index 0d82133..3ac7c6b 100644
--- a/chrome/browser/browser_switcher/ieem_sitelist_parser_browsertest.cc
+++ b/chrome/browser/browser_switcher/ieem_sitelist_parser_browsertest.cc
@@ -146,4 +146,33 @@
                               std::move(expected_greylist), base::nullopt));
 }
 
+IN_PROC_BROWSER_TEST_F(IeemSitelistParserTest, V2Full) {
+  // Very subtle issue in the closing element for rules.
+  std::string xml =
+      "<site-list version=\"205\"><!-- File creation header -->"
+      "<created-by><tool>EnterpriseSitelistManager</tool><version>10240"
+      "</version><date-created>20150728.135021</date-created></created-by>"
+      "<!-- unknown tags --><unknown><test><mest>test</mest></test>"
+      "<!-- comments --></unknown><!-- no url attrib --><site><open-in>none"
+      "</open-in></site><!-- nested site list --><site-list><site "
+      "url=\"ignore!\"/></site-list><!-- nested site --><site "
+      "url=\"google.com\"><site url=\"nested ignore!\"></site></site><!-- "
+      "unknown tags in a site on multiple levels --><site url=\"good.site\">"
+      "<!-- nested comments --><somethings>klj<other some=\"none\"/>jkh"
+      "</somethings></site><!-- good sites --> <site url=\"www.cpandl.com\">"
+      "<compat-mode>IE8Enterprise</compat-mode><open-in>MSEdge</open-in></site>"
+      "<site url=\"contoso.com\"><compat-mode>default</compat-mode><open-in>"
+      "none</open-in></site><site url=\"relecloud.com\"/><site "
+      "url=\"relecloud.com/about\"><compat-mode>IE8Enterprise</compat-mode>"
+      "</site></site-list><!-- trailing gibberish <trailing><site "
+      "url=\"ignore after site list!\">  <compat-mode>IE8Enterprise\""
+      "</compat-mode></site><gibberish>Lorem ipsum sit...</gibberish>"
+      "</trailing>-->";
+  std::vector<std::string> expected_sitelist = {
+      "!google.com",  "!good.site",     "www.cpandl.com",
+      "!contoso.com", "!relecloud.com", "!relecloud.com/about",
+  };
+  TestParseXml(xml, ParsedXml(std::move(expected_sitelist), {}, base::nullopt));
+}
+
 }  // namespace browser_switcher
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper.h b/chrome/browser/browsing_data/browsing_data_quota_helper.h
index cc91e5e..9a84c3a 100644
--- a/chrome/browser/browsing_data/browsing_data_quota_helper.h
+++ b/chrome/browser/browsing_data/browsing_data_quota_helper.h
@@ -58,12 +58,12 @@
     int64_t syncable_usage = 0;
   };
 
-  typedef std::list<QuotaInfo> QuotaInfoArray;
-  typedef base::Callback<void(const QuotaInfoArray&)> FetchResultCallback;
+  using QuotaInfoArray = std::list<QuotaInfo>;
+  using FetchResultCallback = base::OnceCallback<void(const QuotaInfoArray&)>;
 
   static BrowsingDataQuotaHelper* Create(Profile* profile);
 
-  virtual void StartFetching(const FetchResultCallback& callback) = 0;
+  virtual void StartFetching(FetchResultCallback callback) = 0;
 
   virtual void RevokeHostQuota(const std::string& host) = 0;
 
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc
index 4ab38527..31ac756 100644
--- a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc
+++ b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.cc
@@ -31,15 +31,14 @@
       BrowserContext::GetDefaultStoragePartition(profile)->GetQuotaManager());
 }
 
-void BrowsingDataQuotaHelperImpl::StartFetching(
-    const FetchResultCallback& callback) {
+void BrowsingDataQuotaHelperImpl::StartFetching(FetchResultCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!callback.is_null());
 
   base::PostTaskWithTraits(
       FROM_HERE, {BrowserThread::IO},
       base::BindOnce(&BrowsingDataQuotaHelperImpl::FetchQuotaInfoOnIOThread,
-                     this, callback));
+                     this, std::move(callback)));
 }
 
 void BrowsingDataQuotaHelperImpl::RevokeHostQuota(const std::string& host) {
@@ -61,7 +60,7 @@
 BrowsingDataQuotaHelperImpl::~BrowsingDataQuotaHelperImpl() {}
 
 void BrowsingDataQuotaHelperImpl::FetchQuotaInfoOnIOThread(
-    const FetchResultCallback& callback) {
+    FetchResultCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   const StorageType types[] = {StorageType::kTemporary,
@@ -71,22 +70,22 @@
   // Query hosts for each storage types. When complete, process the collected
   // hosts.
   PendingHosts* pending_hosts = new PendingHosts();
-  base::Closure completion = base::BarrierClosure(
+  base::RepeatingClosure completion = base::BarrierClosure(
       arraysize(types),
       base::BindOnce(&BrowsingDataQuotaHelperImpl::OnGetOriginsComplete,
-                     weak_factory_.GetWeakPtr(), callback,
+                     weak_factory_.GetWeakPtr(), std::move(callback),
                      base::Owned(pending_hosts)));
 
   for (const StorageType& type : types) {
     quota_manager_->GetOriginsModifiedSince(
         type, base::Time(),
-        base::Bind(&BrowsingDataQuotaHelperImpl::GotOrigins,
-                   weak_factory_.GetWeakPtr(), pending_hosts, completion));
+        base::BindOnce(&BrowsingDataQuotaHelperImpl::GotOrigins,
+                       weak_factory_.GetWeakPtr(), pending_hosts, completion));
   }
 }
 
 void BrowsingDataQuotaHelperImpl::GotOrigins(PendingHosts* pending_hosts,
-                                             const base::Closure& completion,
+                                             base::OnceClosure completion,
                                              const std::set<GURL>& origins,
                                              StorageType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -95,34 +94,35 @@
       continue;  // Non-websafe state is not considered browsing data.
     pending_hosts->insert(std::make_pair(url.host(), type));
   }
-  completion.Run();
+  std::move(completion).Run();
 }
 
 void BrowsingDataQuotaHelperImpl::OnGetOriginsComplete(
-    const FetchResultCallback& callback,
+    FetchResultCallback callback,
     PendingHosts* pending_hosts) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   // Query usage for each (host, type). When complete, process the results.
   QuotaInfoMap* quota_info = new QuotaInfoMap();
-  base::Closure completion = base::BarrierClosure(
+  base::RepeatingClosure completion = base::BarrierClosure(
       pending_hosts->size(),
       base::BindOnce(&BrowsingDataQuotaHelperImpl::OnGetHostsUsageComplete,
-                     weak_factory_.GetWeakPtr(), callback,
+                     weak_factory_.GetWeakPtr(), std::move(callback),
                      base::Owned(quota_info)));
 
   for (const auto& itr : *pending_hosts) {
     const std::string& host = itr.first;
     StorageType type = itr.second;
     quota_manager_->GetHostUsage(
-        host, type, base::Bind(&BrowsingDataQuotaHelperImpl::GotHostUsage,
-                               weak_factory_.GetWeakPtr(), quota_info,
-                               completion, host, type));
+        host, type,
+        base::BindOnce(&BrowsingDataQuotaHelperImpl::GotHostUsage,
+                       weak_factory_.GetWeakPtr(), quota_info, completion, host,
+                       type));
   }
 }
 
 void BrowsingDataQuotaHelperImpl::GotHostUsage(QuotaInfoMap* quota_info,
-                                               const base::Closure& completion,
+                                               base::OnceClosure completion,
                                                const std::string& host,
                                                StorageType type,
                                                int64_t usage) {
@@ -140,11 +140,11 @@
     default:
       NOTREACHED();
   }
-  completion.Run();
+  std::move(completion).Run();
 }
 
 void BrowsingDataQuotaHelperImpl::OnGetHostsUsageComplete(
-    const FetchResultCallback& callback,
+    FetchResultCallback callback,
     QuotaInfoMap* quota_info) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
@@ -161,14 +161,15 @@
   }
 
   base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
-                           base::BindOnce(callback, result));
+                           base::BindOnce(std::move(callback), result));
 }
 
 void BrowsingDataQuotaHelperImpl::RevokeHostQuotaOnIOThread(
     const std::string& host) {
   quota_manager_->SetPersistentHostQuota(
-      host, 0, base::Bind(&BrowsingDataQuotaHelperImpl::DidRevokeHostQuota,
-                          weak_factory_.GetWeakPtr()));
+      host, 0,
+      base::BindOnce(&BrowsingDataQuotaHelperImpl::DidRevokeHostQuota,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void BrowsingDataQuotaHelperImpl::DidRevokeHostQuota(
diff --git a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h
index dd0ece7..d88e744 100644
--- a/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h
+++ b/chrome/browser/browsing_data/browsing_data_quota_helper_impl.h
@@ -30,7 +30,7 @@
 // IO thread, we have to communicate over thread using PostTask.
 class BrowsingDataQuotaHelperImpl : public BrowsingDataQuotaHelper {
  public:
-  void StartFetching(const FetchResultCallback& callback) override;
+  void StartFetching(FetchResultCallback callback) override;
   void RevokeHostQuota(const std::string& host) override;
 
  private:
@@ -42,27 +42,27 @@
   ~BrowsingDataQuotaHelperImpl() override;
 
   // Calls QuotaManager::GetOriginModifiedSince for each storage type.
-  void FetchQuotaInfoOnIOThread(const FetchResultCallback& callback);
+  void FetchQuotaInfoOnIOThread(FetchResultCallback callback);
 
   // Callback function for QuotaManager::GetOriginModifiedSince.
   void GotOrigins(PendingHosts* pending_hosts,
-                  const base::Closure& completion,
+                  base::OnceClosure completion,
                   const std::set<GURL>& origins,
                   blink::mojom::StorageType type);
 
   // Calls QuotaManager::GetHostUsage for each (origin, type) pair.
-  void OnGetOriginsComplete(const FetchResultCallback& callback,
+  void OnGetOriginsComplete(FetchResultCallback callback,
                             PendingHosts* pending_hosts);
 
   // Callback function for QuotaManager::GetHostUsage.
   void GotHostUsage(QuotaInfoMap* quota_info,
-                    const base::Closure& completion,
+                    base::OnceClosure completion,
                     const std::string& host,
                     blink::mojom::StorageType type,
                     int64_t usage);
 
   // Called when all QuotaManager::GetHostUsage requests are complete.
-  void OnGetHostsUsageComplete(const FetchResultCallback& callback,
+  void OnGetHostsUsageComplete(FetchResultCallback callback,
                                QuotaInfoMap* quota_info);
 
   void RevokeHostQuotaOnIOThread(const std::string& host);
diff --git a/chrome/browser/browsing_data/mock_browsing_data_quota_helper.cc b/chrome/browser/browsing_data/mock_browsing_data_quota_helper.cc
index 9262a67..9e94731 100644
--- a/chrome/browser/browsing_data/mock_browsing_data_quota_helper.cc
+++ b/chrome/browser/browsing_data/mock_browsing_data_quota_helper.cc
@@ -14,11 +14,10 @@
 
 MockBrowsingDataQuotaHelper::~MockBrowsingDataQuotaHelper() {}
 
-void MockBrowsingDataQuotaHelper::StartFetching(
-    const FetchResultCallback& callback) {
+void MockBrowsingDataQuotaHelper::StartFetching(FetchResultCallback callback) {
   ASSERT_FALSE(callback.is_null());
   ASSERT_TRUE(callback_.is_null());
-  callback_ = callback;
+  callback_ = std::move(callback);
 }
 
 void MockBrowsingDataQuotaHelper::RevokeHostQuota(const std::string& host) {
@@ -41,7 +40,6 @@
 }
 
 void MockBrowsingDataQuotaHelper::Notify() {
-  callback_.Run(response_);
-  callback_.Reset();
+  std::move(callback_).Run(response_);
   response_.clear();
 }
diff --git a/chrome/browser/browsing_data/mock_browsing_data_quota_helper.h b/chrome/browser/browsing_data/mock_browsing_data_quota_helper.h
index 858c3615a..d059e0ac 100644
--- a/chrome/browser/browsing_data/mock_browsing_data_quota_helper.h
+++ b/chrome/browser/browsing_data/mock_browsing_data_quota_helper.h
@@ -17,7 +17,7 @@
  public:
   explicit MockBrowsingDataQuotaHelper(Profile* profile);
 
-  void StartFetching(const FetchResultCallback& callback) override;
+  void StartFetching(FetchResultCallback callback) override;
   void RevokeHostQuota(const std::string& host) override;
 
   void AddHost(const std::string& host,
diff --git a/chrome/browser/chromeos/accessibility/dictation_chromeos.cc b/chrome/browser/chromeos/accessibility/dictation_chromeos.cc
index e26750d..13eee41 100644
--- a/chrome/browser/chromeos/accessibility/dictation_chromeos.cc
+++ b/chrome/browser/chromeos/accessibility/dictation_chromeos.cc
@@ -15,6 +15,8 @@
 #include "content/public/browser/storage_partition.h"
 #include "media/audio/sounds/sounds_manager.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "ui/base/ime/chromeos/extension_ime_util.h"
+#include "ui/base/ime/chromeos/input_method_util.cc"
 #include "ui/base/ime/composition_text.h"
 #include "ui/base/ime/ime_bridge.h"
 #include "ui/base/ime/ime_input_context_handler_interface.h"
@@ -23,13 +25,28 @@
 
 namespace {
 
-const char kDefaultProfileLocale[] = "en-US";
+const char kDefaultProfileLanguage[] = "en-US";
 
-std::string GetUserLocale(Profile* profile) {
-  const std::string user_locale =
-      profile->GetPrefs()->GetString(language::prefs::kApplicationLocale);
+std::string GetUserLanguage(Profile* profile) {
+  // Convert from the ID used in the pref to a language identifier.
+  std::vector<std::string> input_method_ids;
+  input_method_ids.push_back(
+      profile->GetPrefs()->GetString(prefs::kLanguageCurrentInputMethod));
+  std::vector<std::string> languages;
+  input_method::InputMethodManager::Get()
+      ->GetInputMethodUtil()
+      ->GetLanguageCodesFromInputMethodIds(input_method_ids, &languages);
 
-  return user_locale.empty() ? kDefaultProfileLocale : user_locale;
+  std::string user_language;
+  if (!languages.empty())
+    user_language = languages[0];
+
+  // If we don't find a language, fall back to using the locale.
+  if (user_language.empty())
+    user_language =
+        profile->GetPrefs()->GetString(language::prefs::kApplicationLocale);
+
+  return user_language.empty() ? kDefaultProfileLanguage : user_language;
 }
 
 // Returns the current input context. This may change during the session, even
@@ -59,7 +76,7 @@
       content::BrowserContext::GetDefaultStoragePartition(profile_)
           ->GetURLLoaderFactoryForBrowserProcessIOThread(),
       profile_->GetPrefs()->GetString(prefs::kAcceptLanguages),
-      GetUserLocale(profile_));
+      GetUserLanguage(profile_));
   speech_recognizer_->Start(nullptr /* preamble */);
   return true;
 }
diff --git a/chrome/browser/chromeos/login/active_directory_login_browsertest.cc b/chrome/browser/chromeos/login/active_directory_login_browsertest.cc
index 8bab113..e4dc7d2 100644
--- a/chrome/browser/chromeos/login/active_directory_login_browsertest.cc
+++ b/chrome/browser/chromeos/login/active_directory_login_browsertest.cc
@@ -47,24 +47,24 @@
 
 constexpr char kTestActiveDirectoryUser[] = "test-user";
 constexpr char kTestUserRealm[] = "user.realm";
-constexpr char kAdMachineInput[] = "machineNameInput";
-constexpr char kAdMoreOptionsButton[] = "moreOptionsBtn";
-constexpr char kAdUserInput[] = "userInput";
-constexpr char kAdPasswordInput[] = "passwordInput";
-constexpr char kAdCredsButton[] = "adCreds /deep/ #button";
-constexpr char kAdPasswordChangeButton[] = "button";
-constexpr char kAdWelcomMessage[] = "welcomeMsg";
-constexpr char kAdAutocompleteRealm[] = "userInput /deep/ #domainLabel";
+constexpr char kAdMachineInput[] = "$.machineNameInput";
+constexpr char kAdMoreOptionsButton[] = "$.moreOptionsBtn";
+constexpr char kAdUserInput[] = "$.userInput";
+constexpr char kAdPasswordInput[] = "$.passwordInput";
+constexpr char kAdCredsButton[] = "$$('#nextButton')";
+constexpr char kAdPasswordChangeButton[] = "$.inputForm.$.button";
+constexpr char kAdWelcomMessage[] = "$$('#welcomeMsg')";
+constexpr char kAdAutocompleteRealm[] = "$.userInput.querySelector('span')";
 
-constexpr char kAdPasswordChangeId[] = "ad-password-change";
-constexpr char kAdAnimatedPages[] = "animatedPages";
-constexpr char kAdOldPasswordInput[] = "oldPassword";
-constexpr char kAdNewPassword1Input[] = "newPassword1";
-constexpr char kAdNewPassword2Input[] = "newPassword2";
+constexpr char kAdPasswordChangeId[] = "active-directory-password-change";
+constexpr char kAdAnimatedPages[] = "$.animatedPages";
+constexpr char kAdOldPasswordInput[] = "$.oldPassword";
+constexpr char kAdNewPassword1Input[] = "$.newPassword1";
+constexpr char kAdNewPassword2Input[] = "$.newPassword2";
 constexpr char kNewPassword[] = "new_password";
 constexpr char kDifferentNewPassword[] = "different_new_password";
 
-constexpr char kCloseButtonId[] = "closeButton";
+constexpr char kCloseButtonId[] = "$.navigation.$.closeButton";
 
 class ActiveDirectoryLoginTest : public LoginManagerTest {
  public:
@@ -127,7 +127,7 @@
 
   void ClosePasswordChangeScreen() {
     js_checker().Evaluate(JSElement(kAdPasswordChangeId, kCloseButtonId) +
-                          ".fire('tap')");
+                          ".click()");
   }
 
   // Checks if Active Directory login is visible.
@@ -151,11 +151,13 @@
               js_checker().GetString(
                   JSElement(kAdOfflineAuthId, kAdWelcomMessage) + innerText));
 
-    // Checks if realm is set to autocomplete username.
-    EXPECT_EQ(
-        "@" + autocomplete_realm_,
+    std::string autocomplete_domain_ui;
+    base::TrimString(
         js_checker().GetString(
-            JSElement(kAdOfflineAuthId, kAdAutocompleteRealm) + innerText));
+            JSElement(kAdOfflineAuthId, kAdAutocompleteRealm) + innerText),
+        base::kWhitespaceASCII, &autocomplete_domain_ui);
+    // Checks if realm is set to autocomplete username.
+    EXPECT_EQ("@" + autocomplete_realm_, autocomplete_domain_ui);
 
     // Checks if bottom bar is visible.
     JSExpect("!Oobe.getInstance().headerHidden");
@@ -175,22 +177,21 @@
   // Checks if user input is marked as invalid.
   void TestUserError() {
     TestLoginVisible();
-    JSExpect(JSElement(kAdOfflineAuthId, kAdUserInput) + ".isInvalid");
+    JSExpect(JSElement(kAdOfflineAuthId, kAdUserInput) + ".invalid");
   }
 
   // Checks if password input is marked as invalid.
   void TestPasswordError() {
     TestLoginVisible();
-    JSExpect(JSElement(kAdOfflineAuthId, kAdPasswordInput) + ".isInvalid");
+    JSExpect(JSElement(kAdOfflineAuthId, kAdPasswordInput) + ".invalid");
   }
 
   // Checks that machine, password and user inputs are valid.
   void TestNoError() {
     TestLoginVisible();
-    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdMachineInput) + ".isInvalid");
-    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdUserInput) + ".isInvalid");
-    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdPasswordInput) +
-             ".isInvalid");
+    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdMachineInput) + ".invalid");
+    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdUserInput) + ".invalid");
+    JSExpect("!" + JSElement(kAdOfflineAuthId, kAdPasswordInput) + ".invalid");
   }
 
   // Checks if autocomplete domain is visible for the user input.
@@ -226,7 +227,7 @@
     js_checker().ExecuteAsync(JSElement(kAdOfflineAuthId, kAdPasswordInput) +
                               ".value='" + password + "'");
     js_checker().Evaluate(JSElement(kAdOfflineAuthId, kAdCredsButton) +
-                          ".fire('tap')");
+                          ".click()");
   }
 
   // Sets username and password for the Active Directory login and submits it.
@@ -244,8 +245,7 @@
         JSElement(kAdPasswordChangeId, kAdNewPassword2Input) + ".value='" +
         new_password2 + "'");
     js_checker().Evaluate(
-        JSElement(kAdPasswordChangeId, kAdPasswordChangeButton) +
-        ".fire('tap')");
+        JSElement(kAdPasswordChangeId, kAdPasswordChangeButton) + ".click()");
   }
 
   void SetupActiveDirectoryJSNotifications() {
@@ -269,9 +269,8 @@
   // Returns string representing element with id=|element_id| inside Active
   // Directory login element.
   std::string JSElement(const std::string& parent_id,
-                        const std::string& element_id) {
-    return "document.querySelector('#" + parent_id + " /deep/ #" + element_id +
-           "')";
+                        const std::string& selector) {
+    return "document.querySelector('#" + parent_id + "')." + selector;
   }
   FakeAuthPolicyClient* fake_auth_policy_client() {
     return fake_auth_policy_client_;
@@ -343,6 +342,7 @@
 
   SubmitActiveDirectoryCredentials(std::string(kTestActiveDirectoryUser) + "@",
                                    kPassword);
+  WaitForMessage(&message_queue, "\"ShowAuthError\"");
   TestUserError();
   TestDomainHidden();
 
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_app_manager_unittest.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_app_manager_unittest.cc
index ce2fdbbf..d192efad 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_app_manager_unittest.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_app_manager_unittest.cc
@@ -37,7 +37,7 @@
 #include "extensions/common/extension.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace easy_unlock_private_api = apps::api::easy_unlock_private;
+namespace easy_unlock_private_api = chrome_apps::api::easy_unlock_private;
 namespace screenlock_private_api = extensions::api::screenlock_private;
 namespace app_runtime_api = extensions::api::app_runtime;
 
diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_screen.h b/chrome/browser/chromeos/login/enrollment/enrollment_screen.h
index d7b1491..678e78a 100644
--- a/chrome/browser/chromeos/login/enrollment/enrollment_screen.h
+++ b/chrome/browser/chromeos/login/enrollment/enrollment_screen.h
@@ -119,6 +119,8 @@
                            TestActiveDirectoryEnrollment_UIErrors);
   FRIEND_TEST_ALL_PREFIXES(ActiveDirectoryJoinTest,
                            TestActiveDirectoryEnrollment_ErrorCard);
+  FRIEND_TEST_ALL_PREFIXES(ActiveDirectoryJoinTest,
+                           TestActiveDirectoryEnrollment_Streamline);
   FRIEND_TEST_ALL_PREFIXES(HandsOffWelcomeScreenTest, RequiresNoInput);
   FRIEND_TEST_ALL_PREFIXES(HandsOffWelcomeScreenTest, ContinueClickedOnlyOnce);
   FRIEND_TEST_ALL_PREFIXES(ZeroTouchEnrollmentScreenUnitTest, Retry);
diff --git a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
index d618e4fc..e0228d8 100644
--- a/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
+++ b/chrome/browser/chromeos/login/enterprise_enrollment_browsertest.cc
@@ -2,6 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/base64.h"
+#include "base/json/json_reader.h"
+#include "base/json/string_escape.h"
 #include "base/macros.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -37,19 +40,26 @@
 
 namespace {
 
-constexpr char kAdMachineNameInput[] =
-    "document.querySelector('#oauth-enroll-ad-join-ui /deep/ "
-    "#machineNameInput')";
-constexpr char kAdMachineOrgUnitInput[] =
-    "document.querySelector('#oauth-enroll-ad-join-ui /deep/ "
-    "#orgUnitInput')";
-constexpr char kAdEncryptionTypesSelect[] =
-    "document.querySelector('#oauth-enroll-ad-join-ui /deep/ "
-    "#encryptionList')";
-constexpr char kAdUsernameInput[] =
-    "document.querySelector('#oauth-enroll-ad-join-ui /deep/ #userInput')";
-constexpr char kAdPasswordInput[] =
-    "document.querySelector('#oauth-enroll-ad-join-ui /deep/ #passwordInput')";
+#define AD_JS_ELEMENT "document.querySelector('#oauth-enroll-ad-join-ui')."
+constexpr char kAdMachineNameInput[] = AD_JS_ELEMENT "$.machineNameInput";
+constexpr char kAdMachineOrgUnitInput[] = AD_JS_ELEMENT "$.orgUnitInput";
+constexpr char kAdEncryptionTypesSelect[] = AD_JS_ELEMENT "$.encryptionList";
+constexpr char kAdMoreOptionsSave[] = AD_JS_ELEMENT "$.moreOptionsSave.click()";
+constexpr char kAdUsernameInput[] = AD_JS_ELEMENT "$.userInput";
+constexpr char kAdPasswordInput[] = AD_JS_ELEMENT "$.passwordInput";
+constexpr char kAdSubmitCreds[] = AD_JS_ELEMENT "$$('#nextButton').click()";
+constexpr char kAdConfigurationSelect[] = AD_JS_ELEMENT "$.joinConfigSelect";
+constexpr char kAdCredentialsStep[] = AD_JS_ELEMENT "$.credsStep";
+constexpr char kAdJoinConfigurationForm[] = AD_JS_ELEMENT "$.joinConfig";
+constexpr char kAdUnlockConfigurationStep[] = AD_JS_ELEMENT "$.unlockStep";
+constexpr char kAdUnlockConfigurationSkipButtonTap[] =
+    AD_JS_ELEMENT "$$('#skipButton').click()";
+constexpr char kAdUnlockConfigurationSubmitButtonTap[] =
+    AD_JS_ELEMENT "$$('#unlockButton').click()";
+constexpr char kAdUnlockPasswordInput[] = AD_JS_ELEMENT "$.unlockPasswordInput";
+constexpr char kAdBackToUnlockConfigurationButtonTap[] =
+    AD_JS_ELEMENT "$$('#backToUnlockButton').click()";
+#undef AD_JS_ELEMENT
 constexpr char kAdUserDomain[] = "user.domain.com";
 constexpr char kAdMachineDomain[] = "machine.domain.com";
 constexpr char kAdMachineDomainDN[] =
@@ -57,6 +67,44 @@
 constexpr const char* kAdOrganizationlUnit[] = {"leaf", "root"};
 constexpr char kAdTestUser[] = "test_user@user.domain.com";
 constexpr char kDMToken[] = "dm_token";
+constexpr char kAdDomainJoinEncryptedConfig[] =
+    "W/x3ToZtYrHTzD21dlx2MrMhs2bDFTNmvew/toQhO+RdBV8XmQfJqVMaRtIO+Uji6zBueUyxcl"
+    "MtiFJnimvYh0DUFQ5PJ3PY49BPACPnrGws51or1pEZJkXiKOEapRwNfqHz5tOnvFS1VqSvcv6Z"
+    "JQqFQHKfvodGiEZv52+iViQTCSup8VJWCtfJxy/LxqHly/4xaUDNn8Sbbv8V/j8HUxc7/rwmnm"
+    "R5B6qxIYDfYOpZWQXnVunlB2bBkcCEgXdS9YN+opsftlkNPsVrcdHUWwCmqxxAsuVZaTfxu+7C"
+    "ZhSG72VH3BtQUsyGoh9evSIhAcid1CGbSx16sJVZyhZVXMF9D80AEl6aWDyxh43iJy0AgLpfkP"
+    "mfkpZ3+iv0EJocFUhFINrq0fble+wE8KsOtlUBne4jFA/fifOrRBoIdXdLLz3+FbL4A7zY9qbd"
+    "PbDw5J5W3nnaJWhTd5R765LbPp7wNAzdPh4a++E0dUUSVXO2K5HkAopV9RkeDea2kaxOLi1ioj"
+    "H8fxubSHp4e8ZYSAX4N9JkJWiDurp8yEpUno2aw2Y7HafkMs0GMnO0sdkJfLZrnDq9wkZh7bMD"
+    "6sp5tiOqVbTG6QH1BdlJBryTAjlrMFL6y7zFvfMZSJhbI6VwQyskGX/TOYEnsXuWEpRBxtDVV/"
+    "QLUWM0orFELZPoPdeuH3dACsEv4mMBo8hWlKu/S3SHXt2hrvI1PXDO10AOHy8CPNPs7p/LeuJq"
+    "XHRYOKsuNZnYbFJR1r+rZhkvYFpn6dHOLbe7RScqkq9cUYVvxK84COIdbEay9w1Son4sFJZszi"
+    "Ve+uc/oFWcVp6GZPzvWSfjrTXYqIFDw/WsC8mYMgqOvTZCKj6M3pUyvc7bT3hIPqGXZyp5Pmzb"
+    "jpCn95i8tlnjfmiZaDjl3HxrY15zvw==";
+constexpr char kAdDomainJoinUnlockedConfig[] = R"!!!(
+[
+  {
+    "name": "Sales",
+    "ad_username": "domain_join_account@example.com",
+    "ad_password": "test123",
+    "computer_ou": "OU=sales,DC=example,DC=com",
+    "encryption_types": "all"
+  },
+  {
+    "name": "Marketing",
+    "ad_username": "domain_join_account@example.com",
+    "ad_password": "test123",
+    "computer_ou": "OU=marketing,DC=example,DC=com"
+  },
+  {
+    "name": "Engineering",
+    "ad_username": "other_domain_join_account@example.com",
+    "ad_password": "test345",
+    "computer_ou": "OU=engineering,DC=example,DC=com",
+    "computer_name_validation_regex": "^DEVICE_\\d+$"
+  }
+]
+)!!!";
 
 class MockAuthPolicyClient : public FakeAuthPolicyClient {
  public:
@@ -249,6 +297,130 @@
     EnterpriseEnrollmentTestBase::SetUp();
   }
 
+  void CheckActiveDirectoryCredentialsShown() {
+    EXPECT_TRUE(IsStepDisplayed("ad-join"));
+    js_checker().ExpectFalse(std::string(kAdCredentialsStep) + ".hidden");
+    js_checker().ExpectTrue(std::string(kAdUnlockConfigurationStep) +
+                            ".hidden");
+  }
+
+  void CheckConfigurationSelectionVisible(bool visible) {
+    js_checker().ExpectNE(std::string(kAdJoinConfigurationForm) + ".hidden",
+                          visible);
+  }
+
+  void CheckActiveDirectoryUnlockConfigurationShown() {
+    EXPECT_TRUE(IsStepDisplayed("ad-join"));
+    js_checker().ExpectFalse(std::string(kAdUnlockConfigurationStep) +
+                             ".hidden");
+    js_checker().ExpectTrue(std::string(kAdCredentialsStep) + ".hidden");
+  }
+
+  void SkipUnlockStep() {
+    js_checker().ExecuteAsync(kAdUnlockConfigurationSkipButtonTap);
+    ExecutePendingJavaScript();
+  }
+
+  void GetBackToUnlockStep() {
+    js_checker().ExecuteAsync(kAdBackToUnlockConfigurationButtonTap);
+    ExecutePendingJavaScript();
+  }
+
+  void SendUnlockPassword(const std::string& password) {
+    const std::string set_unlock_password =
+        std::string(kAdUnlockPasswordInput) + ".value = '" + password + "'";
+    js_checker().ExecuteAsync(set_unlock_password);
+    js_checker().ExecuteAsync(kAdUnlockConfigurationSubmitButtonTap);
+    ExecutePendingJavaScript();
+  }
+
+  void CheckUnlockPasswordValid(bool is_expected_valid) {
+    js_checker().ExpectNE(std::string(kAdUnlockPasswordInput) + ".invalid",
+                          is_expected_valid);
+  }
+
+  void SetConfigValue(size_t config_idx) {
+    js_checker().ExecuteAsync(kAdConfigurationSelect +
+                              (".value = " + std::to_string(config_idx)));
+    // Trigger selection handler.
+    js_checker().ExecuteAsync(kAdConfigurationSelect + std::string(".click()"));
+  }
+
+  void CheckAttributeValue(const base::Value* config_value,
+                           const std::string& default_value,
+                           const std::string& js_element) {
+    std::string expected_value(default_value);
+    if (config_value)
+      expected_value = config_value->GetString();
+    js_checker().ExpectTrue(js_element + " === '" + expected_value + "'");
+  }
+
+  void CheckAttributeValueAndDisabled(const base::Value* config_value,
+                                      const std::string& default_value,
+                                      const std::string& js_element) {
+    CheckAttributeValue(config_value, default_value, js_element + ".value");
+    const bool is_disabled = bool(config_value);
+    js_checker().ExpectEQ(js_element + ".disabled", is_disabled);
+  }
+
+  // Checks pattern attribute on the machine name input field. If |config_value|
+  // is nullptr the attribute should be undefined.
+  void CheckPatternAttribute(const base::Value* config_value) {
+    if (config_value) {
+      std::string escaped_pattern;
+      // Escape regex pattern.
+      EXPECT_TRUE(base::EscapeJSONString(config_value->GetString(),
+                                         false /* put_in_quotes */,
+                                         &escaped_pattern));
+      js_checker().ExpectTrue(std::string(kAdMachineNameInput) +
+                              ".pattern  === '" + escaped_pattern + "'");
+    } else {
+      js_checker().ExpectTrue("typeof " + std::string(kAdMachineNameInput) +
+                              ".pattern === 'undefined'");
+    }
+  }
+
+  // Goes through |configuration| which is JSON (see
+  // kAdDomainJoinUnlockedConfig). Selects each of them and checks that all the
+  // input fields are set correctly. Also checks if there is a "Custom" option
+  // which does not set any fields.
+  void CheckPossibleConfiguration(const std::string& configuration) {
+    std::unique_ptr<base::ListValue> options =
+        base::ListValue::From(base::JSONReader::Read(
+            configuration,
+            base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS));
+    base::DictionaryValue custom_option;
+    custom_option.SetKey("name", base::Value("Custom"));
+    options->GetList().emplace_back(std::move(custom_option));
+    for (size_t i = 0; i < options->GetList().size(); ++i) {
+      const base::Value& option = options->GetList()[i];
+      SetConfigValue(i);
+
+      CheckAttributeValue(
+          option.FindKeyOfType("name", base::Value::Type::STRING), "",
+          std::string(kAdConfigurationSelect) + ".selectedOptions[0].label");
+
+      CheckAttributeValueAndDisabled(
+          option.FindKeyOfType("ad_username", base::Value::Type::STRING), "",
+          std::string(kAdUsernameInput));
+
+      CheckAttributeValueAndDisabled(
+          option.FindKeyOfType("ad_password", base::Value::Type::STRING), "",
+          std::string(kAdPasswordInput));
+
+      CheckAttributeValueAndDisabled(
+          option.FindKeyOfType("computer_ou", base::Value::Type::STRING), "",
+          std::string(kAdMachineOrgUnitInput));
+
+      CheckAttributeValueAndDisabled(
+          option.FindKeyOfType("encryption_types", base::Value::Type::STRING),
+          "strong", std::string(kAdEncryptionTypesSelect));
+
+      CheckPatternAttribute(option.FindKeyOfType(
+          "computer_name_validation_regex", base::Value::Type::STRING));
+    }
+  }
+
   // Submits Active Directory domain join credentials.
   void SubmitActiveDirectoryCredentials(const std::string& machine_name,
                                         const std::string& machine_dn,
@@ -256,6 +428,9 @@
                                         const std::string& username,
                                         const std::string& password) {
     EXPECT_TRUE(IsStepDisplayed("ad-join"));
+    js_checker().ExpectFalse(std::string(kAdCredentialsStep) + ".hidden");
+    js_checker().ExpectTrue(std::string(kAdUnlockConfigurationStep) +
+                            ".hidden");
     js_checker().ExpectFalse(std::string(kAdMachineNameInput) + ".hidden");
     js_checker().ExpectFalse(std::string(kAdUsernameInput) + ".hidden");
     js_checker().ExpectFalse(std::string(kAdPasswordInput) + ".hidden");
@@ -277,17 +452,16 @@
           encryption_types + "'";
       js_checker().ExecuteAsync(set_encryption_types);
     }
-    js_checker().ExecuteAsync(
-        "document.querySelector('#oauth-enroll-ad-join-ui /deep/ #adCreds"
-        "    /deep/ #button').fire('tap')");
+    js_checker().ExecuteAsync(kAdMoreOptionsSave);
+    js_checker().ExecuteAsync(kAdSubmitCreds);
     ExecutePendingJavaScript();
   }
 
   void ClickRetryOnErrorScreen() {
     js_checker().ExecuteAsync(
         "document.querySelector('"
-        "#oauth-enroll-active-directory-join-error-card /deep/ #submitButton'"
-        ").fire('tap')");
+        "#oauth-enroll-active-directory-join-error-card').$.submitButton"
+        ".click()");
     ExecutePendingJavaScript();
   }
 
@@ -314,23 +488,25 @@
   }
 
   // Forces the Active Directory domain join flow during enterprise enrollment.
-  void SetupActiveDirectoryJoin(const std::string& expected_domain) {
+  void SetupActiveDirectoryJoin(const std::string& expected_domain,
+                                const std::string& domain_join_config) {
     AddEnrollmentSetupFunction(
-        [this,
-         expected_domain](EnterpriseEnrollmentHelperMock* enrollment_helper) {
+        [this, expected_domain, domain_join_config](
+            EnterpriseEnrollmentHelperMock* enrollment_helper) {
           // Causes the attribute-prompt flow to activate.
           EXPECT_CALL(*enrollment_helper,
                       EnrollUsingAuthCode("test_auth_code", _))
-              .WillOnce(InvokeWithoutArgs([this, expected_domain]() {
-                this->enrollment_screen()->JoinDomain(
-                    kDMToken, std::string() /* domain_join_config */,
-                    base::BindOnce(
-                        [](const std::string& expected_domain,
-                           const std::string& domain) {
-                          ASSERT_EQ(expected_domain, domain);
-                        },
-                        expected_domain));
-              }));
+              .WillOnce(InvokeWithoutArgs(
+                  [this, expected_domain, domain_join_config]() {
+                    this->enrollment_screen()->JoinDomain(
+                        kDMToken, domain_join_config,
+                        base::BindOnce(
+                            [](const std::string& expected_domain,
+                               const std::string& domain) {
+                              ASSERT_EQ(expected_domain, domain);
+                            },
+                            expected_domain));
+                  }));
         });
   }
 
@@ -362,6 +538,14 @@
         "      machineName, user, errorState, showUnlockConfig);"
         "  window.domAutomationController.send('ShowJoinDomainError');"
         "}");
+    js_checker().ExecuteAsync(
+        "var originalSetAdJoinConfiguration ="
+        "    login.OAuthEnrollmentScreen.setAdJoinConfiguration;"
+        "login.OAuthEnrollmentScreen.setAdJoinConfiguration = function("
+        "    options) {"
+        "  originalSetAdJoinConfiguration(options);"
+        "  window.domAutomationController.send('SetAdJoinConfiguration');"
+        "}");
   }
 
   void WaitForMessage(content::DOMMessageQueue* message_queue,
@@ -580,13 +764,15 @@
                        TestActiveDirectoryEnrollment_Success) {
   ShowEnrollmentScreen();
   DisableAttributePromptUpdate();
-  SetupActiveDirectoryJoin(kAdUserDomain);
+  SetupActiveDirectoryJoin(kAdUserDomain, std::string());
   SubmitEnrollmentCredentials();
 
   chromeos::DBusThreadManager::Get()
       ->GetUpstartClient()
       ->StartAuthPolicyService();
 
+  CheckActiveDirectoryCredentialsShown();
+  CheckConfigurationSelectionVisible(false);
   content::DOMMessageQueue message_queue;
   SetupActiveDirectoryJSNotifications();
   SetExpectedJoinRequest("machine_name", "" /* machine_domain */,
@@ -612,7 +798,7 @@
                        TestActiveDirectoryEnrollment_DistinguishedName) {
   ShowEnrollmentScreen();
   DisableAttributePromptUpdate();
-  SetupActiveDirectoryJoin(kAdMachineDomain);
+  SetupActiveDirectoryJoin(kAdMachineDomain, std::string());
   SubmitEnrollmentCredentials();
 
   chromeos::DBusThreadManager::Get()
@@ -650,7 +836,7 @@
 IN_PROC_BROWSER_TEST_F(ActiveDirectoryJoinTest,
                        TestActiveDirectoryEnrollment_UIErrors) {
   ShowEnrollmentScreen();
-  SetupActiveDirectoryJoin(kAdUserDomain);
+  SetupActiveDirectoryJoin(kAdUserDomain, std::string());
   SubmitEnrollmentCredentials();
 
   chromeos::DBusThreadManager::Get()
@@ -666,9 +852,9 @@
                                    "" /* encryption_types */, kAdTestUser,
                                    "" /* password */);
   EXPECT_TRUE(IsStepDisplayed("ad-join"));
-  js_checker().ExpectFalse(std::string(kAdMachineNameInput) + ".isInvalid");
-  js_checker().ExpectFalse(std::string(kAdUsernameInput) + ".isInvalid");
-  js_checker().ExpectTrue(std::string(kAdPasswordInput) + ".isInvalid");
+  js_checker().ExpectFalse(std::string(kAdMachineNameInput) + ".invalid");
+  js_checker().ExpectFalse(std::string(kAdUsernameInput) + ".invalid");
+  js_checker().ExpectTrue(std::string(kAdPasswordInput) + ".invalid");
 
   // Checking error in case of too long machine name.
   SubmitActiveDirectoryCredentials("too_long_machine_name", "" /* machine_dn */,
@@ -676,9 +862,9 @@
                                    "password");
   WaitForMessage(&message_queue, "\"ShowJoinDomainError\"");
   EXPECT_TRUE(IsStepDisplayed("ad-join"));
-  js_checker().ExpectTrue(std::string(kAdMachineNameInput) + ".isInvalid");
-  js_checker().ExpectFalse(std::string(kAdUsernameInput) + ".isInvalid");
-  js_checker().ExpectFalse(std::string(kAdPasswordInput) + ".isInvalid");
+  js_checker().ExpectTrue(std::string(kAdMachineNameInput) + ".invalid");
+  js_checker().ExpectFalse(std::string(kAdUsernameInput) + ".invalid");
+  js_checker().ExpectFalse(std::string(kAdPasswordInput) + ".invalid");
 
   // Checking error in case of bad username (without realm).
   SubmitActiveDirectoryCredentials("machine_name", "" /* machine_dn */,
@@ -686,9 +872,9 @@
                                    "password");
   WaitForMessage(&message_queue, "\"ShowJoinDomainError\"");
   EXPECT_TRUE(IsStepDisplayed("ad-join"));
-  js_checker().ExpectFalse(std::string(kAdMachineNameInput) + ".isInvalid");
-  js_checker().ExpectTrue(std::string(kAdUsernameInput) + ".isInvalid");
-  js_checker().ExpectFalse(std::string(kAdPasswordInput) + ".isInvalid");
+  js_checker().ExpectFalse(std::string(kAdMachineNameInput) + ".invalid");
+  js_checker().ExpectTrue(std::string(kAdUsernameInput) + ".invalid");
+  js_checker().ExpectFalse(std::string(kAdPasswordInput) + ".invalid");
 
   // We have to remove the enrollment_helper before the dtor gets called.
   enrollment_screen()->enrollment_helper_.reset();
@@ -699,7 +885,7 @@
 IN_PROC_BROWSER_TEST_F(ActiveDirectoryJoinTest,
                        TestActiveDirectoryEnrollment_ErrorCard) {
   ShowEnrollmentScreen();
-  SetupActiveDirectoryJoin(kAdUserDomain);
+  SetupActiveDirectoryJoin(kAdUserDomain, std::string());
   SubmitEnrollmentCredentials();
 
   chromeos::DBusThreadManager::Get()
@@ -710,7 +896,7 @@
   SetupActiveDirectoryJSNotifications();
   // Legacy type triggers error card.
   SubmitActiveDirectoryCredentials("machine_name", "" /* machine_dn */,
-                                   "legacy", "test_user", "password");
+                                   "legacy", kAdTestUser, "password");
   WaitForMessage(&message_queue, "\"ShowADJoinError\"");
   EXPECT_TRUE(IsStepDisplayed("active-directory-join-error"));
   ClickRetryOnErrorScreen();
@@ -773,4 +959,51 @@
   // We have to remove the enrollment_helper before the dtor gets called.
   ResetHelper();
 }
+
+// Check that configuration for the streamline Active Directory domain join
+// propagates correctly to the Domain Join UI.
+IN_PROC_BROWSER_TEST_F(ActiveDirectoryJoinTest,
+                       TestActiveDirectoryEnrollment_Streamline) {
+  ShowEnrollmentScreen();
+  std::string binary_config;
+  EXPECT_TRUE(base::Base64Decode(kAdDomainJoinEncryptedConfig, &binary_config));
+  SetupActiveDirectoryJoin(kAdUserDomain, binary_config);
+  SubmitEnrollmentCredentials();
+
+  chromeos::DBusThreadManager::Get()
+      ->GetUpstartClient()
+      ->StartAuthPolicyService();
+
+  ExecutePendingJavaScript();
+  content::DOMMessageQueue message_queue;
+  SetupActiveDirectoryJSNotifications();
+
+  // Unlock password step should we shown.
+  CheckActiveDirectoryUnlockConfigurationShown();
+  CheckUnlockPasswordValid(true);
+
+  // Test skipping the password step and getting back.
+  SkipUnlockStep();
+  CheckActiveDirectoryCredentialsShown();
+  CheckConfigurationSelectionVisible(false);
+  GetBackToUnlockStep();
+  CheckActiveDirectoryUnlockConfigurationShown();
+
+  // Enter wrong unlock password.
+  SendUnlockPassword("wrong_password");
+  WaitForMessage(&message_queue, "\"ShowJoinDomainError\"");
+  CheckUnlockPasswordValid(false);
+
+  // Enter right unlock password.
+  SendUnlockPassword("test765!");
+  WaitForMessage(&message_queue, "\"SetAdJoinConfiguration\"");
+  CheckActiveDirectoryCredentialsShown();
+  // Configuration selector should be visible.
+  CheckConfigurationSelectionVisible(true);
+
+  // Go through configuration.
+  CheckPossibleConfiguration(kAdDomainJoinUnlockedConfig);
+  enrollment_screen()->enrollment_helper_.reset();
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/js_checker.cc b/chrome/browser/chromeos/login/test/js_checker.cc
index ec2a8f9..4fcab969 100644
--- a/chrome/browser/chromeos/login/test/js_checker.cc
+++ b/chrome/browser/chromeos/login/test/js_checker.cc
@@ -83,6 +83,14 @@
   EXPECT_NE(GetString(expression), result) << expression;
 }
 
+void JSChecker::ExpectEQ(const std::string& expression, bool result) {
+  EXPECT_EQ(GetBool(expression), result) << expression;
+}
+
+void JSChecker::ExpectNE(const std::string& expression, bool result) {
+  EXPECT_NE(GetBool(expression), result) << expression;
+}
+
 void JSChecker::GetBoolImpl(const std::string& expression, bool* result) {
   CHECK(web_contents_);
   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
diff --git a/chrome/browser/chromeos/login/test/js_checker.h b/chrome/browser/chromeos/login/test/js_checker.h
index 2dd524ff..c757cb6 100644
--- a/chrome/browser/chromeos/login/test/js_checker.h
+++ b/chrome/browser/chromeos/login/test/js_checker.h
@@ -43,6 +43,8 @@
   void ExpectNE(const std::string& expression, int result);
   void ExpectEQ(const std::string& expression, const std::string& result);
   void ExpectNE(const std::string& expression, const std::string& result);
+  void ExpectEQ(const std::string& expression, bool result);
+  void ExpectNE(const std::string& expression, bool result);
 
   void set_web_contents(content::WebContents* web_contents) {
     web_contents_ = web_contents;
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index 3b64733..4eb20f05 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -113,6 +113,10 @@
 // '<day_timestamp>:<BASE64 encoded user email>'
 constexpr char kActivityKeySeparator = ':';
 
+// How often the child's usage time is stored.
+static constexpr base::TimeDelta kUpdateChildActiveTimeInterval =
+    base::TimeDelta::FromSeconds(30);
+
 // Helper function (invoked via blocking pool) to fetch information about
 // mounted disks.
 std::vector<em::VolumeInfo> GetVolumeInfo(
@@ -748,6 +752,9 @@
   idle_poll_timer_.Start(FROM_HERE,
                          TimeDelta::FromSeconds(kIdlePollIntervalSeconds), this,
                          &DeviceStatusCollector::CheckIdleState);
+  update_child_usage_timer_.Start(FROM_HERE, kUpdateChildActiveTimeInterval,
+                                  this,
+                                  &DeviceStatusCollector::UpdateChildUsageTime);
   resource_usage_sampling_timer_.Start(
       FROM_HERE, TimeDelta::FromSeconds(kResourceUsageSampleIntervalSeconds),
       this, &DeviceStatusCollector::SampleResourceUsage);
diff --git a/chrome/browser/chromeos/policy/device_status_collector.h b/chrome/browser/chromeos/policy/device_status_collector.h
index 2b67f5a..ff72d58 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.h
+++ b/chrome/browser/chromeos/policy/device_status_collector.h
@@ -182,6 +182,9 @@
   // activity time that is slightly in the future.
   base::TimeDelta max_stored_future_activity_interval_;
 
+  // Updates the child's active time.
+  void UpdateChildUsageTime();
+
  private:
   class ActivityStorage;
 
@@ -249,9 +252,6 @@
   // reports.
   bool IncludeEmailsInActivityReports() const;
 
-  // Updates the child's active time.
-  void UpdateChildUsageTime();
-
   // Pref service that is mainly used to store activity periods for reporting.
   PrefService* const pref_service_;
 
@@ -273,6 +273,7 @@
   int duration_for_last_reported_day_ = 0;
 
   base::RepeatingTimer idle_poll_timer_;
+  base::RepeatingTimer update_child_usage_timer_;
   base::RepeatingTimer resource_usage_sampling_timer_;
 
   std::string os_version_;
diff --git a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
index 9b43ffb..5d1290e 100644
--- a/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector_browsertest.cc
@@ -144,6 +144,8 @@
     SetBaselineTime(Time::Now().LocalMidnight() + activity_day_start + kHour);
   }
 
+  void UpdateUsageTime() { UpdateChildUsageTime(); }
+
   void Simulate(ui::IdleState* states, int len) {
     for (int i = 0; i < len; i++)
       IdleStateCallback(states[i]);
@@ -423,7 +425,8 @@
     kEnterSleep,
     kLeaveSleep,
     kEnterSessionActive,
-    kLeaveSessionActive
+    kLeaveSessionActive,
+    kPeriodicCheckTriggered
   };
 
   void SimulateStateChanges(DeviceStateTransitions* states, int len) {
@@ -456,6 +459,9 @@
           session_manager::SessionManager::Get()->SetSessionState(
               session_manager::SessionState::LOCKED);
           break;
+        case DeviceStateTransitions::kPeriodicCheckTriggered:
+          status_collector_->UpdateUsageTime();
+          break;
       }
     }
   }
@@ -2415,8 +2421,12 @@
        ReportingActivityTimesSessionTransistions) {
   DeviceStateTransitions test_states[] = {
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive};
   SimulateStateChanges(test_states,
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
@@ -2424,7 +2434,7 @@
   GetStatus();
 
   ASSERT_EQ(1, device_status_.active_period_size());
-  EXPECT_EQ(2 * ActivePeriodMilliseconds(),
+  EXPECT_EQ(5 * ActivePeriodMilliseconds(),
             GetActiveMilliseconds(device_status_));
   EXPECT_EQ(user_account_id_.GetUserEmail(),
             device_status_.active_period(0).user_email());
@@ -2434,7 +2444,11 @@
        ReportingActivityTimesSleepTransistions) {
   DeviceStateTransitions test_states[] = {
       DeviceStateTransitions::kEnterSessionActive,
-      DeviceStateTransitions::kEnterSleep, DeviceStateTransitions::kLeaveSleep,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
+      DeviceStateTransitions::kEnterSleep,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
+      DeviceStateTransitions::kLeaveSleep,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive};
   SimulateStateChanges(test_states,
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
@@ -2442,7 +2456,7 @@
   GetStatus();
 
   ASSERT_EQ(1, device_status_.active_period_size());
-  EXPECT_EQ(2 * ActivePeriodMilliseconds(),
+  EXPECT_EQ(4 * ActivePeriodMilliseconds(),
             GetActiveMilliseconds(device_status_));
   EXPECT_EQ(user_account_id_.GetUserEmail(),
             device_status_.active_period(0).user_email());
@@ -2452,8 +2466,13 @@
        ReportingActivityTimesIdleTransitions) {
   DeviceStateTransitions test_states[] = {
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kEnterIdleState,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
       DeviceStateTransitions::kLeaveIdleState,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive};
   SimulateStateChanges(test_states,
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
@@ -2461,7 +2480,7 @@
   GetStatus();
 
   ASSERT_EQ(1, device_status_.active_period_size());
-  EXPECT_EQ(2 * ActivePeriodMilliseconds(),
+  EXPECT_EQ(5 * ActivePeriodMilliseconds(),
             GetActiveMilliseconds(device_status_));
   EXPECT_EQ(user_account_id_.GetUserEmail(),
             device_status_.active_period(0).user_email());
@@ -2473,9 +2492,13 @@
 
   DeviceStateTransitions test_states[] = {
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive,
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
       DeviceStateTransitions::kEnterSessionActive,
       DeviceStateTransitions::kLeaveSessionActive};
   SimulateStateChanges(test_states,
@@ -2494,7 +2517,7 @@
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
 
   GetStatus();
-  EXPECT_EQ(6 * ActivePeriodMilliseconds(),
+  EXPECT_EQ(12 * ActivePeriodMilliseconds(),
             GetActiveMilliseconds(device_status_));
 }
 
@@ -2504,16 +2527,21 @@
 
   DeviceStateTransitions test_states[] = {
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
       DeviceStateTransitions::kEnterSessionActive,
       DeviceStateTransitions::kLeaveSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,  // Check while inactive
       DeviceStateTransitions::kEnterSessionActive,
+      DeviceStateTransitions::kPeriodicCheckTriggered,
       DeviceStateTransitions::kLeaveSessionActive};
   SimulateStateChanges(test_states,
                        sizeof(test_states) / sizeof(DeviceStateTransitions));
   GetStatus();
   EXPECT_EQ(1, device_status_.active_period_size());
-  EXPECT_EQ(3 * ActivePeriodMilliseconds(),
+  EXPECT_EQ(5 * ActivePeriodMilliseconds(),
             GetActiveMilliseconds(device_status_));
 
   // Nothing should be written to local state, because it is only used for
diff --git a/chrome/browser/chromeos/settings/device_oauth2_token_service_factory.cc b/chrome/browser/chromeos/settings/device_oauth2_token_service_factory.cc
index 3fef576..2ce3103 100644
--- a/chrome/browser/chromeos/settings/device_oauth2_token_service_factory.cc
+++ b/chrome/browser/chromeos/settings/device_oauth2_token_service_factory.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service_delegate.h"
 #include "chrome/browser/chromeos/settings/token_encryptor.h"
-#include "chrome/browser/net/system_network_context_manager.h"
 #include "chromeos/cryptohome/system_salt_getter.h"
 #include "content/public/browser/browser_thread.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index ac981d4c..89d3159 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/chromeos/settings/device_settings_cache.h"
 #include "chrome/browser/chromeos/settings/install_attributes.h"
 #include "chrome/browser/chromeos/tpm_firmware_update.h"
-#include "chrome/browser/metrics/metrics_reporting_state.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/dbus/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/chromeos/settings/session_manager_operation.cc b/chrome/browser/chromeos/settings/session_manager_operation.cc
index 94c77af..831e5673 100644
--- a/chrome/browser/chromeos/settings/session_manager_operation.cc
+++ b/chrome/browser/chromeos/settings/session_manager_operation.cc
@@ -14,7 +14,6 @@
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
-#include "chrome/browser/net/nss_context.h"
 #include "components/ownership/owner_key_util.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
diff --git a/chrome/browser/chromeos/settings/system_settings_provider.cc b/chrome/browser/chromeos/settings/system_settings_provider.cc
index f2bfa9f..7f96218 100644
--- a/chrome/browser/chromeos/settings/system_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/system_settings_provider.cc
@@ -8,9 +8,8 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/system/timezone_util.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chromeos/login/login_state.h"
 #include "chromeos/settings/cros_settings_names.h"
+#include "components/user_manager/user_manager.h"
 
 namespace chromeos {
 
@@ -34,10 +33,14 @@
 
 void SystemSettingsProvider::DoSet(const std::string& path,
                                    const base::Value& in_value) {
-  // Only non-guest and non-child users can change the time zone.
-  if (LoginState::Get()->IsGuestSessionUser() ||
-      LoginState::Get()->IsPublicSessionUser() ||
-      ProfileManager::GetActiveUserProfile()->IsChild()) {
+  user_manager::User* user = user_manager::UserManager::Get()->GetActiveUser();
+  if (!user || !user->is_logged_in())
+    return;
+  user_manager::UserType userType = user->GetType();
+  // Guest, child, or public accounts cannot change the time zone.
+  if (userType == user_manager::USER_TYPE_GUEST ||
+      userType == user_manager::USER_TYPE_CHILD ||
+      userType == user_manager::USER_TYPE_PUBLIC_ACCOUNT) {
     return;
   }
 
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index 37063408..b29bf41 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/ui/toolbar/toolbar_actions_model.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
 #include "extensions/browser/extension_registry.h"
@@ -430,20 +429,12 @@
   ~BrowserActionInteractiveViewsTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserActionInteractiveViewsTest);
 };
 
-// BrowserActionTestUtil::InspectPopup() is not implemented for a Cocoa browser.
-#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
-#define MAYBE_CloseBrowserWithDevTools CloseBrowserWithDevTools
-#else
-#define MAYBE_CloseBrowserWithDevTools DISABLED_CloseBrowserWithDevTools
-#endif
 // Test closing the browser while inspecting an extension popup with dev tools.
 IN_PROC_BROWSER_TEST_F(BrowserActionInteractiveViewsTest,
-                       MAYBE_CloseBrowserWithDevTools) {
+                       CloseBrowserWithDevTools) {
   if (!ShouldRunPopupTest())
     return;
 
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc
index 5375b54..44a47b6 100644
--- a/chrome/browser/media/router/media_router_feature.cc
+++ b/chrome/browser/media/router/media_router_feature.cc
@@ -127,28 +127,9 @@
   return base::FeatureList::IsEnabled(kCastMediaRouteProvider);
 }
 
-bool PresentationReceiverWindowEnabled() {
-#if defined(OS_MACOSX) && !BUILDFLAG(MAC_VIEWS_BROWSER)
-  return false;
-#else
-  return true;
-#endif
-}
-
 bool ShouldUseViewsDialog() {
-#if defined(OS_MACOSX)
-#if BUILDFLAG(MAC_VIEWS_BROWSER)
-  // Cocoa browser is disabled if kExperimentalUi is enabled.
-  return (base::FeatureList::IsEnabled(features::kViewsCastDialog) &&
-          !features::IsViewsBrowserCocoa()) ||
-         base::FeatureList::IsEnabled(features::kExperimentalUi);
-#else   // !BUILDFLAG(MAC_VIEWS_BROWSER)
-  return false;
-#endif  // BUILDFLAG(MAC_VIEWS_BROWSER)
-#else   // !defined(OS_MACOSX)
   return base::FeatureList::IsEnabled(features::kViewsCastDialog) ||
          base::FeatureList::IsEnabled(features::kExperimentalUi);
-#endif  // defined(OS_MACOSX)
 }
 
 bool ShouldUseMirroringService() {
diff --git a/chrome/browser/media/router/media_router_feature.h b/chrome/browser/media/router/media_router_feature.h
index f65815f1..a3a2c1a 100644
--- a/chrome/browser/media/router/media_router_feature.h
+++ b/chrome/browser/media/router/media_router_feature.h
@@ -65,11 +65,6 @@
 // enabled.
 bool CastMediaRouteProviderEnabled();
 
-// Returns true if the presentation receiver window for local media casting is
-// available on the current platform.
-// TODO(crbug.com/802332): Remove this when mac_views_browser=1 by default.
-bool PresentationReceiverWindowEnabled();
-
 // Returns true if the Views implementation of the Cast dialog should be used.
 // Returns false if the WebUI implementation should be used.
 bool ShouldUseViewsDialog();
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
index b1405af..0b0f1eec 100644
--- a/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
+++ b/chrome/browser/media/router/providers/wired_display/wired_display_media_route_provider.cc
@@ -95,7 +95,7 @@
 }
 
 WiredDisplayMediaRouteProvider::~WiredDisplayMediaRouteProvider() {
-  if (is_observing_displays_ && PresentationReceiverWindowEnabled()) {
+  if (is_observing_displays_) {
     display::Screen::GetScreen()->RemoveObserver(this);
     is_observing_displays_ = false;
   }
@@ -204,7 +204,7 @@
     return;
 
   // Start observing displays if |this| isn't already observing.
-  if (!is_observing_displays_ && PresentationReceiverWindowEnabled()) {
+  if (!is_observing_displays_) {
     display::Screen::GetScreen()->AddObserver(this);
     is_observing_displays_ = true;
   }
@@ -316,8 +316,6 @@
 }
 
 std::vector<Display> WiredDisplayMediaRouteProvider::GetAllDisplays() const {
-  if (!PresentationReceiverWindowEnabled())
-    return {};
   return display::Screen::GetScreen()->GetAllDisplays();
 }
 
diff --git a/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc b/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
index b0b52a4..85cd58d 100644
--- a/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
+++ b/chrome/browser/media/router/providers/wired_display/wired_display_presentation_receiver_factory.cc
@@ -30,7 +30,6 @@
         profile, bounds, std::move(termination_callback),
         std::move(title_change_callback));
   }
-  CHECK(PresentationReceiverWindowEnabled());
   return PresentationReceiverWindowController::CreateFromOriginalProfile(
       profile, bounds, std::move(termination_callback),
       std::move(title_change_callback));
diff --git a/chrome/browser/password_manager/password_manager_test_base.h b/chrome/browser/password_manager/password_manager_test_base.h
index 30e17d232..0970c28 100644
--- a/chrome/browser/password_manager/password_manager_test_base.h
+++ b/chrome/browser/password_manager/password_manager_test_base.h
@@ -11,7 +11,6 @@
 #include "base/run_loop.h"
 #include "chrome/browser/ssl/cert_verifier_browser_test.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/password_manager/core/browser/password_store_consumer.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -212,7 +211,6 @@
   net::EmbeddedTestServer& https_test_server() { return https_test_server_; }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   net::EmbeddedTestServer https_test_server_;
   // A tab with some hooks injected.
   content::WebContents* web_contents_;
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index d720556..165f0256 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -207,7 +207,7 @@
   extensions::ExtensionManagementFactory::GetInstance();
   chrome_extensions::EnsureBrowserContextKeyedServiceFactoriesBuilt();
   chrome_apps::EnsureBrowserContextKeyedServiceFactoriesBuilt();
-  chrome_apps::EnsureAPIBrowserContextKeyedServiceFactoriesBuilt();
+  chrome_apps::api::EnsureAPIBrowserContextKeyedServiceFactoriesBuilt();
 #endif
 
 #if BUILDFLAG(ENABLE_APP_LIST)
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.cc
index fbc5526..a4503341 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_store_factory.cc
@@ -84,7 +84,7 @@
     DCHECK(!parent_context->IsOffTheRecord());
     LocalSiteCharacteristicsDataStoreInspector* parent_debug =
         LocalSiteCharacteristicsDataStoreInspector::GetForProfile(
-            Profile::FromBrowserContext(context));
+            Profile::FromBrowserContext(parent_context));
     SiteCharacteristicsDataStore* data_store_for_readers =
         GetExistingDataStoreForContext(parent_context);
     DCHECK(data_store_for_readers);
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_non_recording_data_store.cc b/chrome/browser/resource_coordinator/local_site_characteristics_non_recording_data_store.cc
index d2d41ab..6d1a729 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_non_recording_data_store.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_non_recording_data_store.cc
@@ -62,8 +62,10 @@
 
 void LocalSiteCharacteristicsNonRecordingDataStore::GetDatabaseSize(
     DatabaseSizeCallback on_have_data) {
-  if (!data_store_inspector_)
+  if (!data_store_inspector_) {
     std::move(on_have_data).Run(base::nullopt, base::nullopt);
+    return;
+  }
 
   data_store_inspector_->GetDatabaseSize(std::move(on_have_data));
 }
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel_test.extjs
index d24c034..ef5f26c9 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/panel_test.extjs
@@ -110,13 +110,13 @@
   this.runWithLoadedTree(this.linksDoc, function(root) {
     var openMenus = new PanelCommand(PanelCommandType.OPEN_MENUS, 'role_link');
     mockFeedback.call(openMenus.send.bind(openMenus))
-        .expectSpeech('Link', 'Menu', 'apple Link ', 'Menu item', ' 1 of 3 ',)
+        .expectSpeech('Link', 'Menu', 'apple Link', 'Menu item', ' 1 of 3 ',)
         .call(this.fireMockEvent('ArrowLeft'))
-        .expectSpeech('Landmark', 'Menu', 'No items. ', 'Menu item', ' 1 of 1 ')
+        .expectSpeech('Landmark', 'Menu', 'No items.', 'Menu item', ' 1 of 1 ')
         .call(this.fireMockEvent('ArrowRight'))
-        .expectSpeech('Link', 'Menu', 'apple Link ', 'Menu item', ' 1 of 3 ')
+        .expectSpeech('Link', 'Menu', 'apple Link', 'Menu item', ' 1 of 3 ')
         .call(this.fireMockEvent('ArrowUp'))
-        .expectSpeech(  'banana Link ', 'Menu item', ' 3 of 3 ')
+        .expectSpeech(  'banana Link', 'Menu item', ' 3 of 3 ')
         .clearPendingOutput()
         .call(this.fireMockEvent('Enter'))
         .expectSpeech('banana', 'Link')
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 0679ad4..8cc35f5 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -12,12 +12,18 @@
   ]
 }
 
+js_library("oobe_dialog_host_behavior") {
+}
+
 js_library("oobe_select") {
 }
 
 js_library("offline_ad_login") {
   deps = [
+    ":oobe_dialog_host_behavior",
     ":oobe_select",
+    "//ui/webui/resources/cr_elements/cr_input:cr_input",
+    "//ui/webui/resources/js:i18n_behavior",
     "//ui/webui/resources/js:load_time_data",
   ]
 }
diff --git a/chrome/browser/resources/chromeos/login/gaia_button.css b/chrome/browser/resources/chromeos/login/gaia_button.css
index 3840845..e4c3375 100644
--- a/chrome/browser/resources/chromeos/login/gaia_button.css
+++ b/chrome/browser/resources/chromeos/login/gaia_button.css
@@ -16,7 +16,7 @@
 :host([type='link']) paper-button,
 :host([type='dialog']) paper-button {
   background-color: transparent;
-  color: var(--google-blue-500);
+  color: var(--google-blue-600);
   margin: 0;
   min-width: 0;
 }
diff --git a/chrome/browser/resources/chromeos/login/gaia_input.html b/chrome/browser/resources/chromeos/login/gaia_input.html
index 0d09d9a..76f9855 100644
--- a/chrome/browser/resources/chromeos/login/gaia_input.html
+++ b/chrome/browser/resources/chromeos/login/gaia_input.html
@@ -27,7 +27,7 @@
     'domain' - optional attribute for email input. The domain is displayed in
                the end of input field, if user is not provided any.
     'isInvalid' - whether input data is invalid. Supports two-way binding.
-	          Note: it is not changed automatically. Can be changed manually
+                  Note: it is not changed automatically. Can be changed manually
                   or with checkValidity() method.
     'required' - whether empty field is invalid.
     'pattern' - regular expression. If set input would be validated against it
@@ -37,8 +37,6 @@
     'focus'         - focuses input field.
     'checkValidity' - returns current validity state of the input form. Updates
                       'isInvalid' at the end.
-  Events:
-    'invalid-state-cleared' - Fired when isInvalid changes from true to false.
 -->
 <dom-module id="gaia-input">
   <link rel="stylesheet" href="gaia_input.css">
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.css b/chrome/browser/resources/chromeos/login/offline_ad_login.css
index cdde2c7..f6905be 100644
--- a/chrome/browser/resources/chromeos/login/offline_ad_login.css
+++ b/chrome/browser/resources/chromeos/login/offline_ad_login.css
@@ -7,9 +7,28 @@
  * Only changes to offline gaia style are defined here.
  */
 
-.advanced-option-subtitle {
-  color: rgba(0, 0, 0, 0.54);
+.select-title {
+  color: var(--google-grey-900);
+  font-size: 13px;
+  line-height: var(--subtitle-line-height);
+  padding-right: 16px;
+}
+
+.unlock-subtitle {
+  color: rgb(95, 99, 104);
+  padding-bottom: 64px;
+  padding-top: 2px;
+}
+
+.encryption-subtitle {
+  color: --google-grey-600;
   font: 13px Roboto, sans-serif;
+  padding-bottom: 9px;
+  padding-top: 9px;
+}
+
+.encryption-select-row {
+  padding-bottom: 24px;
 }
 
 iron-icon[icon='cr:warning'] {
@@ -19,3 +38,38 @@
   margin-inline-start: 0;
   margin-top: 0;
 }
+
+.select-divider-line {
+  border-bottom: 1px solid #ebebeb;
+  display: block;
+  margin-inline-end: 0;
+  margin-inline-start: 0;
+  position: relative;
+}
+
+.top-line {
+  margin-bottom: 8px;
+}
+
+.bottom-line {
+  margin-bottom: 26px;
+  margin-top: 8px;
+}
+
+.md-select {
+  height: 32px;
+  width: 240px;
+}
+
+#moreOptionsDlg [slot='title'] {
+  padding-bottom: 18px;
+  padding-top: 20px;
+}
+
+#moreOptionsDlg {
+  --cr-input-error-display: none;
+}
+
+#orgUnitInput {
+  padding-bottom: 8px;
+}
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.html b/chrome/browser/resources/chromeos/login/offline_ad_login.html
index 81b3df7..931d0ef 100644
--- a/chrome/browser/resources/chromeos/login/offline_ad_login.html
+++ b/chrome/browser/resources/chromeos/login/offline_ad_login.html
@@ -3,8 +3,11 @@
      found in the LICENSE file. -->
 
 <link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/md_select_css.html">
 <link rel="import" href="chrome://resources/cr_elements/icons.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html">
+
 
 <!--
   Offline UI for the AD Domain joining and User authentication.
@@ -18,7 +21,6 @@
     'unlockPasswordStep' - Whether the unlock password step should be shown.
     'realm' - The AD realm the device is managed by.
     'userRealm' - Autocomplete realm for the user input.
-    'userNameLabel' - Label for the user input.
     'disabled' - Whether the UI disabled. Could be used to disable the UI
                  during blocking IO operations.
     'adWelcomeMessage' - Welcome message on top of the UI.
@@ -41,110 +43,154 @@
     'setUserMachine' - Accepts arguments |user| and |machineName|. Both are
                        optional. If user passed, the password input would be
                        invalidated.
-
-TODO(rsorokin): Switch to the new UI (see https://crbug.com/811556)
 -->
 <dom-module id="offline-ad-login">
-  <link rel="stylesheet" href="offline_gaia.css">
-  <link rel="stylesheet" href="oobe_flex_layout.css">
-  <link rel="stylesheet" href="gaia_card_parameters.css">
-  <link rel="stylesheet" href="offline_ad_login.css">
   <template>
-    <style include="md-select"></style>
-    <gaia-card id="gaiaCard" class="fit">
-      <div slot="header" class="flex vertical layout end-justified start">
-        <h1 id="welcomeMsg" class="welcome-message">[[adWelcomeMessage]]
-        </h1>
+    <style include="md-select iron-flex iron-flex-alignment iron-positioning">
+    </style>
+    <link rel="stylesheet" href="offline_ad_login.css">
+    <oobe-dialog id="unlockStep" hidden="[[!unlockPasswordStep]]"
+        aria-label$="[[adWelcomeMessage]]" has-buttons>
+      <hd-iron-icon slot="oobe-icon" icon1x="oobe-enrollment-32:briefcase"
+          icon2x="oobe-enrollment-64:briefcase">
+      </hd-iron-icon>
+      <h1 slot="title" class="welcome-message">
+        [[i18nDynamic(locale, 'adUnlockTitle')]]
+      </h1>
+      <div slot="subtitle" class="unlock-subtitle">
+        [[i18nDynamic(locale, 'adUnlockSubtitle')]]
       </div>
-      <div slot="footer" class="flex vertical layout">
-        <gaia-input-form on-submit="onUnlockPasswordEntered_"
-            disabled="[[disabled]]"
-            i18n-values="button-text:adUnlockButton"
-            hidden="[[!unlockPasswordStep]]">
-          <gaia-input id="unlockPasswordInput" type="password" slot="inputs"
-              required>
-            <div slot="label" i18n-content="adUnlockPassword"></div>
-            <div slot="error" i18n-content="adUnlockIncorrectPassword"></div>
-          </gaia-input>
-          <gaia-button id="skipButton" on-tap="onSkipClicked_">
-            $i18n{adUnlockPasswordSkip}
-          </gaia-button>
-        </gaia-input-form>
-        <div class="layout horizontal justified" hidden id="joinConfig">
-          <div>
-            $i18n{selectConfiguration}
-          </div>
-          <div class="md-select-wrapper">
+      <div slot="footer" id="adUnlock">
+        <cr-input id="unlockPasswordInput" type="password" slot="inputs"
+            invalid="{{unlockPasswordInvalid}}"
+            label="[[i18nDynamic(locale, 'adUnlockPassword')]]"
+            error-message="[[i18nDynamic(locale, 'adUnlockIncorrectPassword')]]"
+            disabled="[[disabled]]" on-keydown="onKeydownUnlockPassword_"
+            required>
+        </cr-input>
+      </div>
+      <div slot="bottom-buttons" class="layout horizontal end-justified">
+        <oobe-text-button id="skipButton" on-click="onSkipClicked_">
+          <div>[[i18nDynamic(locale, 'adUnlockPasswordSkip')]]</div>
+        </oobe-text-button>
+        <oobe-next-button id="unlockButton"
+            on-click="onUnlockPasswordEntered_"></oobe-next-button>
+      </div>
+    </oobe-dialog>
+    <oobe-dialog id="credsStep" hidden="[[unlockPasswordStep]]"
+        aria-label$="[[adWelcomeMessage]]" has-buttons>
+      <hd-iron-icon slot="oobe-icon" icon1x="oobe-enrollment-32:briefcase"
+          icon2x="oobe-enrollment-64:briefcase">
+      </hd-iron-icon>
+      <h1 slot="title" id="welcomeMsg"
+          class="welcome-message">[[adWelcomeMessage]]</h1>
+      <div slot="footer">
+        <div class="layout vertical" hidden id="joinConfig">
+          <span class="select-divider-line top-line"></span>
+          <div class="layout horizontal justified">
+            <div class="flex self-center select-title">
+              [[i18nDynamic(locale, 'selectConfiguration')]]
+            </div>
             <select id="joinConfigSelect" class="md-select">
             </select>
-            <span class="md-select-underline"></span>
+          </div>
+          <span class="select-divider-line bottom-line"></span>
+        </div>
+        <div class="vertical layout">
+          <cr-input slot="inputs" id="machineNameInput" required
+              hidden="[[!isDomainJoin]]" value="[[machineName]]"
+              disabled="[[disabled]]" invalid="[[machineNameInvalid]]"
+              pattern="[[machineNameInputPattern_]]"
+              label="[[getMachineNameLabel_(locale, selectedConfigOption_)]]"
+              on-keydown="onKeydownMachineNameInput_"
+              error-message="[[getMachineNameError_(locale, errorState,
+                  selectedConfigOption_)]]">
+          </cr-input>
+          <cr-input slot="inputs" id="userInput" required
+              invalid="[[userInvalid]]" domain="[[userRealm]]"
+                                        value="{{userName}}"
+              disabled="[[isInputDisabled_('ad_username',
+                                           selectedConfigOption_, disabled)]]"
+              label="[[i18nDynamic(locale, 'adAuthLoginUsername')]]"
+              on-keydown="onKeydownUserInput_"
+              error-message="[[i18nDynamic(locale, 'adLoginInvalidUsername')]]">
+            <span slot="suffix" hidden="[[domainHidden(userName)]]">
+              [[userRealm]]
+            </span>
+          </cr-input>
+          <cr-input slot="inputs" id="passwordInput" type="password" required
+              invalid="[[authPasswordInvalid]]"
+              disabled="[[isInputDisabled_('ad_password',
+                                           selectedConfigOption_, disabled)]]"
+              value="[[calculateInputValue_('passwordInput', 'ad_password',
+                                            selectedConfigOption_)]]"
+              label="[[i18nDynamic(locale, 'adLoginPassword')]]"
+              on-keydown="onKeydownAuthPasswordInput_"
+              error-message="[[i18nDynamic(locale, 'adLoginInvalidPassword')]]">
+          </cr-input>
+          <div class="flex layout horizontal start-justified">
+            <gaia-button id="moreOptionsBtn" type="link"
+                on-click="onMoreOptionsClicked_" hidden="[[!isDomainJoin]]"
+                disabled="[[disabled]]">
+              [[i18nDynamic(locale, 'adJoinMoreOptions')]]
+            </gaia-button>
           </div>
         </div>
-        <gaia-input-form on-submit="onSubmit_" id="adCreds"
-            disabled="[[disabled]]"
-            i18n-values="button-text:offlineLoginNextBtn"
-            hidden="[[unlockPasswordStep]]">
-          <gaia-input id="machineNameInput" required slot="inputs"
-              hidden="[[!isDomainJoin]]">
-            <div slot="label" i18n-content="oauthEnrollAdMachineNameInput">
-            </div>
-            <div slot="error">[[machineNameError]]</div>
-          </gaia-input>
-          <gaia-input slot="inputs" id="userInput" type="email" required
-              domain="[[userRealm]]">
-            <div slot="label">[[userNameLabel]]</div>
-            <div slot="error" i18n-content="adLoginInvalidUsername"></div>
-          </gaia-input>
-          <gaia-input slot="inputs" id="passwordInput" type="password" required>
-            <div slot="label" i18n-content="adLoginPassword"></div>
-            <div slot="error" i18n-content="adLoginInvalidPassword"></div>
-          </gaia-input>
-          <gaia-button id="backToUnlockButton" on-tap="onBackToUnlock_"
-              type="link" hidden>
-            $i18n{adUnlockPassword}
-          </gaia-button>
-          <gaia-button id="moreOptionsBtn" type="link"
-              on-tap="onMoreOptionsClicked_" hidden="[[!isDomainJoin]]">
-            $i18n{adJoinMoreOptions}
-          </gaia-button>
-        </gaia-input-form>
       </div>
-    </gaia-card>
+      <div slot="bottom-buttons" class="layout horizontal">
+        <oobe-back-button id="backToUnlockButton" on-click="onBackToUnlock_"
+            disabled="[[disabled]]" hidden></oobe-back-button>
+        <div class="flex"></div>
+        <oobe-next-button id="nextButton" on-click="onSubmit_"
+            disabled="[[disabled]]"></oobe-next-button>
+      </div>
+    </oobe-dialog>
 
     <cr-dialog id="moreOptionsDlg" on-close="onMoreOptionsClosed_">
       <div slot="title">
-        $i18n{adJoinMoreOptions}
+        [[i18nDynamic(locale, 'adJoinMoreOptions')]]
       </div>
       <div slot="body">
-        <gaia-input id="orgUnitInput" required>
-          <div slot="label" i18n-content="adJoinOrgUnit"></div>
-        </gaia-input>
+        <cr-input id="orgUnitInput"
+            disabled="[[isInputDisabled_('computer_ou',
+                                         selectedConfigOption_)]]"
+            label="[[i18nDynamic(locale, 'adJoinOrgUnit')]]"
+            value="[[calculateInputValue_('orgUnitInput', 'computer_ou',
+                                          selectedConfigOption_)]]">
+        </cr-input>
       </div>
       <div slot="body">
-        <div class="flex layout center horizontal justified">
-          <div class="layout vertical center-justified">
-            $i18n{selectEncryption}
+        <div class="flex layout center horizontal start-justified
+            encryption-select-row">
+          <div class="self-center select-title">
+            [[i18nDynamic(locale, 'selectEncryption')]]
           </div>
-          <select id="encryptionList" aria-label$="$i18{selectEncryption}"
-              class="md-select">
+          <select id="encryptionList"
+              aria-label$="[[i18nDynamic(locale, 'selectEncryption')]]"
+              class="md-select"
+              disabled="[[isInputDisabled_('encryption_types',
+                                           selectedConfigOption_)]]"
+              value="[[encryptionValue_]]">
           </select>
         </div>
-        <div class="flex layout center horizontal end-justified">
-          <iron-icon id="encryptionWarningIcon" icon="cr:warning" hidden>
+        <div class="flex layout center horizontal start-justified
+            encryption-subtitle">
+          <iron-icon id="encryptionWarningIcon" icon="cr:warning"
+              hidden="[[isEncryptionStrong_(encryptionValue_)]]">
           </iron-icon>
-          <div id="encryptionSubtitle" class="advanced-option-subtitle">
+          <div id="encryptionSubtitle">
+            [[encryptionSubtitle_(locale, encryptionValue_)]]
           </div>
         </div>
       </div>
       <div slot="button-container">
-        <paper-button autofocus on-tap="onMoreOptionsCancelTap_"
-            class="action-button">
-          $i18n{adJoinCancel}
-        </paper-button>
-        <paper-button autofocus on-tap="onMoreOptionsConfirmTap_"
-            class="action-button">
-          $i18n{adJoinConfirm}
-        </paper-button>
+        <oobe-text-button on-click="onMoreOptionsCancelTap_" autofocus>
+          <div>[[i18nDynamic(locale, 'adJoinCancel')]]</div>
+        </oobe-text-button>
+        <oobe-text-button id="moreOptionsSave"
+            on-click="onMoreOptionsConfirmTap_" inverse>
+          <div>[[i18nDynamic(locale, 'adJoinSave')]]</div>
+        </oobe-text-button>
       </div>
     </cr-dialog>
   </template>
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.js b/chrome/browser/resources/chromeos/login/offline_ad_login.js
index 5359c9fa..1086933 100644
--- a/chrome/browser/resources/chromeos/login/offline_ad_login.js
+++ b/chrome/browser/resources/chromeos/login/offline_ad_login.js
@@ -32,11 +32,13 @@
 Polymer({
   is: 'offline-ad-login',
 
+  behaviors: [I18nBehavior, OobeDialogHostBehavior],
+
   properties: {
     /**
      * Whether the UI disabled.
      */
-    disabled: {type: Boolean, value: false, observer: 'disabledChanged_'},
+    disabled: {type: Boolean, value: false, observer: 'disabledObserver_'},
     /**
      * Whether the screen is for domain join.
      */
@@ -44,7 +46,7 @@
     /**
      * Whether the unlock option should be shown.
      */
-    unlockPasswordStep: {type: Boolean, value: false},
+    unlockPasswordStep: {type: Boolean, value: false, observer: 'focus'},
     /**
      * The kerberos realm (AD Domain), the machine is part of.
      */
@@ -52,11 +54,19 @@
     /**
      * The user kerberos default realm. Used for autocompletion.
      */
-    userRealm: String,
+    userRealm: {type: String, value: ''},
+    /**
+     * Predefined machine name.
+     */
+    machineName: {type: String, value: ''},
+    /**
+     * Predefined user name.
+     */
+    userName: {type: String, value: '', observer: 'userNameObserver_'},
     /**
      * Label for the user input.
      */
-    userNameLabel: String,
+    userNameLabel: {type: String, value: ''},
     /**
      * Welcome message on top of the UI.
      */
@@ -64,14 +74,72 @@
     /**
      * Error message for the machine name input.
      */
-    machineNameError: String,
+    machineNameError: {type: String, value: ''},
+    /**
+     * Error state of the UI.
+     */
+    errorState: {
+      type: Number,
+      value: ACTIVE_DIRECTORY_ERROR_STATE.NONE,
+      observer: 'errorStateObserver_'
+    },
+    /**
+     * Whether machine name input should be invalid.
+     */
+    machineNameInvalid:
+        {type: Boolean, value: false, observer: 'machineNameInvalidObserver_'},
+    /**
+     * Whether username input should be invalid.
+     */
+    userInvalid:
+        {type: Boolean, value: false, observer: 'userInvalidObserver_'},
+    /**
+     * Whether user password input should be invalid.
+     */
+    authPasswordInvalid:
+        {type: Boolean, value: false, observer: 'authPasswordInvalidObserver_'},
+    /**
+     * Whether unlock password input should be invalid.
+     */
+    unlockPasswordInvalid: {
+      type: Boolean,
+      value: false,
+      observer: 'unlockPasswordInvalidObserver_'
+    },
+
+    /**
+     * Selected domain join configuration option.
+     * @private {!JoinConfigType|undefined}
+     */
+    selectedConfigOption_: {type: Object, value: {}},
+
+    /**
+     * Verification pattern for the machine name input.
+     * @private {string}
+     */
+    machineNameInputPattern_: {
+      type: String,
+      computed: 'getMachineNameInputPattern_(selectedConfigOption_)',
+    },
+
+    encryptionValue_: String,
   },
 
-  /** @private Used for 'More options' dialog. */
-  storedOrgUnit: String,
+  observers: [
+    'calculateUserInputValue_(selectedConfigOption_)',
+  ],
 
   /** @private Used for 'More options' dialog. */
-  storedEncryptionIndex: Number,
+  storedOrgUnit_: String,
+
+  /** @private Used for 'More options' dialog. */
+  storedEncryption_: String,
+
+  /**
+   * Previous selected domain join configuration option.
+   * @private {!JoinConfigType|undefined}
+   */
+  previousSelectedConfigOption_: undefined,
 
   /**
    * Maps encryption value to subtitle message.
@@ -93,10 +161,11 @@
   joinConfigOptions_: undefined,
 
   /**
-   * Selected domain join configuration option.
-   * @private {!JoinConfigType|undefined}
+   * Mutex on errorState. True when errorState is being updated from the C++
+   * side.
+   * @private {boolean}
    */
-  selectedConfigOption_: undefined,
+  errorStateLocked_: false,
 
   /** @private */
   realmChanged_: function() {
@@ -104,83 +173,65 @@
         loadTimeData.getStringF('adAuthWelcomeMessage', this.realm);
   },
 
-  /** @private */
-  disabledChanged_: function() {
-    this.$.gaiaCard.classList.toggle('disabled', this.disabled);
-    this.setInputsDisabled_();
-  },
-
   /** @override */
   ready: function() {
     if (!this.isDomainJoin)
       return;
+    this.setupEncList();
+  },
+
+  setupEncList: function() {
     var list = /** @type {!EncryptionSelectListType}>} */
         (loadTimeData.getValue('encryptionTypesList'));
-    for (var item of list)
+    for (var item of list) {
       this.encryptionValueToSubtitleMap[item.value] = item.subtitle;
-    list = /** @type {!SelectListType} */ (list.map(function(item) {
       delete item.subtitle;
-      return item;
-    }));
+    }
+    list = /** @type {!SelectListType} */ (list);
     setupSelect(
         this.$.encryptionList, list, this.onEncryptionSelected_.bind(this));
     this.defaultEncryption = /** @type {!string} */ (getSelectedValue(list));
-    this.onEncryptionSelected_(this.defaultEncryption);
+    this.encryptionValue_ = this.defaultEncryption;
     this.machineNameError =
         loadTimeData.getString('adJoinErrorMachineNameInvalid');
   },
 
   focus: function() {
-    if (this.isDomainJoin &&
-        /** @type {string} */ (this.$.machineNameInput.value) == '') {
+    if (this.unlockPasswordStep) {
+      this.$.unlockPasswordInput.focus();
+    } else if (this.isDomainJoin && !this.$.machineNameInput.value) {
       this.$.machineNameInput.focus();
-    } else if (/** @type {string} */ (this.$.userInput.value) == '') {
+    } else if (!this.$.userInput.value) {
       this.$.userInput.focus();
     } else {
       this.$.passwordInput.focus();
     }
   },
 
-  /**
-   * @param {string|undefined} user
-   * @param {string|undefined} machineName
-   */
-  setUser: function(user, machineName) {
-    if (this.userRealm && user)
-      user = user.replace(this.userRealm, '');
-    this.$.userInput.value = user || '';
-    this.$.machineNameInput.value = machineName || '';
-    this.focus();
+  errorStateObserver_: function() {
+    if (this.errorStateLocked_)
+      return;
+    // Prevent updateErrorStateOnInputInvalidStateChange_ from changing
+    // errorState.
+    this.errorStateLocked_ = true;
+    this.machineNameInvalid =
+        this.errorState == ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_INVALID ||
+        this.errorState == ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_TOO_LONG;
+    this.userInvalid =
+        this.errorState == ACTIVE_DIRECTORY_ERROR_STATE.BAD_USERNAME;
+    this.authPasswordInvalid =
+        this.errorState == ACTIVE_DIRECTORY_ERROR_STATE.BAD_AUTH_PASSWORD;
+    this.unlockPasswordInvalid =
+        this.errorState == ACTIVE_DIRECTORY_ERROR_STATE.BAD_UNLOCK_PASSWORD;
+    this.errorStateLocked_ = false;
   },
 
-  /**
-   * @param {ACTIVE_DIRECTORY_ERROR_STATE} error_state
-   */
-  setInvalid: function(error_state) {
-    this.resetValidity_();
-    switch (error_state) {
-      case ACTIVE_DIRECTORY_ERROR_STATE.NONE:
-        break;
-      case ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_INVALID:
-        this.machineNameError =
-            loadTimeData.getString('adJoinErrorMachineNameInvalid');
-        this.$.machineNameInput.isInvalid = true;
-        break;
-      case ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_TOO_LONG:
-        this.machineNameError =
-            loadTimeData.getString('adJoinErrorMachineNameTooLong');
-        this.$.machineNameInput.isInvalid = true;
-        break;
-      case ACTIVE_DIRECTORY_ERROR_STATE.BAD_USERNAME:
-        this.$.userInput.isInvalid = true;
-        break;
-      case ACTIVE_DIRECTORY_ERROR_STATE.BAD_AUTH_PASSWORD:
-        this.$.passwordInput.isInvalid = true;
-        break;
-      case ACTIVE_DIRECTORY_ERROR_STATE.BAD_UNLOCK_PASSWORD:
-        this.$.unlockPasswordInput.isInvalid = true;
-        break;
-    }
+  encryptionSubtitle_: function() {
+    return this.encryptionValueToSubtitleMap[this.encryptionValue_];
+  },
+
+  isEncryptionStrong_: function() {
+    return this.encryptionValue_ == this.defaultEncryption;
   },
 
   /**
@@ -206,23 +257,35 @@
 
   /** @private */
   onSubmit_: function() {
-    if (this.isDomainJoin && !this.$.machineNameInput.checkValidity())
+    if (this.disabled)
       return;
-    if (!this.$.userInput.checkValidity())
+
+    if (this.isDomainJoin) {
+      this.machineNameInvalid = !this.$.machineNameInput.validate();
+      if (this.machineNameInvalid)
+        return;
+    }
+
+    this.userInvalid = !this.$.userInput.validate();
+    if (this.userInvalid)
       return;
-    if (!this.$.passwordInput.checkValidity())
+
+    this.authPasswordInvalid = !this.$.passwordInput.validate();
+    if (this.authPasswordInvalid)
       return;
+
     var user = /** @type {string} */ (this.$.userInput.value);
     if (!user.includes('@') && this.userRealm)
       user += this.userRealm;
     var msg = {
-      'machinename': this.$.machineNameInput.value,
       'distinguished_name': this.$.orgUnitInput.value,
       'username': user,
       'password': this.$.passwordInput.value
     };
-    if (this.isDomainJoin)
+    if (this.isDomainJoin) {
+      msg['machine_name'] = this.$.machineNameInput.value;
       msg['encryption_types'] = this.$.encryptionList.value;
+    }
     this.fire('authCompleted', msg);
   },
 
@@ -230,33 +293,33 @@
   onMoreOptionsClicked_: function() {
     this.disabled = true;
     this.fire('dialogShown');
-    this.storedOrgUnit = this.$.orgUnitInput.value;
-    this.storedEncryptionIndex = this.$.encryptionList.selectedIndex;
-    this.$$('#moreOptionsDlg').showModal();
-    this.$$('#gaiaCard').classList.add('full-disabled');
+    this.storedOrgUnit_ = this.$.orgUnitInput.value;
+    this.storedEncryption_ = this.$.encryptionList.value;
+    this.$.moreOptionsDlg.showModal();
   },
 
   /** @private */
   onMoreOptionsConfirmTap_: function() {
-    this.storedOrgUnit = null;
-    this.storedEncryptionIndex = -1;
-    this.$$('#moreOptionsDlg').close();
+    this.storedOrgUnit_ = null;
+    this.storedEncryption_ = null;
+    this.$.moreOptionsDlg.close();
   },
 
   /** @private */
   onMoreOptionsCancelTap_: function() {
-    this.$$('#moreOptionsDlg').close();
+    this.$.moreOptionsDlg.close();
   },
 
   /** @private */
   onMoreOptionsClosed_: function() {
-    if (this.storedOrgUnit)
-      this.$.orgUnitInput.value = this.storedOrgUnit;
-    if (this.storedEncryptionIndex != -1)
-      this.$.encryptionList.selectedIndex = this.storedEncryptionIndex;
+    if (this.storedOrgUnit_ != null)
+      this.$.orgUnitInput.value = this.storedOrgUnit_;
+    if (this.storedEncryption_ != null) {
+      this.$.encryptionList.value = this.storedEncryption_;
+      this.encryptionValue_ = this.$.encryptionList.value;
+    }
     this.fire('dialogHidden');
     this.disabled = false;
-    this.$$('#gaiaCard').classList.remove('full-disabled');
   },
 
   /** @private */
@@ -275,6 +338,8 @@
 
   /** @private */
   onBackToUnlock_: function() {
+    if (this.disabled)
+      return;
     this.unlockPasswordStep = true;
   },
 
@@ -283,60 +348,195 @@
    * @param {!string} value
    * */
   onEncryptionSelected_: function(value) {
-    this.$.encryptionSubtitle.innerHTML =
-        this.encryptionValueToSubtitleMap[value];
-    this.$.encryptionWarningIcon.hidden = (value == this.defaultEncryption);
+    this.encryptionValue_ = value;
   },
 
   /** @private */
   onJoinConfigSelected_: function(value) {
-    this.resetValidity_();
+    if (this.selectedConfigOption_ == this.joinConfigOptions_[value])
+      return;
+    this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+    this.previousSelectedConfigOption_ = this.selectedConfigOption_;
     this.selectedConfigOption_ = this.joinConfigOptions_[value];
     var option = this.selectedConfigOption_;
-    this.$.userInput.value = option['ad_username'] || '';
-    this.$.passwordInput.value = option['ad_password'] || '';
-    this.$.orgUnitInput.value = option['computer_ou'] || '';
-
     var encryptionTypes =
         option['encryption_types'] || DEFAULT_ENCRYPTION_TYPES;
     if (!(encryptionTypes in this.encryptionValueToSubtitleMap)) {
       encryptionTypes = DEFAULT_ENCRYPTION_TYPES;
     }
-    this.$.encryptionList.value = encryptionTypes;
-    this.onEncryptionSelected_(encryptionTypes);
+    this.encryptionValue_ = encryptionTypes;
+    this.focus();
+  },
+  /**
+   * Returns pattern for checking machine name input.
+   *
+   * @param {Object} option Value of this.selectedConfigOption_.
+   * @return {string} Regular expression.
+   * @private
+   */
+  getMachineNameInputPattern_: function(option) {
+    return option['computer_name_validation_regex'];
+  },
 
-    var pattern = option['computer_name_validation_regex'];
-    this.$.machineNameInput.pattern = pattern;
-    if (pattern) {
-      this.$.machineNameInput.label = loadTimeData.getStringF(
-          'oauthEnrollAdMachineNameInputRegex', pattern);
-      this.machineNameError = loadTimeData.getStringF(
-          'adJoinErrorMachineNameDoesntMatchRegex', pattern);
-    } else {
-      this.$.machineNameInput.label =
-          loadTimeData.getString('oauthEnrollAdMachineNameInput');
-      this.machineNameError =
-          loadTimeData.getString('adJoinErrorMachineNameInvalid');
+  /**
+   * Sets username according to |option|.
+   * @param {!JoinConfigType} option Value of this.selectedConfigOption_;
+   * @private
+   */
+  calculateUserInputValue_: function(option) {
+    this.userName =
+        this.calculateInputValue_('userInput', 'ad_username', option);
+  },
+
+  /**
+   * Returns new input value when selected config option is changed.
+   *
+   * @param {string} inputElementId Id of the input element.
+   * @param {string} key Input element key
+   * @param {!JoinConfigType} option Value of this.selectedConfigOption_;
+   * @return {string} New input value.
+   * @private
+   */
+  calculateInputValue_: function(inputElementId, key, option) {
+    if (option && key in option)
+      return option[key];
+
+    if (this.previousSelectedConfigOption_ &&
+        key in this.previousSelectedConfigOption_)
+      return '';
+
+    // No changes.
+    return this.$[inputElementId].value;
+  },
+
+  /**
+   * Returns true if input with the given key should be disabled.
+   *
+   * @param {boolean} disabledAll Value of this.disabled.
+   * @param {string} key Input key.
+   * @param {Object} option Value of this.selectedConfigOption_;
+   * @private
+   */
+  isInputDisabled_: function(key, option, disabledAll) {
+    return disabledAll || (key in option);
+  },
+
+  /**
+   * Returns true if "Machine name is invalid" error should be displayed.
+   * @param {ACTIVE_DIRECTORY_ERROR_STATE} errorState
+   */
+  isMachineNameInvalid_: function(errorState) {
+    return errorState != ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_TOO_LONG;
+  },
+
+  getMachineNameLabel_: function(locale) {
+    if (this.machineNameInputPattern_) {
+      return this.i18nDynamic(
+          locale, 'oauthEnrollAdMachineNameInputRegex',
+          this.machineNameInputPattern_);
     }
-    this.setInputsDisabled_();
+    return this.i18nDynamic(locale, 'oauthEnrollAdMachineNameInput');
   },
 
-  /** @private */
-  setInputsDisabled_: function() {
-    var option = this.selectedConfigOption_;
-    if (!option)
+  getMachineNameError_: function(locale, errorState) {
+    if (errorState == ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_TOO_LONG)
+      return this.i18nDynamic(locale, 'adJoinErrorMachineNameTooLong');
+    if (errorState == ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_INVALID) {
+      if (this.machineNameInputPattern_) {
+        return this.i18nDynamic(locale, 'adJoinErrorMachineNameInvalidFormat');
+      }
+    }
+    return this.i18nDynamic(locale, 'adJoinErrorMachineNameInvalid');
+  },
+
+  i18nUpdateLocale: function() {
+    this.setupEncList();
+    I18nBehavior.i18nUpdateLocale.call(this);
+  },
+
+  onKeydownUnlockPassword_: function(e) {
+    if (e.key == 'Enter') {
+      if (this.$.unlockPasswordInput.value.length == 0)
+        this.onSkipClicked_();
+      else
+        this.onUnlockPasswordEntered_();
+    }
+    this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+  },
+
+  onKeydownMachineNameInput_: function(e) {
+    this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+    if (e.key == 'Enter') {
+      this.switchTo_('userInput') || this.switchTo_('passwordInput') ||
+          this.onSubmit_();
+    }
+  },
+
+  onKeydownUserInput_: function(e) {
+    this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+    if (e.key == 'Enter')
+      this.switchTo_('passwordInput') || this.onSubmit_();
+  },
+
+  userNameObserver_: function() {
+    if (this.userRealm && this.userName &&
+        this.userName.endsWith(this.userRealm)) {
+      this.userName = this.userName.replace(this.userRealm, '');
+    }
+  },
+
+  domainHidden: function(userName) {
+    return userName && userName.includes('@');
+  },
+
+  onKeydownAuthPasswordInput_: function(e) {
+    this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+    if (e.key == 'Enter')
+      this.onSubmit_();
+  },
+
+  switchTo_: function(inputId) {
+    if (!this.$[inputId].disabled && this.$[inputId].value.length == 0) {
+      this.$[inputId].focus();
+      return true;
+    }
+    return false;
+  },
+
+  machineNameInvalidObserver_: function(isInvalid) {
+    this.setErrorState_(
+        isInvalid, ACTIVE_DIRECTORY_ERROR_STATE.MACHINE_NAME_INVALID);
+  },
+
+  userInvalidObserver_: function(isInvalid) {
+    this.setErrorState_(isInvalid, ACTIVE_DIRECTORY_ERROR_STATE.BAD_USERNAME);
+  },
+
+  authPasswordInvalidObserver_: function(isInvalid) {
+    this.setErrorState_(
+        isInvalid, ACTIVE_DIRECTORY_ERROR_STATE.BAD_AUTH_PASSWORD);
+  },
+
+  unlockPasswordInvalidObserver_: function(isInvalid) {
+    this.setErrorState_(
+        isInvalid, ACTIVE_DIRECTORY_ERROR_STATE.BAD_UNLOCK_PASSWORD);
+  },
+
+  setErrorState_: function(isInvalid, error) {
+    if (this.errorStateLocked_)
       return;
-    this.$.userInput.disabled = ('ad_username' in option);
-    this.$.passwordInput.disabled = ('ad_password' in option);
-    this.$.orgUnitInput.disabled = ('computer_ou' in option);
-    this.$.encryptionList.disabled = ('encryption_types' in option);
+    this.errorStateLocked_ = true;
+    if (isInvalid)
+      this.errorState = error;
+    else
+      this.errorState = ACTIVE_DIRECTORY_ERROR_STATE.NONE;
+    this.errorStateLocked_ = false;
   },
 
-  /** @private */
-  resetValidity_: function() {
-    this.$.machineNameInput.isInvalid = false;
-    this.$.userInput.isInvalid = false;
-    this.$.passwordInput.isInvalid = false;
-    this.$.unlockPasswordInput.isInvalid = false;
+  disabledObserver_: function(disabled) {
+    if (disabled)
+      this.$.credsStep.classList.add('full-disabled');
+    else
+      this.$.credsStep.classList.remove('full-disabled');
   },
 });
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog_host_behavior.js b/chrome/browser/resources/chromeos/login/oobe_dialog_host_behavior.js
index ba7787b..0a44337 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog_host_behavior.js
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog_host_behavior.js
@@ -24,7 +24,7 @@
   /**
    * Triggers onBeforeShow for elements matched by |selector|.
    * and sets |fullScreenDialog| attribute on them.
-   * @param {string} selector CSS selector.
+   * @param {string=} selector CSS selector (optional).
    */
   propagateFullScreenMode: function(selector) {
     if (!selector)
@@ -51,7 +51,7 @@
 
   /**
    * Triggers updateLocalizedContent() for elements matched by |selector|.
-   * @param {string} selector CSS selector.
+   * @param {string=} selector CSS selector (optional).
    */
   propagateUpdateLocalizedContent: function(selector) {
     if (!selector)
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.html b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.html
index 284b968..1079636 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.html
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.html
@@ -46,8 +46,7 @@
     <div id="oauth-enroll-step-ad-join">
       <offline-ad-login id="oauth-enroll-ad-join-ui" is-domain-join
           class="fit" i18n-values=
-              "ad-welcome-message:oauthEnrollAdDomainJoinWelcomeMessage;
-              user-name-label:adEnrollmentLoginUsername">
+              "ad-welcome-message:oauthEnrollAdDomainJoinWelcomeMessage">
       </offline-ad-login>
     </div>
     <div id="oauth-enroll-step-error" role="alert">
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
index 432c447..2a48d04 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_oauth_enrollment.js
@@ -136,7 +136,7 @@
       this.offlineAdUi_.addEventListener('authCompleted', function(e) {
         this.offlineAdUi_.disabled = true;
         chrome.send('oauthEnrollAdCompleteLogin', [
-          e.detail.machinename, e.detail.distinguished_name,
+          e.detail.machine_name, e.detail.distinguished_name,
           e.detail.encryption_types, e.detail.username, e.detail.password
         ]);
       }.bind(this));
@@ -297,6 +297,7 @@
       this.isManualEnrollment_ = data.enrollment_mode === 'manual';
       this.navigation_.disabled = false;
 
+      this.offlineAdUi_.onBeforeShow();
       this.showStep(data.attestationBased ? STEP_WORKING : STEP_SIGNIN);
     },
 
@@ -450,8 +451,9 @@
     setAdJoinParams: function(
         machineName, userName, errorState, showUnlockConfig) {
       this.offlineAdUi_.disabled = false;
-      this.offlineAdUi_.setUser(userName, machineName);
-      this.offlineAdUi_.setInvalid(errorState);
+      this.offlineAdUi_.machineName = machineName;
+      this.offlineAdUi_.userName = userName;
+      this.offlineAdUi_.errorState = errorState;
       this.offlineAdUi_.unlockPasswordStep = showUnlockConfig;
     },
 
@@ -538,7 +540,10 @@
      */
     onEnrollmentFinished_: function() {
       chrome.send('oauthEnrollClose', ['done']);
-    }
+    },
 
+    updateLocalizedContent: function() {
+      this.offlineAdUi_.i18nUpdateLocale();
+    },
   };
 });
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
index 3349e8bd..6fe4cb51 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
@@ -23,8 +23,7 @@
           hidden>
       </saml-interstitial>
       <offline-ad-login id="offline-ad-auth" class="fit gaia-dialog" hidden
-          i18n-values="ad-welcome-message:adAuthWelcomeMessage;
-                       user-name-label:adAuthLoginUsername">
+          i18n-values="ad-welcome-message:adAuthWelcomeMessage">
       </offline-ad-login>
     </div>
   </div>
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index f613d79..cc6646f 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -584,6 +584,7 @@
       this.lastBackMessageValue_ = false;
       this.updateControlsState();
 
+      $('offline-ad-auth').onBeforeShow();
       return $('signin-frame-dialog').onBeforeShow();
     },
 
@@ -723,6 +724,10 @@
             .insertBefore($('offline-gaia'), $('gaia-step-contents'));
         $('offline-gaia').removeAttribute('not-a-dialog');
         $('offline-gaia').classList.toggle('fit', false);
+        $('gaia-signin')
+            .insertBefore($('offline-ad-auth'), $('gaia-step-contents'));
+        $('offline-ad-auth').removeAttribute('not-a-dialog');
+        $('offline-ad-auth').classList.toggle('fit', false);
       } else {
         $('gaia-signin-form-container').appendChild($('signin-frame'));
         $('gaia-signin-form-container')
@@ -789,7 +794,8 @@
       let oldState = this.classList.contains('v2');
       this.classList.toggle('v2', false);
       if ((this.screenMode_ == ScreenMode.DEFAULT ||
-           this.screenMode_ == ScreenMode.OFFLINE) &&
+           this.screenMode_ == ScreenMode.OFFLINE ||
+           this.screenMode_ == ScreenMode.AD_AUTH) &&
           this.chromeOSApiVersion_ == 2) {
         this.classList.toggle('v2', true);
       }
@@ -1261,16 +1267,16 @@
     loadAdAuth: function(params) {
       this.loading = true;
       this.startLoadingTimer_();
-      var ADAuthUI = this.getSigninFrame_();
-      if ('realm' in params)
-        ADAuthUI.realm = params['realm'];
+      var adAuthUI = this.getSigninFrame_();
+      adAuthUI.realm = params['realm'];
 
       if ('emailDomain' in params)
-        ADAuthUI.userRealm = '@' + params['emailDomain'];
+        adAuthUI.userRealm = '@' + params['emailDomain'];
       else if ('realm' in params)
-        ADAuthUI.userRealm = '@' + params['realm'];
+        adAuthUI.userRealm = '@' + params['realm'];
 
-      ADAuthUI.setUser(params['email']);
+      adAuthUI.userName = params['email'];
+      adAuthUI.focus();
       this.onAuthReady_();
     },
 
@@ -1307,8 +1313,8 @@
       if (this.screenMode_ != ScreenMode.AD_AUTH)
         return;
       var adAuthUI = this.getSigninFrame_();
-      adAuthUI.setUser(username);
-      adAuthUI.setInvalid(errorState);
+      adAuthUI.userName = username;
+      adAuthUI.errorState = errorState;
       this.authCompleted_ = false;
       this.loading = false;
       Oobe.getInstance().headerHidden = false;
diff --git a/chrome/browser/resources/omnibox/omnibox.html b/chrome/browser/resources/omnibox/omnibox.html
index 7360c58..6839821 100644
--- a/chrome/browser/resources/omnibox/omnibox.html
+++ b/chrome/browser/resources/omnibox/omnibox.html
@@ -12,59 +12,56 @@
   <script src="omnibox.js"></script>
 </head>
 <body>
-  <div class="input-section">
-    <form id="omnibox-input-form" action="">
-      <p>
-        Enter omnibox input text:
-        <input id="input-text" type="text" size="40" autofocus>
-      </p>
-      <p>Input parameters:</p>
-      <p>
-        <label>
-          <input id="prevent-inline-autocomplete" type="checkbox">
-          Prevent inline autocomplete
-        </label>
-      </p>
-      <p>
-        <label>
-          <input id="prefer-keyword" type="checkbox">
-          In keyword mode
-        </label>
-      </p>
-      <p>
-        Current page context:
-        <select id="page-classification">
-          <option value="0">Invalid spec</option>
-          <option value="1">(OBSOLETE) new tab page</option>
-          <option value="2">about:blank</option>
-          <option value="3">user's home page</option>
-          <option value="4">arbitrary URL</option>
-          <option value="6">search result page doing search term replacement</option>
-          <option value="9">search result page not doing search term replacement</option>
-          <option value="7" selected>new tab page with focus in omnibox</option>
-          <option value="8">new tab page with focus in fakebox</option>
-        </select>
-      </p>
-      <p>Display parameters:</p>
-      <p>
-        <label>
-          <input id="show-incomplete-results" type="checkbox">
-          Show incomplete results
-        </label>
-      </p>
-      <p>
-        <label>
-          <input id="show-details" type="checkbox">
-          Show all details
-        </label>
-      </p>
-      <p>
-        <label>
-          <input id="show-all-providers" type="checkbox">
-          Show results per provider, not just merged results
-        </label>
-      </p>
-    </form>
+  <div id="omnibox-input-form" class="input-section">
+    <p>
+      <input id="input-text" type="text" size="60" placeholder="Enter omnibox input text" autofocus>
+    </p>
+    <p>Input parameters:</p>
+    <p>
+      <label>
+        <input id="prevent-inline-autocomplete" type="checkbox">
+        Prevent inline autocomplete
+      </label>
+    </p>
+    <p>
+      <label>
+        <input id="prefer-keyword" type="checkbox">
+        In keyword mode
+      </label>
+    </p>
+    <p>
+      Current page context:
+      <select id="page-classification">
+        <option value="0">Invalid spec</option>
+        <option value="2">about:blank</option>
+        <option value="3">user's home page</option>
+        <option value="4">arbitrary URL</option>
+        <option value="9">search result page not doing search term replacement</option>
+        <option value="7" selected>new tab page omnibox</option>
+        <option value="8">new tab page fakebox</option>
+        <option value="1">(OBSOLETE) new tab page</option>
+        <option value="6">(OBSOLETE) search result page doing search term replacement</option>
+      </select>
+    </p>
+    <p>Display parameters:</p>
+    <p>
+      <label>
+        <input id="show-incomplete-results" type="checkbox">
+        Show incomplete results
+      </label>
+    </p>
+    <p>
+      <label>
+        <input id="show-details" type="checkbox">
+        Show all details
+      </label>
+    </p>
+    <p>
+      <label>
+        <input id="show-all-providers" type="checkbox">
+        Show results per provider, not just merged results
+      </label>
+    </p>
   </div>
   <div id="omnibox-debug-text"></div>
 </body>
diff --git a/chrome/browser/resources/policy.html b/chrome/browser/resources/policy.html
index b142a6ab..23d0eef2 100644
--- a/chrome/browser/resources/policy.html
+++ b/chrome/browser/resources/policy.html
@@ -63,6 +63,22 @@
         <div class="enterprise-display-domain"></div>
       </div>
       <div class="status-entry" hidden>
+        <div class="label">$i18n{labelMachineEnrollmentMachineName}</div>
+        <div class="machine-enrollment-name"></div>
+      </div>
+      <div class="status-entry" hidden>
+        <div class="label">$i18n{labelMachineEnrollmentDomain}</div>
+        <div class="machine-enrollment-domain"></div>
+      </div>
+      <div class="status-entry" hidden>
+        <div class="label">$i18n{labelMachineEnrollmentToken}</div>
+        <div class="machine-enrollment-token"></div>
+      </div>
+      <div class="status-entry" hidden>
+        <div class="label">$i18n{labelMachineEntrollmentDeviceId}</div>
+        <div class="machine-enrollment-device-id"></div>
+      </div>
+      <div class="status-entry" hidden>
         <div class="label">$i18n{labelUsername}</div>
         <div class="username"></div>
       </div>
@@ -70,7 +86,7 @@
         <div class="label">$i18n{labelGaiaId}</div>
         <div class="gaia-id"></div>
       </div>
-      <div class="status-entry">
+      <div class="status-entry" hidden>
         <div class="label">$i18n{labelClientId}</div>
         <div class="client-id"></div>
       </div>
@@ -99,6 +115,7 @@
         <div class="status"></div>
       </div>
     </fieldset>
+
     <table>
       <tbody id="policy-template">
         <tr>
diff --git a/chrome/browser/resources/policy_base.js b/chrome/browser/resources/policy_base.js
index f3baef42..200722b 100644
--- a/chrome/browser/resources/policy_base.js
+++ b/chrome/browser/resources/policy_base.js
@@ -16,7 +16,7 @@
   };
 
   /**
-   * A box that shows the status of cloud policy for a device or user.
+   * A box that shows the status of cloud policy for a device, machine or user.
    * @constructor
    * @extends {HTMLFieldSetElement}
    */
@@ -36,64 +36,77 @@
     decorate: function() {},
 
     /**
+     * Sets the text of a particular named label element in the status box
+     * and updates the visibility if needed.
+     * @param {string} labelName The name of the label element that is being
+     *     updated.
+     * @param {string} labelValue The new text content for the label.
+     * @param {boolean=} needsToBeShown True if we want to show the label
+     *     False otherwise.
+     */
+    setLabelAndShow_: function(labelName, labelValue, needsToBeShown = true) {
+      var labelElement = this.querySelector(labelName);
+      labelElement.textContent = labelValue || '';
+      if (needsToBeShown)
+        labelElement.parentElement.hidden = false;
+    },
+    /**
      * Populate the box with the given cloud policy status.
-     * @param {string} scope The policy scope, either "device" or "user".
+     * @param {string} scope The policy scope, either "device", "machine", or
+     *     "user".
      * @param {Object} status Dictionary with information about the status.
      */
     initialize: function(scope, status) {
+      const notSpecifiedString = loadTimeData.getString('notSpecified');
       if (scope == 'device') {
         // For device policy, set the appropriate title and populate the topmost
         // status item with the domain the device is enrolled into.
         this.querySelector('.legend').textContent =
             loadTimeData.getString('statusDevice');
-        var enrollmentDomain =
-            this.querySelector('.enterprise-enrollment-domain');
-        enrollmentDomain.textContent = status.enterpriseEnrollmentDomain;
-        enrollmentDomain.parentElement.hidden = false;
-        var displayDomain = this.querySelector('.enterprise-display-domain');
-        displayDomain.textContent = status.enterpriseDisplayDomain;
-        displayDomain.parentElement.hidden = false;
+        this.setLabelAndShow_(
+            '.enterprise-enrollment-domain', status.enterpriseEnrollmentDomain);
+        this.setLabelAndShow_(
+            '.enterprise-display-domain', status.enterpriseDisplayDomain);
 
         // Populate the device naming information.
         // Populate the asset identifier.
-        var assetId = this.querySelector('.asset-id');
-        assetId.textContent =
-            status.assetId || loadTimeData.getString('notSpecified');
-        assetId.parentElement.hidden = false;
+        this.setLabelAndShow_(
+            '.asset-id', status.assetId || notSpecifiedString);
 
         // Populate the device location.
-        var location = this.querySelector('.location');
-        location.textContent =
-            status.location || loadTimeData.getString('notSpecified');
-        location.parentElement.hidden = false;
+        this.setLabelAndShow_(
+            '.location', status.location || notSpecifiedString);
 
         // Populate the directory API ID.
-        var directoryApiId = this.querySelector('.directory-api-id');
-        directoryApiId.textContent =
-            status.directoryApiId || loadTimeData.getString('notSpecified');
-        directoryApiId.parentElement.hidden = false;
+        this.setLabelAndShow_(
+            '.directory-api-id', status.directoryApiId || notSpecifiedString);
+        this.setLabelAndShow_('.client-id', status.clientId);
+      } else if (scope == 'machine') {
+        // For machine policy, set the appropriate title and populate
+        // machine enrollment status with the information that applies
+        // to this machine.
+        this.querySelector('.legend').textContent =
+            loadTimeData.getString('statusMachine');
+        this.setLabelAndShow_('.machine-enrollment-device-id', status.deviceId);
+        this.setLabelAndShow_(
+            '.machine-enrollment-token', status.enrollmentToken);
+        this.setLabelAndShow_('.machine-enrollment-name', status.machine);
+        this.setLabelAndShow_('.machine-enrollment-domain', status.domain);
       } else {
         // For user policy, set the appropriate title and populate the topmost
         // status item with the username that policies apply to.
         this.querySelector('.legend').textContent =
             loadTimeData.getString('statusUser');
         // Populate the topmost item with the username.
-        var username = this.querySelector('.username');
-        username.textContent = status.username;
-        username.parentElement.hidden = false;
+        this.setLabelAndShow_('.username', status.username);
         // Populate the user gaia id.
-        var gaiaId = this.querySelector('.gaia-id');
-        gaiaId.textContent =
-            status.gaiaId || loadTimeData.getString('notSpecified');
-        gaiaId.parentElement.hidden = false;
+        this.setLabelAndShow_('.gaia-id', status.gaiaId || notSpecifiedString);
+        this.setLabelAndShow_('.client-id', status.clientId);
       }
-      // Populate all remaining items.
-      this.querySelector('.client-id').textContent = status.clientId || '';
-      this.querySelector('.time-since-last-refresh').textContent =
-          status.timeSinceLastRefresh || '';
-      this.querySelector('.refresh-interval').textContent =
-          status.refreshInterval || '';
-      this.querySelector('.status').textContent = status.status || '';
+      this.setLabelAndShow_(
+          '.time-since-last-refresh', status.timeSinceLastRefresh, false);
+      this.setLabelAndShow_('.refresh-interval', status.refreshInterval, false);
+      this.setLabelAndShow_('.status', status.status, false);
     },
   };
 
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 4593c0c..b70faadc 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -50,9 +50,6 @@
       "cocoa/animatable_image.mm",
       "cocoa/animatable_view.h",
       "cocoa/animatable_view.mm",
-      "cocoa/apps/chrome_app_window_client_views_cocoa.mm",
-      "cocoa/apps/native_app_window_cocoa.h",
-      "cocoa/apps/native_app_window_cocoa.mm",
       "cocoa/background_gradient_view.h",
       "cocoa/background_gradient_view.mm",
       "cocoa/browser/exclusive_access_controller_views.h",
@@ -129,8 +126,6 @@
       "cocoa/fullscreen_window.h",
       "cocoa/fullscreen_window.mm",
       "cocoa/has_weak_browser_pointer.h",
-      "cocoa/hover_close_button.h",
-      "cocoa/hover_close_button.mm",
       "cocoa/javascript_app_modal_dialog_cocoa.h",
       "cocoa/javascript_app_modal_dialog_cocoa.mm",
       "cocoa/location_bar/location_bar_view_mac.h",
@@ -148,8 +143,6 @@
       "cocoa/simple_message_box_cocoa.mm",
       "cocoa/single_web_contents_dialog_manager_cocoa.h",
       "cocoa/single_web_contents_dialog_manager_cocoa.mm",
-      "cocoa/spinner_view.h",
-      "cocoa/spinner_view.mm",
       "cocoa/ssl_client_certificate_selector_cocoa.h",
       "cocoa/ssl_client_certificate_selector_cocoa.mm",
       "cocoa/spinner_util.h",
@@ -165,25 +158,6 @@
       "cocoa/tab_contents/tab_contents_controller.mm",
       "cocoa/tabbed_browser_window.h",
       "cocoa/tabbed_browser_window.mm",
-      "cocoa/tabs/tab_controller.h",
-      "cocoa/tabs/tab_controller.mm",
-      "cocoa/tabs/tab_controller_target.h",
-      "cocoa/tabs/tab_favicon_view.h",
-      "cocoa/tabs/tab_favicon_view.mm",
-      "cocoa/tabs/tab_spinner_view.h",
-      "cocoa/tabs/tab_spinner_view.mm",
-      "cocoa/tabs/tab_strip_background_view.h",
-      "cocoa/tabs/tab_strip_background_view.mm",
-      "cocoa/tabs/tab_strip_controller.h",
-      "cocoa/tabs/tab_strip_controller.mm",
-      "cocoa/tabs/tab_strip_drag_controller.h",
-      "cocoa/tabs/tab_strip_drag_controller.mm",
-      "cocoa/tabs/tab_strip_model_observer_bridge.h",
-      "cocoa/tabs/tab_strip_model_observer_bridge.mm",
-      "cocoa/tabs/tab_strip_view.h",
-      "cocoa/tabs/tab_strip_view.mm",
-      "cocoa/tabs/tab_view.h",
-      "cocoa/tabs/tab_view.mm",
       "cocoa/tabs/tab_window_controller.h",
       "cocoa/tabs/tab_window_controller.mm",
       "cocoa/themed_window.h",
diff --git a/chrome/browser/ui/apps/chrome_app_window_client.h b/chrome/browser/ui/apps/chrome_app_window_client.h
index 53b7874..2ad1146 100644
--- a/chrome/browser/ui/apps/chrome_app_window_client.h
+++ b/chrome/browser/ui/apps/chrome_app_window_client.h
@@ -46,13 +46,6 @@
   static extensions::NativeAppWindow* CreateNativeAppWindowImpl(
       extensions::AppWindow* window,
       const extensions::AppWindow::CreateParams& params);
-#if defined(OS_MACOSX)
-  // Temporary shim for Polychrome. See bottom of first comment in
-  // https://crbug.com/804950 for details
-  static extensions::NativeAppWindow* CreateNativeAppWindowImplCocoa(
-      extensions::AppWindow* window,
-      const extensions::AppWindow::CreateParams& params);
-#endif
 
   DISALLOW_COPY_AND_ASSIGN(ChromeAppWindowClient);
 };
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc
index 52c7f3e1..16577f9 100644
--- a/chrome/browser/ui/browser_focus_uitest.cc
+++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -34,7 +34,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/omnibox/browser/autocomplete_match_type.h"
 #include "components/omnibox/browser/omnibox_edit_controller.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
@@ -176,9 +175,6 @@
       }
     }
   }
-
- private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 };
 
 // A test interstitial page with typical HTML contents.
diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
index c6ffa0b..252b8c72 100644
--- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
+++ b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
@@ -14,7 +14,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
-#import "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h"
 #include "chrome/grit/generated_resources.h"
 #include "extensions/browser/app_window/app_window.h"
 #include "extensions/common/extension.h"
diff --git a/chrome/browser/ui/cocoa/apps/chrome_app_window_client_views_cocoa.mm b/chrome/browser/ui/cocoa/apps/chrome_app_window_client_views_cocoa.mm
deleted file mode 100644
index 908b66e..0000000
--- a/chrome/browser/ui/cocoa/apps/chrome_app_window_client_views_cocoa.mm
+++ /dev/null
@@ -1,47 +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.
-
-#include "chrome/browser/ui/apps/chrome_app_window_client.h"
-
-#include "base/command_line.h"
-#import "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h"
-#include "chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h"
-#include "chrome/common/chrome_switches.h"
-#include "ui/base/ui_features.h"
-
-namespace {
-
-bool UseMacViewsNativeAppWindows() {
-  const base::CommandLine* command_line =
-      base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kEnableMacViewsNativeAppWindows))
-    return true;
-  if (command_line->HasSwitch(switches::kDisableMacViewsNativeAppWindows))
-    return false;
-  return false;  // Current default.
-}
-
-}  // namespace
-
-// static
-extensions::NativeAppWindow*
-ChromeAppWindowClient::CreateNativeAppWindowImplCocoa(
-    extensions::AppWindow* app_window,
-    const extensions::AppWindow::CreateParams& params) {
-  if (UseMacViewsNativeAppWindows()) {
-    ChromeNativeAppWindowViewsMac* window = new ChromeNativeAppWindowViewsMac;
-    window->Init(app_window, params);
-    return window;
-  }
-
-  return new NativeAppWindowCocoa(app_window, params);
-}
-
-#if !BUILDFLAG(MAC_VIEWS_BROWSER)
-extensions::NativeAppWindow* ChromeAppWindowClient::CreateNativeAppWindowImpl(
-    extensions::AppWindow* app_window,
-    const extensions::AppWindow::CreateParams& params) {
-  return CreateNativeAppWindowImplCocoa(app_window, params);
-}
-#endif
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
deleted file mode 100644
index f82d3b88..0000000
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h
+++ /dev/null
@@ -1,229 +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 CHROME_BROWSER_UI_COCOA_APPS_NATIVE_APP_WINDOW_COCOA_H_
-#define CHROME_BROWSER_UI_COCOA_APPS_NATIVE_APP_WINDOW_COCOA_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/mac/scoped_nsobject.h"
-#include "base/macros.h"
-#include "content/public/browser/web_contents_observer.h"
-#include "extensions/browser/app_window/app_window.h"
-#include "extensions/browser/app_window/native_app_window.h"
-#include "extensions/browser/app_window/size_constraints.h"
-#include "extensions/common/draggable_region.h"
-#include "ui/base/accelerators/accelerator_manager.h"
-#include "ui/gfx/geometry/rect.h"
-
-@class AppNSWindow;
-class ExtensionKeybindingRegistryCocoa;
-class NativeAppWindowCocoa;
-class SkRegion;
-
-// A window controller for a minimal window to host a web app view. Passes
-// Objective-C notifications to the C++ bridge.
-@interface NativeAppWindowController : NSWindowController<NSWindowDelegate> {
- @private
-  NativeAppWindowCocoa* appWindow_;  // Weak; owns self.
-  base::scoped_nsobject<NSView> titlebar_background_view_;
-}
-
-@property(assign, nonatomic) NativeAppWindowCocoa* appWindow;
-
-// NativeAppWindowController will retain this view and call
-// -[NSView setNeedsDisplay:YES] when the window changes main status. This is
-// necessary because it does not always happen. See http://crbug.com/508722.
-- (void)setTitlebarBackgroundView:(NSView*)view;
-
-// Consults the Command Registry to see if this |event| needs to be handled as
-// an extension command and returns YES if so (NO otherwise).
-// Only extensions with the given |priority| are considered.
-- (BOOL)handledByExtensionCommand:(NSEvent*)event
-    priority:(ui::AcceleratorManager::HandlerPriority)priority;
-
-@end
-
-// Cocoa bridge to AppWindow.
-class NativeAppWindowCocoa : public extensions::NativeAppWindow,
-                             public content::WebContentsObserver {
- public:
-  NativeAppWindowCocoa(extensions::AppWindow* app_window,
-                       const extensions::AppWindow::CreateParams& params);
-
-  // ui::BaseWindow implementation.
-  bool IsActive() const override;
-  bool IsMaximized() const override;
-  bool IsMinimized() const override;
-  bool IsFullscreen() const override;
-  gfx::NativeWindow GetNativeWindow() const override;
-  gfx::Rect GetRestoredBounds() const override;
-  ui::WindowShowState GetRestoredState() const override;
-  gfx::Rect GetBounds() const override;
-  void Show() override;
-  void ShowInactive() override;
-  void Hide() override;
-  bool IsVisible() const override;
-  void Close() override;
-  void Activate() override;
-  void Deactivate() override;
-  void Maximize() override;
-  void Minimize() override;
-  void Restore() override;
-  void SetBounds(const gfx::Rect& bounds) override;
-  void FlashFrame(bool flash) override;
-  bool IsAlwaysOnTop() const override;
-
-  // Called when the window is about to be closed.
-  void WindowWillClose();
-
-  // Called when the window is focused.
-  void WindowDidBecomeKey();
-
-  // Called when the window is defocused.
-  void WindowDidResignKey();
-
-  // Called when the window finishes resizing, i.e. after zoom/unzoom, after
-  // entering/leaving fullscreen, and after a user is done resizing.
-  void WindowDidFinishResize();
-
-  // Called when the window is resized. This is called repeatedly during a
-  // zoom/unzoom, and while a user is resizing.
-  void WindowDidResize();
-
-  // Called when the window is moved.
-  void WindowDidMove();
-
-  // Called when the window is minimized.
-  void WindowDidMiniaturize();
-
-  // Called when the window is un-minimized.
-  void WindowDidDeminiaturize();
-
-  // Called when the window is zoomed (maximized or de-maximized).
-  void WindowWillZoom();
-
-  // Called when the window enters fullscreen.
-  void WindowDidEnterFullscreen();
-
-  // Called when the window exits fullscreen.
-  void WindowDidExitFullscreen();
-
-  // Called to handle a key event.
-  bool HandledByExtensionCommand(
-      NSEvent* event,
-      ui::AcceleratorManager::HandlerPriority priority);
-
-  // Returns true if |point| in local Cocoa coordinate system falls within
-  // the draggable region.
-  bool IsWithinDraggableRegion(NSPoint point) const;
-
-  NSRect restored_bounds() const { return restored_bounds_; }
-
- protected:
-  // NativeAppWindow implementation.
-  void SetFullscreen(int fullscreen_types) override;
-  bool IsFullscreenOrPending() const override;
-  void UpdateWindowIcon() override;
-  void UpdateWindowTitle() override;
-  void UpdateShape(std::unique_ptr<ShapeRects> rects) override;
-  void UpdateDraggableRegions(
-      const std::vector<extensions::DraggableRegion>& regions) override;
-  SkRegion* GetDraggableRegion() override;
-  void HandleKeyboardEvent(
-      const content::NativeWebKeyboardEvent& event) override;
-  bool IsFrameless() const override;
-  bool HasFrameColor() const override;
-  SkColor ActiveFrameColor() const override;
-  SkColor InactiveFrameColor() const override;
-  gfx::Insets GetFrameInsets() const override;
-  bool CanHaveAlphaEnabled() const override;
-  void SetActivateOnPointer(bool activate_on_pointer) override;
-
-  // These are used to simulate Mac-style hide/show. Since windows can be hidden
-  // and shown using the app.window API, this sets is_hidden_with_app_ to
-  // differentiate the reason a window was hidden.
-  void ShowWithApp() override;
-  void HideWithApp() override;
-  gfx::Size GetContentMinimumSize() const override;
-  gfx::Size GetContentMaximumSize() const override;
-  void SetContentSizeConstraints(const gfx::Size& min_size,
-                                 const gfx::Size& max_size) override;
-  void SetVisibleOnAllWorkspaces(bool always_visible) override;
-
-  // WebContentsObserver implementation.
-  void RenderViewCreated(content::RenderViewHost* rvh) override;
-
-  void SetAlwaysOnTop(bool always_on_top) override;
-
-  // WebContentsModalDialogHost implementation.
-  gfx::NativeView GetHostView() const override;
-  gfx::Point GetDialogPosition(const gfx::Size& size) override;
-  gfx::Size GetMaximumDialogSize() override;
-  void AddObserver(web_modal::ModalDialogHostObserver* observer) override;
-  void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override;
-
- private:
-  ~NativeAppWindowCocoa() override;
-
-  AppNSWindow* window() const;
-  content::WebContents* WebContents() const;
-
-  // Returns the WindowStyleMask based on the type of window frame.
-  // This includes NSResizableWindowMask if the window is resizable.
-  NSUInteger GetWindowStyleMask() const;
-
-  void InstallView();
-  void UninstallView();
-  void UpdateDraggableRegionViews();
-
-  // Cache |restored_bounds_| only if the window is currently restored.
-  void UpdateRestoredBounds();
-
-  // Hides the window unconditionally. Used by Hide and HideWithApp.
-  void HideWithoutMarkingHidden();
-
-  extensions::AppWindow* app_window_;  // weak - AppWindow owns NativeAppWindow.
-
-  bool has_frame_;
-
-  // Whether this window last became hidden due to a request to hide the entire
-  // app, e.g. via the dock menu or Cmd+H. This is set by Hide/ShowWithApp.
-  bool is_hidden_with_app_;
-
-  bool is_maximized_;
-  bool is_fullscreen_;
-  NSRect restored_bounds_;
-
-  bool is_resizable_;
-  bool shows_resize_controls_;
-  bool shows_fullscreen_controls_;
-
-  extensions::SizeConstraints size_constraints_;
-
-  bool has_frame_color_;
-  SkColor active_frame_color_;
-  SkColor inactive_frame_color_;
-
-  base::scoped_nsobject<NativeAppWindowController> window_controller_;
-
-  // For system drag, the whole window is draggable and the non-draggable areas
-  // have to been explicitly excluded.
-  std::vector<extensions::DraggableRegion> draggable_regions_;
-
-  // The Extension Command Registry used to determine which keyboard events to
-  // handle.
-  std::unique_ptr<ExtensionKeybindingRegistryCocoa>
-      extension_keybinding_registry_;
-
-  // Tracks the last time the extension asked the window to activate.
-  base::Time last_activate_;
-
-  DISALLOW_COPY_AND_ASSIGN(NativeAppWindowCocoa);
-};
-
-#endif  // CHROME_BROWSER_UI_COCOA_APPS_NATIVE_APP_WINDOW_COCOA_H_
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
deleted file mode 100644
index 1e76f71..0000000
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa.mm
+++ /dev/null
@@ -1,848 +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 "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h"
-
-#include "base/command_line.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mac_util.h"
-#include "base/mac/sdk_forward_declarations.h"
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
-#include "chrome/browser/profiles/profile.h"
-#import "chrome/browser/ui/cocoa/apps/titlebar_background_view.h"
-#include "chrome/browser/ui/cocoa/browser_window_utils.h"
-#import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
-#include "chrome/browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa.h"
-#include "chrome/common/chrome_switches.h"
-#include "content/public/browser/native_web_keyboard_event.h"
-#include "content/public/browser/web_contents.h"
-#include "extensions/common/extension.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "third_party/skia/include/core/SkRegion.h"
-#import "ui/gfx/mac/nswindow_frame_controls.h"
-#include "ui/gfx/skia_util.h"
-
-// NOTE: State Before Update.
-//
-// Internal state, such as |is_maximized_|, must be set before the window
-// state is changed so that it is accurate when e.g. a resize results in a call
-// to |OnNativeWindowChanged|.
-
-// NOTE: Maximize and Zoom.
-//
-// Zooming is implemented manually in order to implement maximize functionality
-// and to support non resizable windows. The window will be resized explicitly
-// in the |WindowWillZoom| call.
-//
-// Attempting maximize and restore functionality with non resizable windows
-// using the native zoom method did not work, even with
-// windowWillUseStandardFrame, as the window would not restore back to the
-// desired size.
-
-using extensions::AppWindow;
-
-@interface NSWindow (NSPrivateNativeAppWindowApis)
-- (void)setBottomCornerRounded:(BOOL)rounded;
-- (BOOL)_isTitleHidden;
-@end
-
-namespace {
-
-const int kActivateThrottlePeriodSeconds = 2;
-
-NSRect GfxToCocoaBounds(gfx::Rect bounds) {
-  typedef AppWindow::BoundsSpecification BoundsSpecification;
-
-  NSRect main_screen_rect = [[[NSScreen screens] firstObject] frame];
-
-  // If coordinates are unspecified, center window on primary screen.
-  if (bounds.x() == BoundsSpecification::kUnspecifiedPosition)
-    bounds.set_x(floor((NSWidth(main_screen_rect) - bounds.width()) / 2));
-  if (bounds.y() == BoundsSpecification::kUnspecifiedPosition)
-    bounds.set_y(floor((NSHeight(main_screen_rect) - bounds.height()) / 2));
-
-  // Convert to Mac coordinates.
-  NSRect cocoa_bounds = NSRectFromCGRect(bounds.ToCGRect());
-  cocoa_bounds.origin.y = NSHeight(main_screen_rect) - NSMaxY(cocoa_bounds);
-  return cocoa_bounds;
-}
-
-// Return a vector of non-draggable regions that fill a window of size
-// |width| by |height|, but leave gaps where the window should be draggable.
-std::vector<gfx::Rect> CalculateNonDraggableRegions(
-    const std::vector<extensions::DraggableRegion>& regions,
-    int width,
-    int height) {
-  std::vector<gfx::Rect> result;
-  if (regions.empty()) {
-    result.push_back(gfx::Rect(0, 0, width, height));
-  } else {
-    std::unique_ptr<SkRegion> draggable(
-        AppWindow::RawDraggableRegionsToSkRegion(regions));
-    std::unique_ptr<SkRegion> non_draggable(new SkRegion);
-    non_draggable->op(0, 0, width, height, SkRegion::kUnion_Op);
-    non_draggable->op(*draggable, SkRegion::kDifference_Op);
-    for (SkRegion::Iterator it(*non_draggable); !it.done(); it.next()) {
-      result.push_back(gfx::SkIRectToRect(it.rect()));
-    }
-  }
-  return result;
-}
-
-}  // namespace
-
-@implementation NativeAppWindowController
-
-@synthesize appWindow = appWindow_;
-
-- (void)setTitlebarBackgroundView:(NSView*)view {
-  titlebar_background_view_.reset([view retain]);
-}
-
-- (void)windowWillClose:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowWillClose();
-}
-
-- (void)windowDidBecomeKey:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidBecomeKey();
-}
-
-- (void)windowDidResignKey:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidResignKey();
-}
-
-- (void)windowDidBecomeMain:(NSNotification*)notification {
-  [titlebar_background_view_ setNeedsDisplay:YES];
-}
-
-- (void)windowDidResignMain:(NSNotification*)notification {
-  [titlebar_background_view_ setNeedsDisplay:YES];
-}
-
-- (void)windowDidResize:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidResize();
-}
-
-- (void)windowDidEndLiveResize:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidFinishResize();
-}
-
-- (void)windowDidEnterFullScreen:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidEnterFullscreen();
-}
-
-- (void)windowDidExitFullScreen:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidExitFullscreen();
-}
-
-- (void)windowDidMove:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidMove();
-}
-
-- (void)windowDidMiniaturize:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidMiniaturize();
-}
-
-- (void)windowDidDeminiaturize:(NSNotification*)notification {
-  if (appWindow_)
-    appWindow_->WindowDidDeminiaturize();
-}
-
-- (BOOL)windowShouldZoom:(NSWindow*)window
-                 toFrame:(NSRect)newFrame {
-  if (appWindow_)
-    appWindow_->WindowWillZoom();
-  return NO;  // See top of file NOTE: Maximize and Zoom.
-}
-
-// Allow non resizable windows (without NSResizableWindowMask) to enter
-// fullscreen by passing through the full size in willUseFullScreenContentSize.
-- (NSSize)window:(NSWindow *)window
-    willUseFullScreenContentSize:(NSSize)proposedSize {
-  return proposedSize;
-}
-
-- (BOOL)handledByExtensionCommand:(NSEvent*)event
-    priority:(ui::AcceleratorManager::HandlerPriority)priority {
-  if (appWindow_)
-    return appWindow_->HandledByExtensionCommand(event, priority);
-  return NO;
-}
-
-@end
-
-@interface AppNSWindow : ChromeEventProcessingWindow
-@end
-
-@implementation AppNSWindow
-
-// Similar to ChromeBrowserWindow, don't draw the title, but allow it to be seen
-// in menus, Expose, etc.
-- (BOOL)_isTitleHidden {
-  return YES;
-}
-
-@end
-
-@interface AppFramelessNSWindow : AppNSWindow
-@end
-
-@implementation AppFramelessNSWindow
-
-+ (NSRect)frameRectForContentRect:(NSRect)contentRect
-                        styleMask:(NSUInteger)mask {
-  return contentRect;
-}
-
-+ (NSRect)contentRectForFrameRect:(NSRect)frameRect
-                        styleMask:(NSUInteger)mask {
-  return frameRect;
-}
-
-- (NSRect)frameRectForContentRect:(NSRect)contentRect {
-  return contentRect;
-}
-
-- (NSRect)contentRectForFrameRect:(NSRect)frameRect {
-  return frameRect;
-}
-
-@end
-
-@interface ControlRegionView : NSView
-@end
-
-@implementation ControlRegionView
-
-- (BOOL)mouseDownCanMoveWindow {
-  return NO;
-}
-
-- (NSView*)hitTest:(NSPoint)aPoint {
-  return nil;
-}
-
-@end
-
-@interface NSView (WebContentsView)
-- (void)setMouseDownCanMoveWindow:(BOOL)can_move;
-@end
-
-NativeAppWindowCocoa::NativeAppWindowCocoa(
-    AppWindow* app_window,
-    const AppWindow::CreateParams& params)
-    : app_window_(app_window),
-      has_frame_(params.frame == AppWindow::FRAME_CHROME),
-      is_hidden_with_app_(false),
-      is_maximized_(false),
-      is_fullscreen_(false),
-      is_resizable_(params.resizable),
-      shows_resize_controls_(true),
-      shows_fullscreen_controls_(true),
-      has_frame_color_(params.has_frame_color),
-      active_frame_color_(params.active_frame_color),
-      inactive_frame_color_(params.inactive_frame_color) {
-  Observe(WebContents());
-
-  Class window_class = has_frame_ ?
-      [AppNSWindow class] : [AppFramelessNSWindow class];
-
-  // Estimate the initial bounds of the window. Once the frame insets are known,
-  // the window bounds and constraints can be set precisely.
-  NSRect cocoa_bounds = GfxToCocoaBounds(
-      params.GetInitialWindowBounds(gfx::Insets()));
-  base::scoped_nsobject<NSWindow> window([[window_class alloc]
-      initWithContentRect:cocoa_bounds
-                styleMask:GetWindowStyleMask()
-                  backing:NSBackingStoreBuffered
-                    defer:NO]);
-  [window setReleasedWhenClosed:NO];  // Owned by the window controller.
-
-  std::string name;
-  const extensions::Extension* extension = app_window_->GetExtension();
-  if (extension)
-    name = extension->name();
-  [window setTitle:base::SysUTF8ToNSString(name)];
-  [[window contentView] setWantsLayer:YES];
-
-  if (params.always_on_top)
-    gfx::SetNSWindowAlwaysOnTop(window, true);
-
-  gfx::SetNSWindowVisibleOnAllWorkspaces(window,
-                                         params.visible_on_all_workspaces);
-
-  window_controller_.reset(
-      [[NativeAppWindowController alloc] initWithWindow:window]);
-
-  if (has_frame_ && has_frame_color_) {
-    TitlebarBackgroundView* view =
-        [TitlebarBackgroundView addToNSWindow:window
-                                  activeColor:active_frame_color_
-                                inactiveColor:inactive_frame_color_];
-    [window_controller_ setTitlebarBackgroundView:view];
-  }
-
-  NSView* view = WebContents()->GetNativeView();
-  [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
-
-  InstallView();
-
-  [window setDelegate:window_controller_];
-  [window_controller_ setAppWindow:this];
-
-  // We can now compute the precise window bounds and constraints.
-  gfx::Insets insets = GetFrameInsets();
-  SetBounds(params.GetInitialWindowBounds(insets));
-  SetContentSizeConstraints(params.GetContentMinimumSize(insets),
-                            params.GetContentMaximumSize(insets));
-
-  // Initialize |restored_bounds_|.
-  restored_bounds_ = [window frame];
-
-  extension_keybinding_registry_.reset(new ExtensionKeybindingRegistryCocoa(
-      Profile::FromBrowserContext(app_window_->browser_context()),
-      window,
-      extensions::ExtensionKeybindingRegistry::PLATFORM_APPS_ONLY,
-      NULL));
-}
-
-NSUInteger NativeAppWindowCocoa::GetWindowStyleMask() const {
-  NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask |
-                          NSMiniaturizableWindowMask |
-                          NSTexturedBackgroundWindowMask;
-  if (shows_resize_controls_)
-    style_mask |= NSResizableWindowMask;
-  return style_mask;
-}
-
-void NativeAppWindowCocoa::InstallView() {
-  NSView* view = WebContents()->GetNativeView();
-  if (has_frame_) {
-    [view setFrame:[[window() contentView] bounds]];
-    [[window() contentView] addSubview:view];
-    if (!shows_fullscreen_controls_)
-      [[window() standardWindowButton:NSWindowZoomButton] setEnabled:NO];
-    if (!shows_resize_controls_)
-      [window() setShowsResizeIndicator:NO];
-  } else {
-    // TODO(jeremya): find a cleaner way to send this information to the
-    // WebContentsViewCocoa view.
-    DCHECK([view
-        respondsToSelector:@selector(setMouseDownCanMoveWindow:)]);
-    [view setMouseDownCanMoveWindow:YES];
-
-    NSView* frameView = [[window() contentView] superview];
-    [view setFrame:[frameView bounds]];
-    [frameView addSubview:view];
-
-    [[window() standardWindowButton:NSWindowZoomButton] setHidden:YES];
-    [[window() standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
-    [[window() standardWindowButton:NSWindowCloseButton] setHidden:YES];
-
-    // Some third-party OS X utilities check the zoom button's enabled state to
-    // determine whether to show custom UI on hover, so we disable it here to
-    // prevent them from doing so in a frameless app window.
-    [[window() standardWindowButton:NSWindowZoomButton] setEnabled:NO];
-
-    UpdateDraggableRegionViews();
-  }
-}
-
-void NativeAppWindowCocoa::UninstallView() {
-  NSView* view = WebContents()->GetNativeView();
-  [view removeFromSuperview];
-}
-
-bool NativeAppWindowCocoa::IsActive() const {
-  return [window() isKeyWindow];
-}
-
-bool NativeAppWindowCocoa::IsMaximized() const {
-  return is_maximized_ && !IsMinimized();
-}
-
-bool NativeAppWindowCocoa::IsMinimized() const {
-  return [window() isMiniaturized];
-}
-
-bool NativeAppWindowCocoa::IsFullscreen() const {
-  return is_fullscreen_;
-}
-
-void NativeAppWindowCocoa::SetFullscreen(int fullscreen_types) {
-  bool fullscreen = (fullscreen_types != AppWindow::FULLSCREEN_TYPE_NONE);
-  if (fullscreen == is_fullscreen_)
-    return;
-
-  // 10.11 posts an _endLiveResize event just before exiting fullscreen, so
-  // ensure the window reports as fullscreen while the window is transitioning
-  // to ensure the window bounds are not incorrectly captured as the last known
-  // restored bounds.
-  if (fullscreen)
-    is_fullscreen_ = true;
-
-  // If going fullscreen, but the window is constrained (fullscreen UI control
-  // is disabled), temporarily enable it. It will be disabled again on leaving
-  // fullscreen.
-  if (fullscreen && !shows_fullscreen_controls_)
-    gfx::SetNSWindowCanFullscreen(window(), true);
-  [window() toggleFullScreen:nil];
-  is_fullscreen_ = fullscreen;
-}
-
-bool NativeAppWindowCocoa::IsFullscreenOrPending() const {
-  return is_fullscreen_;
-}
-
-gfx::NativeWindow NativeAppWindowCocoa::GetNativeWindow() const {
-  return window();
-}
-
-gfx::Rect NativeAppWindowCocoa::GetRestoredBounds() const {
-  // Flip coordinates based on the primary screen.
-  NSScreen* screen = [[NSScreen screens] firstObject];
-  NSRect frame = restored_bounds_;
-  gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame));
-  bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame));
-  return bounds;
-}
-
-ui::WindowShowState NativeAppWindowCocoa::GetRestoredState() const {
-  if (IsMaximized())
-    return ui::SHOW_STATE_MAXIMIZED;
-  if (IsFullscreen())
-    return ui::SHOW_STATE_FULLSCREEN;
-  return ui::SHOW_STATE_NORMAL;
-}
-
-gfx::Rect NativeAppWindowCocoa::GetBounds() const {
-  // Flip coordinates based on the primary screen.
-  NSScreen* screen = [[NSScreen screens] firstObject];
-  NSRect frame = [window() frame];
-  gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame));
-  bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame));
-  return bounds;
-}
-
-void NativeAppWindowCocoa::Show() {
-  if (is_hidden_with_app_) {
-    apps::ExtensionAppShimHandler::Get()->UnhideWithoutActivationForWindow(
-        app_window_);
-    is_hidden_with_app_ = false;
-  }
-
-  // Workaround for http://crbug.com/459306. When requests to change key windows
-  // on Mac overlap, AppKit may attempt to make two windows simultaneously have
-  // key status. This causes key events to go the wrong window, and key status
-  // to get "stuck" until Chrome is deactivated. To reduce the possibility of
-  // this occurring, throttle activation requests. To balance a possible Hide(),
-  // always show the window, but don't make it key.
-  base::Time now = base::Time::Now();
-  if (now - last_activate_ <
-      base::TimeDelta::FromSeconds(kActivateThrottlePeriodSeconds)) {
-    [window() orderFront:window_controller_];
-    return;
-  }
-
-  last_activate_ = now;
-
-  [window() makeKeyAndOrderFront:nil];
-  [NSApp activateIgnoringOtherApps:YES];
-}
-
-void NativeAppWindowCocoa::ShowInactive() {
-  [window() orderFront:window_controller_];
-}
-
-void NativeAppWindowCocoa::Hide() {
-  HideWithoutMarkingHidden();
-}
-
-bool NativeAppWindowCocoa::IsVisible() const {
-  return [window() isVisible];
-}
-
-void NativeAppWindowCocoa::Close() {
-  [window() close];
-}
-
-void NativeAppWindowCocoa::Activate() {
-  Show();
-}
-
-void NativeAppWindowCocoa::Deactivate() {
-  // TODO(jcivelli): http://crbug.com/51364 Implement me.
-  NOTIMPLEMENTED();
-}
-
-void NativeAppWindowCocoa::Maximize() {
-  if (is_fullscreen_)
-    return;
-
-  UpdateRestoredBounds();
-  is_maximized_ = true;  // See top of file NOTE: State Before Update.
-  [window() setFrame:[[window() screen] visibleFrame] display:YES animate:YES];
-  if (IsMinimized())
-    [window() deminiaturize:window_controller_];
-}
-
-void NativeAppWindowCocoa::Minimize() {
-  [window() miniaturize:window_controller_];
-}
-
-void NativeAppWindowCocoa::Restore() {
-  DCHECK(!IsFullscreenOrPending());   // SetFullscreen, not Restore, expected.
-
-  if (is_maximized_) {
-    is_maximized_ = false;  // See top of file NOTE: State Before Update.
-    [window() setFrame:restored_bounds() display:YES animate:YES];
-  }
-  if (IsMinimized())
-    [window() deminiaturize:window_controller_];
-}
-
-void NativeAppWindowCocoa::SetBounds(const gfx::Rect& bounds) {
-  // Enforce minimum/maximum bounds.
-  gfx::Rect checked_bounds = bounds;
-
-  NSSize min_size = [window() minSize];
-  if (bounds.width() < min_size.width)
-    checked_bounds.set_width(min_size.width);
-  if (bounds.height() < min_size.height)
-    checked_bounds.set_height(min_size.height);
-  NSSize max_size = [window() maxSize];
-  if (checked_bounds.width() > max_size.width)
-    checked_bounds.set_width(max_size.width);
-  if (checked_bounds.height() > max_size.height)
-    checked_bounds.set_height(max_size.height);
-
-  NSRect cocoa_bounds = GfxToCocoaBounds(checked_bounds);
-  [window() setFrame:cocoa_bounds display:YES];
-  // setFrame: without animate: does not trigger a windowDidEndLiveResize: so
-  // call it here.
-  WindowDidFinishResize();
-}
-
-void NativeAppWindowCocoa::UpdateWindowIcon() {
-  // TODO(junmin): implement.
-}
-
-void NativeAppWindowCocoa::UpdateWindowTitle() {
-  base::string16 title = app_window_->GetTitle();
-  [window() setTitle:base::SysUTF16ToNSString(title)];
-}
-
-void NativeAppWindowCocoa::UpdateShape(std::unique_ptr<ShapeRects> rects) {
-  NOTIMPLEMENTED();
-}
-
-void NativeAppWindowCocoa::UpdateDraggableRegions(
-    const std::vector<extensions::DraggableRegion>& regions) {
-  // Draggable region is not supported for non-frameless window.
-  if (has_frame_)
-    return;
-
-  draggable_regions_ = regions;
-  UpdateDraggableRegionViews();
-}
-
-SkRegion* NativeAppWindowCocoa::GetDraggableRegion() {
-  return NULL;
-}
-
-void NativeAppWindowCocoa::HandleKeyboardEvent(
-    const content::NativeWebKeyboardEvent& event) {
-  if (event.skip_in_browser ||
-      event.GetType() == content::NativeWebKeyboardEvent::kChar) {
-    return;
-  }
-  [[window() commandDispatcher] redispatchKeyEvent:event.os_event];
-}
-
-void NativeAppWindowCocoa::UpdateDraggableRegionViews() {
-  if (has_frame_)
-    return;
-
-  // All ControlRegionViews should be added as children of the WebContentsView,
-  // because WebContentsView will be removed and re-added when entering and
-  // leaving fullscreen mode.
-  NSView* webView = WebContents()->GetNativeView();
-  NSInteger webViewWidth = NSWidth([webView bounds]);
-  NSInteger webViewHeight = NSHeight([webView bounds]);
-
-  // Remove all ControlRegionViews that are added last time.
-  // Note that [webView subviews] returns the view's mutable internal array and
-  // it should be copied to avoid mutating the original array while enumerating
-  // it.
-  base::scoped_nsobject<NSArray> subviews([[webView subviews] copy]);
-  for (NSView* subview in subviews.get())
-    if ([subview isKindOfClass:[ControlRegionView class]])
-      [subview removeFromSuperview];
-
-  // Draggable regions is implemented by having the whole web view draggable
-  // (mouseDownCanMoveWindow) and overlaying regions that are not draggable.
-  std::vector<gfx::Rect> system_drag_exclude_areas =
-      CalculateNonDraggableRegions(
-          draggable_regions_, webViewWidth, webViewHeight);
-
-  // Create and add a ControlRegionView for each region that needs to be
-  // excluded from the dragging.
-  for (std::vector<gfx::Rect>::const_iterator iter =
-           system_drag_exclude_areas.begin();
-       iter != system_drag_exclude_areas.end();
-       ++iter) {
-    base::scoped_nsobject<NSView> controlRegion(
-        [[ControlRegionView alloc] initWithFrame:NSZeroRect]);
-    [controlRegion setFrame:NSMakeRect(iter->x(),
-                                       webViewHeight - iter->bottom(),
-                                       iter->width(),
-                                       iter->height())];
-    [webView addSubview:controlRegion];
-  }
-}
-
-void NativeAppWindowCocoa::FlashFrame(bool flash) {
-  apps::ExtensionAppShimHandler::Get()->RequestUserAttentionForWindow(
-      app_window_, flash ? apps::APP_SHIM_ATTENTION_CRITICAL
-                         : apps::APP_SHIM_ATTENTION_CANCEL);
-}
-
-bool NativeAppWindowCocoa::IsAlwaysOnTop() const {
-  return gfx::IsNSWindowAlwaysOnTop(window());
-}
-
-void NativeAppWindowCocoa::RenderViewCreated(content::RenderViewHost* rvh) {
-  if (IsActive())
-    WebContents()->RestoreFocus();
-}
-
-bool NativeAppWindowCocoa::IsFrameless() const {
-  return !has_frame_;
-}
-
-bool NativeAppWindowCocoa::HasFrameColor() const {
-  return has_frame_color_;
-}
-
-SkColor NativeAppWindowCocoa::ActiveFrameColor() const {
-  return active_frame_color_;
-}
-
-SkColor NativeAppWindowCocoa::InactiveFrameColor() const {
-  return inactive_frame_color_;
-}
-
-gfx::Insets NativeAppWindowCocoa::GetFrameInsets() const {
-  if (!has_frame_)
-    return gfx::Insets();
-
-  // Flip the coordinates based on the main screen.
-  NSInteger screen_height =
-      NSHeight([[[NSScreen screens] firstObject] frame]);
-
-  NSRect frame_nsrect = [window() frame];
-  gfx::Rect frame_rect(NSRectToCGRect(frame_nsrect));
-  frame_rect.set_y(screen_height - NSMaxY(frame_nsrect));
-
-  NSRect content_nsrect = [window() contentRectForFrameRect:frame_nsrect];
-  gfx::Rect content_rect(NSRectToCGRect(content_nsrect));
-  content_rect.set_y(screen_height - NSMaxY(content_nsrect));
-
-  return frame_rect.InsetsFrom(content_rect);
-}
-
-bool NativeAppWindowCocoa::CanHaveAlphaEnabled() const {
-  return false;
-}
-
-void NativeAppWindowCocoa::SetActivateOnPointer(bool activate_on_pointer) {
-  NOTIMPLEMENTED();
-}
-
-gfx::NativeView NativeAppWindowCocoa::GetHostView() const {
-  return WebContents()->GetNativeView();
-}
-
-gfx::Point NativeAppWindowCocoa::GetDialogPosition(const gfx::Size& size) {
-  NOTIMPLEMENTED();
-  return gfx::Point();
-}
-
-gfx::Size NativeAppWindowCocoa::GetMaximumDialogSize() {
-  NOTIMPLEMENTED();
-  return gfx::Size();
-}
-
-void NativeAppWindowCocoa::AddObserver(
-    web_modal::ModalDialogHostObserver* observer) {
-  NOTIMPLEMENTED();
-}
-
-void NativeAppWindowCocoa::RemoveObserver(
-    web_modal::ModalDialogHostObserver* observer) {
-  NOTIMPLEMENTED();
-}
-
-void NativeAppWindowCocoa::WindowWillClose() {
-  [window_controller_ setAppWindow:NULL];
-  app_window_->OnNativeWindowChanged();
-  app_window_->OnNativeClose();
-}
-
-void NativeAppWindowCocoa::WindowDidBecomeKey() {
-  app_window_->OnNativeWindowActivated();
-
-  WebContents()->RestoreFocus();
-}
-
-void NativeAppWindowCocoa::WindowDidResignKey() {
-  // If our app is still active and we're still the key window, ignore this
-  // message, since it just means that a menu extra (on the "system status bar")
-  // was activated; we'll get another |-windowDidResignKey| if we ever really
-  // lose key window status.
-  if ([NSApp isActive] && ([NSApp keyWindow] == window()))
-    return;
-
-  WebContents()->StoreFocus();
-}
-
-void NativeAppWindowCocoa::WindowDidFinishResize() {
-  // Update |is_maximized_| if needed:
-  // - Exit maximized state if resized.
-  // - Consider us maximized if resize places us back to maximized location.
-  //   This happens when returning from fullscreen.
-  NSRect frame = [window() frame];
-  NSRect screen = [[window() screen] visibleFrame];
-  if (!NSEqualSizes(frame.size, screen.size))
-    is_maximized_ = false;
-  else if (NSEqualPoints(frame.origin, screen.origin))
-    is_maximized_ = true;
-
-  UpdateRestoredBounds();
-}
-
-void NativeAppWindowCocoa::WindowDidResize() {
-  app_window_->OnNativeWindowChanged();
-  UpdateDraggableRegionViews();
-}
-
-void NativeAppWindowCocoa::WindowDidMove() {
-  UpdateRestoredBounds();
-  app_window_->OnNativeWindowChanged();
-}
-
-void NativeAppWindowCocoa::WindowDidMiniaturize() {
-  app_window_->OnNativeWindowChanged();
-}
-
-void NativeAppWindowCocoa::WindowDidDeminiaturize() {
-  app_window_->OnNativeWindowChanged();
-}
-
-void NativeAppWindowCocoa::WindowDidEnterFullscreen() {
-  is_maximized_ = false;
-  is_fullscreen_ = true;
-  app_window_->OnNativeWindowChanged();
-}
-
-void NativeAppWindowCocoa::WindowDidExitFullscreen() {
-  is_fullscreen_ = false;
-  if (!shows_fullscreen_controls_)
-    gfx::SetNSWindowCanFullscreen(window(), false);
-
-  WindowDidFinishResize();
-
-  app_window_->OnNativeWindowChanged();
-}
-
-void NativeAppWindowCocoa::WindowWillZoom() {
-  // See top of file NOTE: Maximize and Zoom.
-  if (IsMaximized())
-    Restore();
-  else
-    Maximize();
-}
-
-bool NativeAppWindowCocoa::HandledByExtensionCommand(
-    NSEvent* event,
-    ui::AcceleratorManager::HandlerPriority priority) {
-  return extension_keybinding_registry_->ProcessKeyEvent(
-      content::NativeWebKeyboardEvent(event), priority);
-}
-
-void NativeAppWindowCocoa::ShowWithApp() {
-  is_hidden_with_app_ = false;
-  if (!app_window_->is_hidden())
-    ShowInactive();
-}
-
-void NativeAppWindowCocoa::HideWithApp() {
-  is_hidden_with_app_ = true;
-  HideWithoutMarkingHidden();
-}
-
-gfx::Size NativeAppWindowCocoa::GetContentMinimumSize() const {
-  return size_constraints_.GetMinimumSize();
-}
-
-gfx::Size NativeAppWindowCocoa::GetContentMaximumSize() const {
-  return size_constraints_.GetMaximumSize();
-}
-
-void NativeAppWindowCocoa::SetContentSizeConstraints(
-    const gfx::Size& min_size, const gfx::Size& max_size) {
-  // Update the size constraints.
-  size_constraints_.set_minimum_size(min_size);
-  size_constraints_.set_maximum_size(max_size);
-
-  // Update the window controls.
-  shows_resize_controls_ =
-      is_resizable_ && !size_constraints_.HasFixedSize();
-  shows_fullscreen_controls_ =
-      is_resizable_ && !size_constraints_.HasMaximumSize() && has_frame_;
-
-  gfx::ApplyNSWindowSizeConstraints(window(), min_size, max_size,
-                                    shows_resize_controls_,
-                                    shows_fullscreen_controls_);
-}
-
-void NativeAppWindowCocoa::SetAlwaysOnTop(bool always_on_top) {
-  gfx::SetNSWindowAlwaysOnTop(window(), always_on_top);
-}
-
-void NativeAppWindowCocoa::SetVisibleOnAllWorkspaces(bool always_visible) {
-  gfx::SetNSWindowVisibleOnAllWorkspaces(window(), always_visible);
-}
-
-NativeAppWindowCocoa::~NativeAppWindowCocoa() {
-}
-
-AppNSWindow* NativeAppWindowCocoa::window() const {
-  NSWindow* window = [window_controller_ window];
-  CHECK(!window || [window isKindOfClass:[AppNSWindow class]]);
-  return static_cast<AppNSWindow*>(window);
-}
-
-content::WebContents* NativeAppWindowCocoa::WebContents() const {
-  return app_window_->web_contents();
-}
-
-void NativeAppWindowCocoa::UpdateRestoredBounds() {
-  if (IsRestored(*this))
-    restored_bounds_ = [window() frame];
-}
-
-void NativeAppWindowCocoa::HideWithoutMarkingHidden() {
-  [window() orderOut:window_controller_];
-}
diff --git a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
index c94419f..c7c396a 100644
--- a/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
+++ b/chrome/browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm
@@ -42,21 +42,10 @@
 
 namespace {
 
-// The param selects whether to use ChromeNativeAppWindowViewsMac, otherwise it
-// will use NativeAppWindowCocoa.
-class NativeAppWindowCocoaBrowserTest
-    : public testing::WithParamInterface<bool>,
-      public PlatformAppBrowserTest {
+class NativeAppWindowCocoaBrowserTest : public PlatformAppBrowserTest {
  protected:
   NativeAppWindowCocoaBrowserTest() {}
 
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    PlatformAppBrowserTest::SetUpCommandLine(command_line);
-    command_line->AppendSwitch(
-        GetParam() ? switches::kEnableMacViewsNativeAppWindows
-                   : switches::kDisableMacViewsNativeAppWindows);
-  }
-
   void SetUpAppWithWindows(int num_windows) {
     app_ = InstallExtension(
         test_data_dir_.AppendASCII("platform_apps").AppendASCII("minimal"), 1);
@@ -82,7 +71,7 @@
 }  // namespace
 
 // Test interaction of Hide/Show() with Hide/ShowWithApp().
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, HideShowWithApp) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, HideShowWithApp) {
   SetUpAppWithWindows(2);
   extensions::AppWindowRegistry::AppWindowList windows =
       extensions::AppWindowRegistry::Get(profile())->app_windows();
@@ -178,7 +167,7 @@
 }  // namespace
 
 // Test Hide/Show and Hide/ShowWithApp() behavior when shims are enabled.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest,
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest,
                        HideShowWithAppWithShim) {
   test::AppShimHostManagerTestApi test_api(
       g_browser_process->platform_part()->app_shim_host_manager());
@@ -223,7 +212,7 @@
 
 // Test that NativeAppWindow and AppWindow fullscreen state is updated when
 // the window is fullscreened natively.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Fullscreen) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Fullscreen) {
   extensions::AppWindow* app_window =
       CreateTestAppWindow("{\"alwaysOnTop\": true }");
   extensions::NativeAppWindow* window = app_window->GetBaseWindow();
@@ -273,7 +262,7 @@
 }
 
 // Test Minimize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Minimize) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Minimize) {
   if (base::mac::IsOS10_10())
     return;  // Fails when swarmed. http://crbug.com/660582
   SetUpAppWithWindows(1);
@@ -310,7 +299,7 @@
 }
 
 // Test Maximize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Maximize) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Maximize) {
   SetUpAppWithWindows(1);
   AppWindow* app_window = GetFirstAppWindow();
   extensions::NativeAppWindow* window = app_window->GetBaseWindow();
@@ -366,7 +355,7 @@
 // the window is not user-maximizable. However, calling Maximize() via the
 // javascript API should still maximize and since the zoom button is removed,
 // the codepath changes.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, MaximizeConstrained) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, MaximizeConstrained) {
   AppWindow* app_window = CreateTestAppWindow(
       "{\"outerBounds\": {\"maxWidth\":200, \"maxHeight\":300}}");
   extensions::NativeAppWindow* window = app_window->GetBaseWindow();
@@ -400,7 +389,7 @@
 }
 
 // Test Minimize, Maximize, Restore combinations with their native equivalents.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, MinimizeMaximize) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, MinimizeMaximize) {
   if (base::mac::IsOS10_10())
     return;  // Fails when swarmed. http://crbug.com/660582
   SetUpAppWithWindows(1);
@@ -452,7 +441,7 @@
 }
 
 // Test Maximize, Fullscreen, Restore combinations.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, MaximizeFullscreen) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, MaximizeFullscreen) {
   SetUpAppWithWindows(1);
   AppWindow* app_window = GetFirstAppWindow();
   extensions::NativeAppWindow* window = app_window->GetBaseWindow();
@@ -511,7 +500,7 @@
 
 // Test that, in frameless windows, the web contents has the same size as the
 // window.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Frameless) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Frameless) {
   AppWindow* app_window = CreateTestAppWindow("{\"frame\": \"none\"}");
   NSWindow* ns_window = app_window->GetNativeWindow();
   NSView* web_contents = app_window->web_contents()->GetNativeView();
@@ -596,11 +585,11 @@
 
 }  // namespace
 
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, Controls) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, Controls) {
   TestControls(CreateTestAppWindow("{}"));
 }
 
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, ControlsFrameless) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, ControlsFrameless) {
   TestControls(CreateTestAppWindow("{\"frame\": \"none\"}"));
 }
 
@@ -614,28 +603,6 @@
 
 // Take a screenshot of the window, including its native frame.
 NSBitmapImageRep* ScreenshotNSWindow(NSWindow* window) {
-  // When building with 10.10 SDK and running on 10.9, -[NSView
-  // cacheDisplayInRect] does not seem to capture subviews. This seems related
-  // to the frame view having a layer with 10.10 SDK, but is probably a bug
-  // since it doesn't manifest on 10.10. See http://crbug.com/508722.
-  // In this case, take a screenshot using the CGWindowList API instead. The
-  // bitmap is now in the display's color space, so expected colors need to be
-  // converted.
-  // TODO(jackhou): Update this if it is fixed in AppKit, or if other
-  // platform/SDK combinations need it.
-  // NOTE: This doesn't work with Views, but the regular test does, so use that.
-  bool mac_views = base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kEnableMacViewsNativeAppWindows);
-  if (base::mac::IsOS10_9() && !mac_views) {
-    // -[NSView setNeedsDisplay:YES] doesn't synchronously display the view, it
-    // gets drawn by another event in the queue, so let that run first.
-    content::RunAllPendingInMessageLoop();
-    base::ScopedCFTypeRef<CGImageRef> cg_image(CGWindowListCreateImage(
-        CGRectNull, kCGWindowListOptionIncludingWindow, [window windowNumber],
-        kCGWindowImageBoundsIgnoreFraming));
-    return [[[NSBitmapImageRep alloc] initWithCGImage:cg_image] autorelease];
-  }
-
   NSView* frame_view = [[window contentView] superview];
   NSRect bounds = [frame_view bounds];
   NSBitmapImageRep* bitmap =
@@ -647,7 +614,7 @@
 }  // namespace
 
 // Test that the colored frames have the correct color when active and inactive.
-IN_PROC_BROWSER_TEST_P(NativeAppWindowCocoaBrowserTest, FrameColor) {
+IN_PROC_BROWSER_TEST_F(NativeAppWindowCocoaBrowserTest, FrameColor) {
   // The hex values indicate an RGB color. When we get the NSColor later, the
   // components are CGFloats in the range [0, 1].
   extensions::AppWindow* app_window = CreateTestAppWindow(
@@ -682,7 +649,3 @@
   EXPECT_NEAR(expected_components[1], color_components[1], 0.01);
   EXPECT_NEAR(expected_components[2], color_components[2], 0.01);
 }
-
-INSTANTIATE_TEST_CASE_P(NativeAppWindowCocoaBrowserTestInstance,
-                        NativeAppWindowCocoaBrowserTest,
-                        ::testing::Bool());
diff --git a/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm b/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm
index 32ec336c..d4b35fe7 100644
--- a/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm
+++ b/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm
@@ -33,17 +33,13 @@
 // The param selects whether to use ChromeNativeAppWindowViewsMac, otherwise it
 // will use NativeAppWindowCocoa.
 class QuitWithAppsControllerInteractiveTest
-    : public testing::WithParamInterface<bool>,
-      public extensions::PlatformAppBrowserTest {
+    : public extensions::PlatformAppBrowserTest {
  protected:
   QuitWithAppsControllerInteractiveTest() : app_(NULL) {}
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     PlatformAppBrowserTest::SetUpCommandLine(command_line);
     command_line->AppendSwitch(switches::kAppsKeepChromeAliveInTests);
-    command_line->AppendSwitch(
-        GetParam() ? switches::kEnableMacViewsNativeAppWindows
-                   : switches::kDisableMacViewsNativeAppWindows);
   }
 
   const extensions::Extension* app_;
@@ -55,7 +51,7 @@
 }  // namespace
 
 // Test that quitting while apps are open shows a notification instead.
-IN_PROC_BROWSER_TEST_P(QuitWithAppsControllerInteractiveTest, QuitBehavior) {
+IN_PROC_BROWSER_TEST_F(QuitWithAppsControllerInteractiveTest, QuitBehavior) {
   scoped_refptr<QuitWithAppsController> controller =
       new QuitWithAppsController();
 
@@ -150,7 +146,7 @@
 }
 
 // Test that, when powering off, Chrome will quit even if there are apps open.
-IN_PROC_BROWSER_TEST_P(QuitWithAppsControllerInteractiveTest, QuitOnPowerOff) {
+IN_PROC_BROWSER_TEST_F(QuitWithAppsControllerInteractiveTest, QuitOnPowerOff) {
   // Open an app window.
   app_ = LoadAndLaunchPlatformApp("minimal_id", "Launched");
 
@@ -171,7 +167,3 @@
   [NSApp terminate:nil];
   EXPECT_TRUE(browser_shutdown::IsTryingToQuit());
 }
-
-INSTANTIATE_TEST_CASE_P(QuitWithAppsControllerInteractiveTestInstance,
-                        QuitWithAppsControllerInteractiveTest,
-                        ::testing::Bool());
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.h b/chrome/browser/ui/cocoa/browser_window_controller.h
index 5fc08776..6ea78b7 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.h
+++ b/chrome/browser/ui/cocoa/browser_window_controller.h
@@ -20,7 +20,6 @@
 #include "base/mac/scoped_nsobject.h"
 #include "chrome/browser/extensions/browser_extension_window_controller.h"
 #include "chrome/browser/translate/chrome_translate_client.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
 #import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
 #import "chrome/browser/ui/cocoa/themed_window.h"
 #import "chrome/browser/ui/cocoa/url_drop_target.h"
@@ -45,8 +44,6 @@
 @class FullscreenWindow;
 class LocationBarViewMac;
 @class OverlayableContentsController;
-@class TabStripControllerCocoa;
-@class TabStripView;
 
 namespace content {
 class WebContents;
@@ -59,8 +56,7 @@
 constexpr const gfx::Size kMinCocoaTabbedWindowSize(400, 272);
 constexpr const gfx::Size kMinCocoaPopupWindowSize(100, 122);
 
-@interface BrowserWindowController
-    : TabWindowController<ViewResizer, TabStripControllerDelegate> {
+@interface BrowserWindowController : TabWindowController<ViewResizer> {
  @private
   // The ordering of these members is important as it determines the order in
   // which they are destroyed. |browser_| needs to be destroyed last as most of
@@ -70,7 +66,6 @@
   NSWindow* savedRegularWindow_;
   std::unique_ptr<BrowserWindowCocoa> windowShim_;
   std::unique_ptr<LocationBarViewMac> locationBar_;
-  base::scoped_nsobject<TabStripControllerCocoa> tabStripController_;
   base::scoped_nsobject<OverlayableContentsController>
       overlayableContentsController_;
   base::scoped_nsobject<FullscreenToolbarControllerCocoa>
@@ -187,9 +182,6 @@
 // Access the C++ bridge between the NSWindow and the rest of Chromium.
 - (BrowserWindow*)browserWindow;
 
-// Return a weak pointer to the tab strip controller.
-- (TabStripControllerCocoa*)tabStripController;
-
 // Access the C++ bridge object representing the location bar.
 - (LocationBarViewMac*)locationBarBridge;
 
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index c32d730..1119b7db 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -45,6 +45,7 @@
 #import "chrome/browser/ui/cocoa/browser_window_cocoa.h"
 #import "chrome/browser/ui/cocoa/browser_window_command_handler.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h"
+#import "chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h"
 #import "chrome/browser/ui/cocoa/browser_window_layout.h"
 #import "chrome/browser/ui/cocoa/browser_window_utils.h"
 #include "chrome/browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa.h"
@@ -58,9 +59,6 @@
 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
 #import "chrome/browser/ui/cocoa/tab_contents/overlayable_contents_controller.h"
 #import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
 #import "chrome/browser/ui/cocoa/touchbar/browser_window_touch_bar_controller.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
@@ -190,13 +188,6 @@
       setCommandHandler:nil];
 }
 
-// Returns true if the Tab Detaching in Fullscreen is enabled. It's enabled by
-// default.
-bool IsTabDetachingInFullscreenEnabled() {
-  return !base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kDisableFullscreenTabDetaching);
-}
-
 }  // namespace
 
 @implementation BrowserWindowController
@@ -289,12 +280,6 @@
         [[OverlayableContentsController alloc] init]);
     [[self tabContentArea] addSubview:[overlayableContentsController_ view]];
 
-    // Create a controller for the tab strip, giving it the model object for
-    // this window's Browser and the tab strip view. The controller will handle
-    // registering for the appropriate tab notifications from the back-end and
-    // managing the creation of new tabs.
-    [self createTabStripController];
-
     locationBar_.reset(new LocationBarViewMac(
         browser_->command_controller(), browser_->profile(), browser_.get()));
 
@@ -361,15 +346,6 @@
 
   [[NSNotificationCenter defaultCenter] removeObserver:self];
 
-  // Inform reference counted objects that the Browser will be destroyed. This
-  // ensures they invalidate their weak Browser* to prevent use-after-free.
-  // These may outlive the Browser if they are retained by something else. For
-  // example, since 10.10, the Nib loader internally creates an NSDictionary
-  // that retains NSViewControllers and is autoreleased, so there is no way to
-  // guarantee that the [super dealloc] call below will also call dealloc on the
-  // controllers.
-  [tabStripController_ browserWillBeDestroyed];
-
   [super dealloc];
 }
 
@@ -409,10 +385,6 @@
   return windowShim_.get();
 }
 
-- (TabStripControllerCocoa*)tabStripController {
-  return tabStripController_.get();
-}
-
 - (LocationBarViewMac*)locationBarBridge {
   return locationBar_.get();
 }
@@ -882,88 +854,19 @@
 // clients do not need to call it again.
 - (void)moveTabViews:(NSArray*)views
       fromController:(TabWindowController*)dragController {
-  if (dragController) {
-    // Moving between windows.
-    NSView* activeTabView = [dragController activeTabView];
-    BrowserWindowController* dragBWC =
-        base::mac::ObjCCastStrict<BrowserWindowController>(dragController);
-
-    // We will drop the tabs starting at indexOfPlaceholder, and increment from
-    // there. We remove the placehoder before dropping the tabs, so that the
-    // new tab animation's destination frame is correct.
-    int tabIndex = [tabStripController_ indexOfPlaceholder];
-    [self removePlaceholder];
-
-    for (NSView* view in views) {
-      // Figure out the WebContents to drop into our tab model from the source
-      // window's model.
-      int index = [dragBWC->tabStripController_ modelIndexForTabView:view];
-      WebContents* contents =
-          dragBWC->browser_->tab_strip_model()->GetWebContentsAt(index);
-      // The tab contents may have gone away if given a window.close() while it
-      // is being dragged. If so, bail, we've got nothing to drop.
-      if (!contents)
-        continue;
-
-      // Convert |view|'s frame (which starts in the source tab strip's
-      // coordinate system) to the coordinate system of the destination tab
-      // strip. This needs to be done before being detached so the window
-      // transforms can be performed.
-      NSRect destinationFrame = [view frame];
-      NSPoint tabOrigin = destinationFrame.origin;
-      tabOrigin = [[dragController tabStripView] convertPoint:tabOrigin
-                                                       toView:nil];
-      tabOrigin = ui::ConvertPointFromWindowToScreen([dragController window],
-                                                     tabOrigin);
-      tabOrigin = ui::ConvertPointFromScreenToWindow([self window], tabOrigin);
-      tabOrigin = [[self tabStripView] convertPoint:tabOrigin fromView:nil];
-      destinationFrame.origin = tabOrigin;
-
-      // Before the tab is detached from its originating tab strip, store the
-      // pinned state so that it can be maintained between the windows.
-      bool isPinned = dragBWC->browser_->tab_strip_model()->IsTabPinned(index);
-
-      // Now that we have enough information about the tab, we can remove it
-      // from the dragging window. We need to do this *before* we add it to the
-      // new window as this will remove the WebContents' delegate.
-      [dragController detachTabView:view];
-
-      // Deposit it into our model at the appropriate location (it already knows
-      // where it should go from tracking the drag). Doing this sets the tab's
-      // delegate to be the Browser.
-      [tabStripController_ dropWebContents:contents
-                                   atIndex:tabIndex++
-                                 withFrame:destinationFrame
-                               asPinnedTab:isPinned
-                                  activate:view == activeTabView];
-    }
-  } else {
-    // Moving within a window.
-    for (NSView* view in views) {
-      int index = [tabStripController_ modelIndexForTabView:view];
-      [tabStripController_ moveTabFromIndex:index];
-    }
-    [self removePlaceholder];
-  }
 }
 
 // Tells the tab strip to forget about this tab in preparation for it being
 // put into a different tab strip, such as during a drop on another window.
 - (void)detachTabView:(NSView*)view {
-  int index = [tabStripController_ modelIndexForTabView:view];
-
-  // TODO(erikchen): While it might be nice to fix ownership semantics here,
-  // realistically the code is going to be deleted in the not-too-distant
-  // future.
-  browser_->tab_strip_model()->DetachWebContentsAt(index).release();
 }
 
 - (NSArray*)tabViews {
-  return [tabStripController_ tabViews];
+  return @[];
 }
 
 - (NSView*)activeTabView {
-  return [tabStripController_ activeTabView];
+  return nil;
 }
 
 - (void)setIsLoading:(BOOL)isLoading force:(BOOL)force {
@@ -1008,89 +911,11 @@
 }
 
 - (void)layoutTabs {
-  [tabStripController_ layoutTabs];
 }
 
 - (TabWindowController*)detachTabsToNewWindow:(NSArray*)tabViews
                                    draggedTab:(NSView*)draggedTab {
-  DCHECK_GT([tabViews count], 0U);
-
-  // Disable screen updates so that this appears as a single visual change.
-  gfx::ScopedCocoaDisableScreenUpdates disabler;
-
-  // Set the window size. Need to do this before we detach the tab so it's
-  // still in the window. We have to flip the coordinates as that's what
-  // is expected by the Browser code.
-  NSWindow* sourceWindow = [draggedTab window];
-  NSRect windowRect = [sourceWindow frame];
-  NSScreen* screen = [sourceWindow screen];
-  windowRect.origin.y =
-      NSHeight([screen frame]) - NSMaxY(windowRect) + [self menubarOffset];
-  gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y,
-                        NSWidth(windowRect), NSHeight(windowRect));
-
-  std::vector<TabStripModelDelegate::NewStripContents> contentses;
-  TabStripModel* model = browser_->tab_strip_model();
-
-  for (TabViewCocoa* tabView in tabViews) {
-    // Fetch the tab contents for the tab being dragged.
-    int index = [tabStripController_ modelIndexForTabView:tabView];
-    bool isPinned = model->IsTabPinned(index);
-    bool isActive = (index == model->active_index());
-
-    TabStripModelDelegate::NewStripContents item;
-    item.web_contents = model->DetachWebContentsAt(index);
-    item.add_types =
-        (isActive ? TabStripModel::ADD_ACTIVE : TabStripModel::ADD_NONE) |
-        (isPinned ? TabStripModel::ADD_PINNED : TabStripModel::ADD_NONE);
-    contentses.push_back(std::move(item));
-  }
-
-  // Create a new window with the dragged tabs in its model.
-  Browser* newBrowser =
-      browser_->tab_strip_model()->delegate()->CreateNewStripWithContents(
-          std::move(contentses), browserRect, false);
-
-  // Get the new controller by asking the new window for its delegate.
-  BrowserWindowController* controller = [BrowserWindowController
-      browserWindowControllerForWindow:newBrowser->window()->GetNativeWindow()];
-  DCHECK(controller && [controller isKindOfClass:[TabWindowController class]]);
-
-  // Ensure that the window will appear on top of the source window in
-  // fullscreen mode.
-  if ([self isInAppKitFullscreen]) {
-    NSWindow* window = [controller window];
-    NSUInteger collectionBehavior = [window collectionBehavior];
-    collectionBehavior &= ~NSWindowCollectionBehaviorFullScreenPrimary;
-    collectionBehavior |= NSWindowCollectionBehaviorFullScreenAuxiliary;
-    [window setCollectionBehavior:collectionBehavior];
-    [window setLevel:NSFloatingWindowLevel];
-
-    controller->savedRegularWindowFrame_ = savedRegularWindowFrame_;
-  }
-
-  // And make sure we use the correct frame in the new view.
-  TabStripControllerCocoa* tabStripController = [controller tabStripController];
-  NSView* tabStrip = [self tabStripView];
-  NSEnumerator* tabEnumerator = [tabViews objectEnumerator];
-  for (NSView* newView in [tabStripController tabViews]) {
-    NSView* oldView = [tabEnumerator nextObject];
-    if (oldView) {
-      // Pushes tabView's frame back inside the tabstrip.
-      NSRect sourceTabRect = [oldView frame];
-      NSSize tabOverflow =
-          [self overflowFrom:[tabStrip convertRect:sourceTabRect toView:nil]
-                          to:[tabStrip frame]];
-      NSRect tabRect =
-          NSOffsetRect(sourceTabRect, -tabOverflow.width, -tabOverflow.height);
-      // Force the added tab to the right size (remove stretching.)
-      tabRect.size.height = [TabStripControllerCocoa defaultTabHeight];
-
-      [tabStripController setFrame:tabRect ofTabView:newView];
-    }
-  }
-
-  return controller;
+  return nil;
 }
 
 - (void)detachedWindowEnterFullscreenIfNeeded:(TabWindowController*)source {
@@ -1113,38 +938,27 @@
 }
 
 - (void)insertPlaceholderForTab:(TabViewCocoa*)tab frame:(NSRect)frame {
-  [super insertPlaceholderForTab:tab frame:frame];
-  [tabStripController_ insertPlaceholderForTab:tab frame:frame];
 }
 
 - (void)removePlaceholder {
-  [super removePlaceholder];
-  [tabStripController_ insertPlaceholderForTab:nil frame:NSZeroRect];
 }
 
 - (BOOL)isDragSessionActive {
-  // The tab can be dragged within the existing tab strip or detached
-  // into its own window (then the overlay window will be present).
-  return [[self tabStripController] isDragSessionActive] ||
-         [self overlayWindow] != nil;
+  return NO;
 }
 
 - (BOOL)tabDraggingAllowed {
-  return [tabStripController_ tabDraggingAllowed];
+  return NO;
 }
 
 - (BOOL)tabTearingAllowed {
-  return ![self isInAnyFullscreenMode] || IsTabDetachingInFullscreenEnabled();
+  return NO;
 }
 
 - (BOOL)windowMovementAllowed {
   return ![self isInAnyFullscreenMode] || [self overlayWindow];
 }
 
-- (BOOL)isTabFullyVisible:(TabViewCocoa*)tab {
-  return [tabStripController_ isTabFullyVisible:tab];
-}
-
 - (void)showNewTabButton:(BOOL)show {
 }
 
@@ -1188,17 +1002,7 @@
 }
 
 - (BOOL)isTabDraggable:(NSView*)tabView {
-  // TODO(avi, thakis): ConstrainedWindowSheetController has no api to move
-  // tabsheets between windows. Until then, we have to prevent having to move a
-  // tabsheet between windows, e.g. no tearing off of tabs.
-  int index = [tabStripController_ modelIndexForTabView:tabView];
-  WebContents* contents = browser_->tab_strip_model()->GetWebContentsAt(index);
-  if (!contents)
-    return NO;
-
-  const web_modal::WebContentsModalDialogManager* manager =
-      web_modal::WebContentsModalDialogManager::FromWebContents(contents);
-  return !manager || !manager->IsDialogActive();
+  return NO;
 }
 
 - (CGFloat)menubarOffset {
@@ -1264,8 +1068,6 @@
 - (NSPoint)themeImagePositionForAlignment:(ThemeImageAlignment)alignment {
   NSView* windowChromeView = [[[self window] contentView] superview];
   NSView* tabStripView = nil;
-  if ([self hasTabStrip])
-    tabStripView = [self tabStripView];
   return [BrowserWindowUtils themeImagePositionFor:windowChromeView
                                       withTabStrip:tabStripView
                                          alignment:alignment];
@@ -1391,8 +1193,7 @@
 }
 
 - (BOOL)isActiveTabContentsControllerResizeBlocked {
-  return
-      [[tabStripController_ activeTabContentsController] blockFullscreenResize];
+  return NO;
 }
 
 - (void)sheetDidEnd:(NSWindow*)sheet
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
index 52bc156..d3ea1c1 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
@@ -33,8 +33,6 @@
 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller.h"
 #import "chrome/browser/ui/cocoa/history_overlay_controller.h"
 #import "chrome/browser/ui/cocoa/tab_contents/overlayable_contents_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller_test.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.h b/chrome/browser/ui/cocoa/browser_window_controller_private.h
index ccd5297a..1ea028c2 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.h
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.h
@@ -42,10 +42,6 @@
 // "dependencies").
 @interface BrowserWindowController(Private)
 
-// Create the appropriate tab strip controller based on whether or not side
-// tabs are enabled. Replaces the current controller.
-- (void)createTabStripController;
-
 // Sets the window's collection behavior to the appropriate
 // fullscreen behavior.
 - (void)updateFullscreenCollectionBehavior;
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
index 8ac73da..81fc291 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm
@@ -33,7 +33,6 @@
 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h"
 #import "chrome/browser/ui/cocoa/tab_contents/overlayable_contents_controller.h"
 #import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_switches.h"
@@ -80,17 +79,6 @@
 
 @implementation BrowserWindowController(Private)
 
-// Create the tab strip controller.
-- (void)createTabStripController {
-  DCHECK([overlayableContentsController_ activeContainer]);
-  DCHECK([[overlayableContentsController_ activeContainer] window]);
-  tabStripController_.reset([[TabStripControllerCocoa alloc]
-      initWithView:[self tabStripView]
-        switchView:[overlayableContentsController_ activeContainer]
-           browser:browser_.get()
-          delegate:self]);
-}
-
 - (void)updateFullscreenCollectionBehavior {
   // Set the window to participate in Lion Fullscreen mode.  Setting this flag
   // has no effect on Snow Leopard or earlier.  Panels can share a fullscreen
@@ -226,38 +214,6 @@
 }
 
 - (void)applyTabStripLayout:(const chrome::TabStripLayout&)layout {
-  // Update the presence of the window controls.
-  if (layout.addCustomWindowControls)
-    [tabStripController_ addCustomWindowControls];
-  else
-    [tabStripController_ removeCustomWindowControls];
-
-  // Check if the tab strip's frame has changed.
-  BOOL requiresRelayout =
-      !NSEqualRects([[self tabStripView] frame], layout.frame);
-
-  // Check if the leading indent has changed.
-  if (layout.leadingIndent != [tabStripController_ leadingIndentForControls]) {
-    [tabStripController_ setLeadingIndentForControls:layout.leadingIndent];
-    requiresRelayout = YES;
-  }
-
-  // Check if the trailing indent has changed.
-  if (layout.trailingIndent !=
-      [tabStripController_ trailingIndentForControls]) {
-    [tabStripController_ setTrailingIndentForControls:layout.trailingIndent];
-    requiresRelayout = YES;
-  }
-
-  // It is undesirable to force tabs relayout when the tap strip's frame did
-  // not change, because it will interrupt tab animations in progress.
-  // In addition, there appears to be an AppKit bug on <10.9 where interrupting
-  // a tab animation resulted in the tab frame being the animator's target
-  // frame instead of the interrupting setFrame. (See http://crbug.com/415093)
-  if (requiresRelayout) {
-    [[self tabStripView] setFrame:layout.frame];
-    [tabStripController_ layoutTabsWithoutAnimation];
-  }
 }
 
 - (BOOL)placeBookmarkBarBelowInfoBar {
@@ -287,13 +243,6 @@
   base::scoped_nsobject<FocusTracker> focusTracker(
       [[FocusTracker alloc] initWithWindow:sourceWindow]);
 
-  // Retain the tab strip view while we remove it from its superview.
-  base::scoped_nsobject<NSView> tabStripView;
-  if ([self hasTabStrip]) {
-    tabStripView.reset([[self tabStripView] retain]);
-    [tabStripView removeFromSuperview];
-  }
-
   // Disable autoresizing of subviews while we move views around. This prevents
   // spurious renderer resizes.
   [self.chromeContentView setAutoresizesSubviews:NO];
@@ -315,11 +264,6 @@
                             relativeTo:nil];
   [self.chromeContentView setFrame:[[destWindow contentView] bounds]];
 
-  // Add the tab strip after setting the content view and moving the incognito
-  // badge (if any), so that the tab strip will be on top (in the z-order).
-  if ([self hasTabStrip])
-    [[destWindow contentView] addSubview:tabStripView];
-
   [sourceWindow setWindowController:nil];
   [self setWindow:destWindow];
   [destWindow setWindowController:[self nsWindowController]];
@@ -501,9 +445,6 @@
   if (notification)  // For System Fullscreen when non-nil.
     [self registerForContentViewResizeNotifications];
 
-  [[tabStripController_ activeTabContentsController]
-      setBlockFullscreenResize:YES];
-
   NSWindow* window = [self window];
   savedRegularWindowFrame_ = [window frame];
 
@@ -517,8 +458,6 @@
 }
 
 - (void)windowDidEnterFullScreen:(NSNotification*)notification {
-  [tabStripController_ setVisualEffectsDisabledForFullscreen:YES];
-
   // In Yosemite, some combination of the titlebar and toolbar always show in
   // full-screen mode. We do not want either to show. Search for the window
   // that contains the views, and hide it if the window contains our custom
@@ -551,8 +490,6 @@
   enteringImmersiveFullscreen_ = NO;
 
   [self resetCustomAppKitFullscreenVariables];
-  [[tabStripController_ activeTabContentsController]
-      updateFullscreenWidgetFrame];
 
   [self showFullscreenExitBubbleIfNecessary];
   browser_->WindowFullscreenStateChanged();
@@ -582,8 +519,6 @@
 }
 
 - (void)windowWillExitFullScreen:(NSNotification*)notification {
-  [tabStripController_ setVisualEffectsDisabledForFullscreen:NO];
-
   // macOS 10.12 and earlier have issues with exiting fullscreen while a window
   // is on the detached/low power path (playing a video with no UI visible).
   // See crbug/644133 for some discussion. This workaround kicks the window off
@@ -811,9 +746,6 @@
 - (void)applyLayout:(BrowserWindowLayout*)layout {
   chrome::LayoutOutput output = [layout computeLayout];
 
-  if (!NSIsEmptyRect(output.tabStripLayout.frame))
-    [self applyTabStripLayout:output.tabStripLayout];
-
   [self layoutTabContentArea:output.contentAreaFrame];
 
   if (!NSIsEmptyRect(output.fullscreenBackingBarFrame)) {
@@ -908,8 +840,6 @@
   [self.chromeContentView setAutoresizesSubviews:YES];
 
   fullscreenTransition_.reset();
-  [[tabStripController_ activeTabContentsController]
-      setBlockFullscreenResize:NO];
   blockLayoutSubviews_ = NO;
 
   enteringAppKitFullscreen_ = NO;
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm b/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm
index 0381b49..3db3a4b 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_unittest.mm
@@ -15,7 +15,6 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/cocoa/browser_window_layout.h"
 #import "chrome/browser/ui/cocoa/fast_resize_view.h"
-#include "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
 #include "chrome/browser/ui/cocoa/test/cocoa_profile_test.h"
 #include "chrome/browser/ui/cocoa/test/run_loop_testing.h"
 #include "chrome/common/pref_names.h"
@@ -92,117 +91,10 @@
   EXPECT_TRUE([controller_ createFullscreenWindow]);
 }
 
-TEST_F(BrowserWindowControllerTest, TestNormal) {
-  // Make sure a normal BrowserWindowController is, uh, normal.
-  EXPECT_TRUE([controller_ isTabbedWindow]);
-  EXPECT_TRUE([controller_ hasTabStrip]);
-  EXPECT_FALSE([controller_ hasTitleBar]);
-
-  // And make sure a controller for a pop-up window is not normal.
-  // popup_browser will be owned by its window.
-  Browser* popup_browser(
-      new Browser(Browser::CreateParams(Browser::TYPE_POPUP, profile(), true)));
-  NSWindow* cocoaWindow = popup_browser->window()->GetNativeWindow();
-  BrowserWindowController* controller =
-      [BrowserWindowController browserWindowControllerForWindow:cocoaWindow];
-  ASSERT_TRUE([controller isKindOfClass:[BrowserWindowController class]]);
-  EXPECT_FALSE([controller isTabbedWindow]);
-  EXPECT_FALSE([controller hasTabStrip]);
-  EXPECT_TRUE([controller hasTitleBar]);
-  [[controller nsWindowController] close];
-}
-
-TEST_F(BrowserWindowControllerTest, TestSetBounds) {
-  // Create a normal browser with bounds smaller than the minimum.
-  Browser::CreateParams params(Browser::TYPE_TABBED, profile(), true);
-  params.initial_bounds = gfx::Rect(0, 0, 50, 50);
-  Browser* browser = new Browser(params);
-  NSWindow* cocoaWindow = browser->window()->GetNativeWindow();
-  BrowserWindowController* controller =
-      [BrowserWindowController browserWindowControllerForWindow:cocoaWindow];
-
-  ASSERT_TRUE([controller isTabbedWindow]);
-  BrowserWindow* browser_window = [controller browserWindow];
-  EXPECT_EQ(browser_window, browser->window());
-  EXPECT_EQ(browser_window->GetBounds().size(), kMinCocoaTabbedWindowSize);
-
-  // Try to set the bounds smaller than the minimum.
-  browser_window->SetBounds(gfx::Rect(0, 0, 50, 50));
-  EXPECT_EQ(browser_window->GetBounds().size(), kMinCocoaTabbedWindowSize);
-
-  [[controller nsWindowController] close];
-}
-
-TEST_F(BrowserWindowControllerTest, TestSetBoundsPopup) {
-  // Create a popup with bounds smaller than the minimum.
-  Browser::CreateParams params(Browser::TYPE_POPUP, profile(), true);
-  params.initial_bounds = gfx::Rect(0, 0, 50, 50);
-  Browser* browser = new Browser(params);
-  NSWindow* cocoaWindow = browser->window()->GetNativeWindow();
-  BrowserWindowController* controller =
-      [BrowserWindowController browserWindowControllerForWindow:cocoaWindow];
-
-  ASSERT_FALSE([controller isTabbedWindow]);
-  BrowserWindow* browser_window = [controller browserWindow];
-  EXPECT_EQ(browser_window, browser->window());
-  gfx::Rect bounds = browser_window->GetBounds();
-  EXPECT_EQ(100, bounds.width());
-  EXPECT_EQ(122, bounds.height());
-
-  // Try to set the bounds smaller than the minimum.
-  browser_window->SetBounds(gfx::Rect(0, 0, 50, 50));
-  bounds = browser_window->GetBounds();
-  EXPECT_EQ(100, bounds.width());
-  EXPECT_EQ(122, bounds.height());
-
-  [[controller nsWindowController] close];
-}
-
 TEST_F(BrowserWindowControllerTest, TestTheme) {
   [controller_ userChangedTheme];
 }
 
-namespace {
-
-// Whether the view's frame is within the bounds of the superview.
-BOOL ViewContainmentValid(NSView* view) {
-  if (NSIsEmptyRect([view frame]))
-    return YES;
-
-  return NSContainsRect([[view superview] bounds], [view frame]);
-}
-
-// Checks the view hierarchy rooted at |view| to ensure that each view is
-// properly contained.
-BOOL ViewHierarchyContainmentValid(NSView* view) {
-  // TODO(erikchen): Fix these views to have correct containment.
-  // http://crbug.com/397665.
-  if ([view isKindOfClass:NSClassFromString(@"BrowserActionsContainerView")])
-    return YES;
-
-  if (!ViewContainmentValid(view)) {
-    LOG(ERROR) << "View violates containment: " <<
-        [[view description] UTF8String];
-    return NO;
-  }
-
-  for (NSView* subview in [view subviews]) {
-    BOOL result = ViewHierarchyContainmentValid(subview);
-    if (!result)
-      return NO;
-  }
-
-  return YES;
-}
-
-// Verifies that the toolbar, infobar and tab content area
-// completely fill the area under the tabstrip.
-void CheckViewPositions(BrowserWindowController* controller) {
-  EXPECT_TRUE(ViewHierarchyContainmentValid([[controller window] contentView]));
-}
-
-}  // end namespace
-
 TEST_F(BrowserWindowControllerTest, TestAdjustWindowHeight) {
   NSWindow* window = [controller_ window];
   NSRect workarea = [[window screen] visibleFrame];
@@ -329,24 +221,6 @@
   EXPECT_FLOAT_EQ(NSHeight(initialFrame), NSHeight(finalFrame));
 }
 
-// Test to make sure resizing and relaying-out subviews works correctly.
-TEST_F(BrowserWindowControllerTest, TestResizeViews) {
-  TabStripView* tabstrip = [controller_ tabStripView];
-  NSView* contentView = [[tabstrip window] contentView];
-
-  // We need to muck with the views a bit to put us in a consistent state before
-  // we start resizing.  In particular, we need to move the tab strip to be
-  // immediately above the content area, since we layout views to be directly
-  // under the tab strip.
-  NSRect tabstripFrame = [tabstrip frame];
-  tabstripFrame.origin.y = NSMaxY([contentView frame]);
-  [tabstrip setFrame:tabstripFrame];
-
-  // Force a layout and check each view's frame.
-  [controller_ layoutSubviews];
-  CheckViewPositions(controller_);
-}
-
 // By the "zoom frame", we mean what Apple calls the "standard frame".
 TEST_F(BrowserWindowControllerTest, TestZoomFrame) {
   NSWindow* window = [controller_ window];
@@ -431,25 +305,6 @@
   EXPECT_EQ(screenFrame.origin.y, zoomFrame.origin.y);
 }
 
-// Check that when the window becomes/resigns main, the tab strip's background
-// view is redrawn.
-TEST_F(BrowserWindowControllerTest, TabStripBackgroundViewRedrawTest) {
-  NSView* view = controller_.tabStripBackgroundView;
-  id partial_mock = [OCMockObject partialMockForObject:view];
-
-  [[partial_mock expect] setNeedsDisplay:YES];
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidBecomeMainNotification
-                    object:controller_.window];
-  [partial_mock verify];
-
-  [[partial_mock expect] setNeedsDisplay:YES];
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:NSWindowDidResignMainNotification
-                    object:controller_.window];
-  [partial_mock verify];
-}
-
 // Test that the window uses Auto Layout. Since frame-based layout and Auto
 // Layout behave differently in subtle ways, we shouldn't start/stop using it
 // accidentally. If we don't want Auto Layout, this test should be changed to
diff --git a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
index ed68ace8..43c32a31 100644
--- a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
+++ b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
@@ -14,7 +14,6 @@
 #include "base/macros.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
 #import "chrome/browser/ui/cocoa/framed_browser_window.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h"
 
 namespace {
 
@@ -220,7 +219,6 @@
     isEnteringFullscreen_ = NO;
     initialFrame_ = [[primaryWindow_ screen] frame];
     finalFrame_ = [controller savedRegularWindowFrame];
-    tabStripBackgroundView_.reset([[controller tabStripBackgroundView] retain]);
 
     lock_.reset(new FrameAndStyleLock(framedBrowserWindow));
   }
diff --git a/chrome/browser/ui/cocoa/browser_window_layout.mm b/chrome/browser/ui/cocoa/browser_window_layout.mm
index dab8ec2..bec3db6 100644
--- a/chrome/browser/ui/cocoa/browser_window_layout.mm
+++ b/chrome/browser/ui/cocoa/browser_window_layout.mm
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/mac/mac_util.h"
 #include "chrome/browser/ui/cocoa/l10n_util.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
 #include "chrome/common/chrome_features.h"
 
 namespace chrome {
@@ -41,19 +40,6 @@
 const CGFloat kLocBarTopInset = 0;
 const CGFloat kLocBarBottomInset = 1;
 
-// Space between the incognito badge and the right edge of the window.
-const CGFloat kAvatarRightOffset = 4;
-
-// Space between the generic avatar and the right edge of the window.
-const CGFloat kGenericAvatarRightOffset = 5;
-
-// Space between the location bar and the right edge of the window, when there
-// are no extension buttons present.
-// When there is a fullscreen button to the right of the new style profile
-// button, we align the profile button with the location bar (although it won't
-// be aligned when there are extension buttons).
-const CGFloat kLocationBarRightOffset = 35;
-
 }  // namespace
 
 @interface BrowserWindowLayout ()
@@ -192,91 +178,6 @@
 }
 
 - (void)computeTabStripLayout {
-  if (!parameters_.hasTabStrip) {
-    maxY_ = parameters_.contentViewSize.height + fullscreenYOffset_;
-    return;
-  }
-
-  // Temporary variable to hold the output.
-  chrome::TabStripLayout layout = {};
-
-  // Lay out the tab strip.
-  maxY_ = parameters_.windowSize.height + fullscreenYOffset_;
-  CGFloat width = parameters_.contentViewSize.width;
-  layout.frame = NSMakeRect(
-      0, maxY_ - chrome::kTabStripHeight, width, chrome::kTabStripHeight);
-  maxY_ = NSMinY(layout.frame);
-
-  // In Yosemite, there is no longer an exit fullscreen button in the top-right
-  // corner of the OSX Menu Bar. Instead, a Cocoa application's toolbar is
-  // expected to have traffic lights. Chrome doesn't use an NSToolbar, so it
-  // needs to manually add the traffic lights to the tab strip.
-  layout.addCustomWindowControls =
-      parameters_.inAnyFullscreen && parameters_.isOSYosemiteOrLater;
-
-  // Set left indentation based on fullscreen mode status.
-  if (!parameters_.inAnyFullscreen || layout.addCustomWindowControls)
-    layout.leadingIndent =
-        [TabStripControllerCocoa defaultLeadingIndentForControls];
-
-  // Lay out the icognito/avatar badge because calculating the indentation on
-  // the right depends on it.
-  if (parameters_.shouldShowAvatar) {
-    CGFloat badgeXOffset = parameters_.isGenericAvatar
-                               ? -kGenericAvatarRightOffset
-                               : -kAvatarRightOffset;
-    CGFloat badgeYOffset = 0;
-    CGFloat buttonHeight = parameters_.avatarSize.height;
-
-    if (parameters_.shouldUseNewAvatar) {
-      // The fullscreen icon (if present) is displayed to the right of the
-      // new style profile button.
-      if (!NSIsEmptyRect(parameters_.fullscreenButtonFrame))
-        badgeXOffset = -kLocationBarRightOffset;
-
-      // Center the button, but make sure that it's pixel aligned on non-retina
-      // displays. Use trunc() instead of round() to mimic the behavior of
-      // autoresizesSubviews.
-      badgeYOffset = trunc((chrome::kTabStripHeight - buttonHeight) / 2);
-    } else {
-      // Actually place the badge *above* |maxY|, by +2 to miss the divider.
-      badgeYOffset = 2 * parameters_.avatarLineWidth;
-    }
-
-    NSSize size = NSMakeSize(parameters_.avatarSize.width,
-                             std::min(buttonHeight, chrome::kTabStripHeight));
-    NSPoint origin =
-        NSMakePoint(width - parameters_.avatarSize.width + badgeXOffset,
-                    maxY_ + badgeYOffset);
-    layout.avatarFrame =
-        NSMakeRect(origin.x, origin.y, size.width, size.height);
-  }
-
-  // Calculate the right indentation.
-  // On 10.7 Lion to 10.9 Mavericks, there will be a fullscreen button when not
-  // in fullscreen mode.
-  // There may also be a profile button, which can be on the right of the
-  // fullscreen button (old style), or to its left (new style).
-  // The right indentation is calculated to prevent the tab strip from
-  // overlapping these buttons.
-  CGFloat maxX = width;
-  if (!NSIsEmptyRect(parameters_.fullscreenButtonFrame)) {
-    maxX = NSMinX(parameters_.fullscreenButtonFrame);
-  }
-  if (parameters_.shouldShowAvatar) {
-    maxX = std::min(maxX, NSMinX(layout.avatarFrame));
-  }
-  layout.trailingIndent = width - maxX;
-
-  if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) {
-    if (cocoa_l10n_util::ShouldFlipWindowControlsInRTL())
-      layout.avatarFrame.origin.x =
-          width - parameters_.avatarSize.width - layout.avatarFrame.origin.x;
-    else
-      std::swap(layout.leadingIndent, layout.trailingIndent);
-  }
-
-  output_.tabStripLayout = layout;
 }
 
 - (void)computeContentViewLayout {
diff --git a/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm b/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm
deleted file mode 100644
index 6805c4b..0000000
--- a/chrome/browser/ui/cocoa/browser_window_layout_unittest.mm
+++ /dev/null
@@ -1,228 +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.
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#include "base/macros.h"
-#import "chrome/browser/ui/cocoa/browser_window_layout.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#import "testing/gtest_mac.h"
-
-class BrowserWindowLayoutTest : public testing::Test {
- public:
-  BrowserWindowLayoutTest() {}
-  void SetUp() override {
-    layout.reset([[BrowserWindowLayout alloc] init]);
-
-    [layout setContentViewSize:NSMakeSize(600, 600)];
-    [layout setWindowSize:NSMakeSize(600, 622)];
-    [layout setInAnyFullscreen:NO];
-    [layout setHasTabStrip:YES];
-    [layout setFullscreenButtonFrame:NSMakeRect(575, 596, 16, 17)];
-    [layout setShouldShowAvatar:YES];
-    [layout setShouldUseNewAvatar:YES];
-    [layout setIsGenericAvatar:NO];
-    [layout setAvatarSize:NSMakeSize(63, 28)];
-    [layout setAvatarLineWidth:1];
-    [layout setHasToolbar:YES];
-    [layout setToolbarHeight:32];
-    [layout setPlaceBookmarkBarBelowInfoBar:NO];
-    [layout setBookmarkBarHidden:NO];
-    [layout setBookmarkBarHeight:26];
-    [layout setInfoBarHeight:72];
-    [layout setHasDownloadShelf:YES];
-    [layout setDownloadShelfHeight:44];
-    [layout setOSYosemiteOrLater:NO];
-  }
-
-  base::scoped_nsobject<BrowserWindowLayout> layout;
-
-  // Updates the layout parameters with the state associated with a typical
-  // fullscreened window.
-  void ApplyStandardFullscreenLayoutParameters() {
-    // Content view has same size as window in AppKit Fullscreen.
-    [layout setContentViewSize:NSMakeSize(600, 622)];
-    [layout setInAnyFullscreen:YES];
-    [layout setFullscreenToolbarStyle:FullscreenToolbarStyle::TOOLBAR_PRESENT];
-    [layout setFullscreenMenubarOffset:0];
-    [layout setFullscreenToolbarFraction:1];
-    [layout setFullscreenButtonFrame:NSZeroRect];
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BrowserWindowLayoutTest);
-};
-
-TEST_F(BrowserWindowLayoutTest, TestAllViews) {
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSMakeRect(0, 585, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(502, 589, 63, 28), output.tabStripLayout.avatarFrame);
-  EXPECT_EQ(70, output.tabStripLayout.leadingIndent);
-  EXPECT_EQ(98, output.tabStripLayout.trailingIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 553, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 26), output.bookmarkFrame);
-  EXPECT_NSEQ(NSZeroRect, output.fullscreenBackingBarFrame);
-  EXPECT_EQ(527, output.findBarMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 455, 600, 72), output.infoBarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
-}
-
-TEST_F(BrowserWindowLayoutTest, TestAllViewsFullscreen) {
-  ApplyStandardFullscreenLayoutParameters();
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSMakeRect(0, 585, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(533, 589, 63, 28), output.tabStripLayout.avatarFrame);
-  EXPECT_EQ(0, output.tabStripLayout.leadingIndent);
-  EXPECT_FALSE(output.tabStripLayout.addCustomWindowControls);
-  EXPECT_EQ(67, output.tabStripLayout.trailingIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 553, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 26), output.bookmarkFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 527, 600, 95), output.fullscreenBackingBarFrame);
-  EXPECT_EQ(527, output.findBarMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 455, 600, 72), output.infoBarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
-}
-
-// In fullscreen mode for Yosemite, the tab strip's left indent should be
-// sufficiently large to accomodate the addition of traffic light buttons.
-TEST_F(BrowserWindowLayoutTest, TestYosemiteFullscreenTrafficLights) {
-  ApplyStandardFullscreenLayoutParameters();
-  [layout setOSYosemiteOrLater:YES];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_EQ(70, output.tabStripLayout.leadingIndent);
-  EXPECT_TRUE(output.tabStripLayout.addCustomWindowControls);
-}
-
-TEST_F(BrowserWindowLayoutTest, TestAllViewsFullscreenMenuBarShowing) {
-  ApplyStandardFullscreenLayoutParameters();
-  [layout setFullscreenMenubarOffset:-10];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSMakeRect(0, 575, 600, 37), output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSMakeRect(533, 579, 63, 28), output.tabStripLayout.avatarFrame);
-  EXPECT_EQ(0, output.tabStripLayout.leadingIndent);
-  EXPECT_FALSE(output.tabStripLayout.addCustomWindowControls);
-  EXPECT_EQ(67, output.tabStripLayout.trailingIndent);
-  EXPECT_NSEQ(NSMakeRect(0, 543, 600, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 517, 600, 26), output.bookmarkFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 517, 600, 95), output.fullscreenBackingBarFrame);
-  EXPECT_EQ(517, output.findBarMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 445, 600, 72), output.infoBarFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 0, 600, 44), output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 44, 600, 411), output.contentAreaFrame);
-}
-
-TEST_F(BrowserWindowLayoutTest, TestPopupWindow) {
-  [layout setHasTabStrip:NO];
-  [layout setHasToolbar:NO];
-  [layout setHasLocationBar:YES];
-  [layout setBookmarkBarHidden:YES];
-  [layout setHasDownloadShelf:NO];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSZeroRect, output.tabStripLayout.frame);
-  EXPECT_NSEQ(NSZeroRect, output.tabStripLayout.avatarFrame);
-  EXPECT_EQ(0, output.tabStripLayout.leadingIndent);
-  EXPECT_EQ(0, output.tabStripLayout.trailingIndent);
-  EXPECT_NSEQ(NSMakeRect(1, 568, 598, 32), output.toolbarFrame);
-  EXPECT_NSEQ(NSZeroRect, output.bookmarkFrame);
-  EXPECT_NSEQ(NSZeroRect, output.fullscreenBackingBarFrame);
-  EXPECT_EQ(567, output.findBarMaxY);
-  EXPECT_NSEQ(NSMakeRect(0, 495, 600, 72), output.infoBarFrame);
-  EXPECT_NSEQ(NSZeroRect, output.downloadShelfFrame);
-  EXPECT_NSEQ(NSMakeRect(0, 0, 600, 495), output.contentAreaFrame);
-}
-
-// Old style avatar button is on the right of the fullscreen button.
-// The tab strip's right indent goes up to the left side of the fullscreen
-// button.
-TEST_F(BrowserWindowLayoutTest, TestOldStyleAvatarButton) {
-  NSRect fullscreenButtonFrame = NSMakeRect(510, 596, 16, 17);
-  [layout setFullscreenButtonFrame:fullscreenButtonFrame];
-  [layout setShouldUseNewAvatar:NO];
-
-  chrome::TabStripLayout tabStripLayout = [layout computeLayout].tabStripLayout;
-
-  EXPECT_LE(NSMaxX(fullscreenButtonFrame), NSMinX(tabStripLayout.avatarFrame));
-  EXPECT_EQ(NSWidth(tabStripLayout.frame) - NSMinX(fullscreenButtonFrame),
-            tabStripLayout.trailingIndent);
-}
-
-// New style avatar button is on the left of the fullscreen button.
-// The tab strip's right indent goes up to the left side of the avatar button.
-TEST_F(BrowserWindowLayoutTest, TestNewStyleAvatarButton) {
-  NSRect fullscreenButtonFrame = NSMakeRect(575, 596, 16, 17);
-  [layout setFullscreenButtonFrame:fullscreenButtonFrame];
-  [layout setShouldUseNewAvatar:YES];
-
-  chrome::TabStripLayout tabStripLayout = [layout computeLayout].tabStripLayout;
-
-  EXPECT_LE(NSMaxX(tabStripLayout.avatarFrame), NSMinX(fullscreenButtonFrame));
-  EXPECT_EQ(NSWidth(tabStripLayout.frame) - NSMinX(tabStripLayout.avatarFrame),
-            tabStripLayout.trailingIndent);
-}
-
-// There is no fullscreen button when in fullscreen mode.
-// The tab strip's right indent goes up to the left side of the avatar
-// button.
-TEST_F(BrowserWindowLayoutTest, TestAvatarButtonFullscreen) {
-  [layout setInAnyFullscreen:YES];
-  [layout setFullscreenButtonFrame:NSZeroRect];
-
-  [layout setShouldUseNewAvatar:YES];
-  chrome::TabStripLayout tabStripLayout = [layout computeLayout].tabStripLayout;
-  EXPECT_EQ(NSWidth(tabStripLayout.frame) - NSMinX(tabStripLayout.avatarFrame),
-            tabStripLayout.trailingIndent);
-
-  [layout setShouldUseNewAvatar:NO];
-  tabStripLayout = [layout computeLayout].tabStripLayout;
-  EXPECT_EQ(NSWidth(tabStripLayout.frame) - NSMinX(tabStripLayout.avatarFrame),
-            tabStripLayout.trailingIndent);
-}
-
-TEST_F(BrowserWindowLayoutTest, TestInfobarLayoutWithoutToolbarOrLocationBar) {
-  [layout setHasTabStrip:NO];
-  [layout setHasToolbar:NO];
-  [layout setHasLocationBar:NO];
-  [layout setBookmarkBarHidden:YES];
-  [layout setHasDownloadShelf:NO];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSMakeRect(0, 528, 600, 72), output.infoBarFrame);
-}
-
-// Tests that the avatar button is not aligned on the half pixel.
-TEST_F(BrowserWindowLayoutTest, TestAvatarButtonPixelAlignment) {
-  [layout setAvatarSize:NSMakeSize(28, 28)];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-
-  EXPECT_NSEQ(NSMakeRect(537, 589, 28, 28), output.tabStripLayout.avatarFrame);
-}
-
-// Tests that the avatar button is aligned properly on the right. The generic
-// avatar button should be aligned differently.
-TEST_F(BrowserWindowLayoutTest, TestAvatarButtonAlignment) {
-  [layout setShouldUseNewAvatar:YES];
-  [layout setFullscreenButtonFrame:NSZeroRect];
-  [layout setIsGenericAvatar:NO];
-
-  chrome::LayoutOutput output = [layout computeLayout];
-  EXPECT_EQ(596, NSMaxX(output.tabStripLayout.avatarFrame));
-
-  [layout setIsGenericAvatar:YES];
-  output = [layout computeLayout];
-  EXPECT_EQ(595, NSMaxX(output.tabStripLayout.avatarFrame));
-}
diff --git a/chrome/browser/ui/cocoa/browser_window_utils.mm b/chrome/browser/ui/cocoa/browser_window_utils.mm
index 4b1b019..9034459 100644
--- a/chrome/browser/ui/cocoa/browser_window_utils.mm
+++ b/chrome/browser/ui/cocoa/browser_window_utils.mm
@@ -9,7 +9,6 @@
 #include "chrome/browser/global_keyboard_shortcuts_mac.h"
 #include "chrome/browser/ui/browser.h"
 #import "chrome/browser/ui/cocoa/chrome_event_processing_window.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -93,35 +92,14 @@
 + (NSPoint)themeImagePositionFor:(NSView*)windowView
                     withTabStrip:(NSView*)tabStripView
                        alignment:(ThemeImageAlignment)alignment {
-  if (!tabStripView) {
-    return NSMakePoint(kPatternHorizontalOffset,
-                       NSHeight([windowView bounds]) +
-                           GetPatternVerticalOffsetWithTabStrip(false));
-  }
-
-  NSPoint position =
-      [BrowserWindowUtils themeImagePositionInTabStripCoords:tabStripView
-                                                   alignment:alignment];
-  return [tabStripView convertPoint:position toView:windowView];
+  return NSMakePoint(kPatternHorizontalOffset,
+                     NSHeight([windowView bounds]) +
+                         GetPatternVerticalOffsetWithTabStrip(false));
 }
 
 + (NSPoint)themeImagePositionInTabStripCoords:(NSView*)tabStripView
                                     alignment:(ThemeImageAlignment)alignment {
-  DCHECK(tabStripView);
-
-  if (alignment == THEME_IMAGE_ALIGN_WITH_TAB_STRIP) {
-    // The theme image is lined up with the top of the tab which is below the
-    // top of the tab strip.
-    return NSMakePoint(kPatternHorizontalOffset,
-                       [TabStripControllerCocoa defaultTabHeight] +
-                           GetPatternVerticalOffsetWithTabStrip(true));
-  }
-  // The theme image is lined up with the top of the tab strip (as opposed to
-  // the top of the tab above). This is the same as lining up with the top of
-  // the window's root view when not in presentation mode.
-  return NSMakePoint(kPatternHorizontalOffset,
-                     NSHeight([tabStripView bounds]) +
-                         GetPatternVerticalOffsetWithTabStrip(false));
+  return NSZeroPoint;
 }
 
 + (void)activateWindowForController:(NSWindowController*)controller {
diff --git a/chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.mm b/chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.mm
index 1e01310..ccb704dc 100644
--- a/chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.mm
+++ b/chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.mm
@@ -13,7 +13,6 @@
 #include "chrome/browser/ui/browser_finder.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h"
 #import "chrome/browser/ui/cocoa/browser_window_views_mac.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "ui/content_accelerators/accelerator_util.h"
 #include "ui/views/widget/widget.h"
diff --git a/chrome/browser/ui/cocoa/hover_close_button.h b/chrome/browser/ui/cocoa/hover_close_button.h
deleted file mode 100644
index 0d64415..0000000
--- a/chrome/browser/ui/cocoa/hover_close_button.h
+++ /dev/null
@@ -1,33 +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 CHROME_BROWSER_UI_COCOA_HOVER_CLOSE_BUTTON_H_
-#define CHROME_BROWSER_UI_COCOA_HOVER_CLOSE_BUTTON_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include "third_party/skia/include/core/SkColor.h"
-#import "ui/base/cocoa/hover_button.h"
-
-@class GTMKeyValueAnimation;
-
-// The standard close button for our Mac UI which is the "x" that changes to a
-// dark circle with the "x" when you hover over it. Used to close tabs.
-@interface HoverCloseButton : HoverButtonCocoa<NSAnimationDelegate> {
- @private
-  GTMKeyValueAnimation* fadeOutAnimation_;
-  CloseButtonHoverState previousState_;
-}
-
-// The color of the icon in its idle (not-hovering) state.
-@property(nonatomic) SkColor iconColor;
-
-@end
-
-// A version of HoverCloseButton with the "x" icon changed to match the WebUI
-// look.
-@interface WebUIHoverCloseButton : HoverCloseButton
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_HOVER_CLOSE_BUTTON_H_
diff --git a/chrome/browser/ui/cocoa/hover_close_button.mm b/chrome/browser/ui/cocoa/hover_close_button.mm
deleted file mode 100644
index a74198c..0000000
--- a/chrome/browser/ui/cocoa/hover_close_button.mm
+++ /dev/null
@@ -1,296 +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.
-
-#import "chrome/browser/ui/cocoa/hover_close_button.h"
-
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/strings/grit/components_strings.h"
-#import "third_party/google_toolbox_for_mac/src/AppKit/GTMKeyValueAnimation.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/color_palette.h"
-#include "ui/gfx/geometry/rect_f.h"
-#include "ui/gfx/image/canvas_image_source.h"
-#include "ui/gfx/image/image_skia_operations.h"
-#include "ui/gfx/image/image_skia_util_mac.h"
-#include "ui/gfx/paint_vector_icon.h"
-#include "ui/resources/grit/ui_resources.h"
-
-namespace  {
-const CGFloat kFramesPerSecond = 16; // Determined experimentally to look good.
-const CGFloat kCloseAnimationDuration = 0.1;
-const int kTabCloseButtonSize = 16;
-
-// Strings that are used for all close buttons. Set up in +initialize.
-NSString* gBasicAccessibilityTitle = nil;
-NSString* gTooltip = nil;
-
-// If this string is changed, the setter (currently setFadeOutValue:) must
-// be changed as well to match.
-NSString* const kFadeOutValueKeyPath = @"fadeOutValue";
-
-const SkColor kDefaultIconColor = SkColorSetARGB(0xA0, 0x00, 0x00, 0x00);
-
-class HighlightImage : public gfx::CanvasImageSource {
- public:
-  explicit HighlightImage(const int image_size, SkColor color)
-      : CanvasImageSource(gfx::Size(image_size, image_size),
-                          /*is_opaque =*/true),
-        color_(color) {}
-  ~HighlightImage() override {}
-
- private:
-  void Draw(gfx::Canvas* canvas) override {
-    cc::PaintFlags flags;
-    flags.setAntiAlias(true);
-    flags.setStyle(cc::PaintFlags::kFill_Style);
-    flags.setColor(color_);
-    canvas->DrawCircle(
-        gfx::RectF(size().width(), size().height()).CenterPoint(),
-        kTabCloseButtonSize / 2, flags);
-  }
-
-  SkColor color_;
-
-  DISALLOW_COPY_AND_ASSIGN(HighlightImage);
-};
-
-}  // namespace
-
-@interface HoverCloseButton ()
-
-// Common initialization routine called from initWithFrame and awakeFromNib.
-- (void)commonInit;
-
-// Called by |fadeOutAnimation_| when animated value changes.
-- (void)setFadeOutValue:(CGFloat)value;
-
-// Gets the image for the given hover state.
-- (NSImage*)imageForHoverState:(CloseButtonHoverState)hoverState;
-
-@end
-
-@implementation HoverCloseButton
-
-@synthesize iconColor = iconColor_;
-
-+ (void)initialize {
-  // Grab some strings that are used by all close buttons.
-  if (!gBasicAccessibilityTitle) {
-    gBasicAccessibilityTitle = [l10n_util::GetNSStringWithFixup(
-        IDS_ACCNAME_CLOSE) copy];
-  }
-  if (!gTooltip)
-    gTooltip = [l10n_util::GetNSStringWithFixup(IDS_TOOLTIP_CLOSE_TAB) copy];
-}
-
-- (void)commonInit {
-  [super commonInit];
-
-  [self setAccessibilityTitle:nil];
-
-  // Add a tooltip. Using 'owner:self' means that
-  // -view:stringForToolTip:point:userData: will be called to provide the
-  // tooltip contents immediately before showing it.
-  [self addToolTipRect:[self bounds] owner:self userData:NULL];
-
-  previousState_ = kHoverStateNone;
-  iconColor_ = kDefaultIconColor;
-}
-
-- (void)removeFromSuperview {
-  // -stopAnimation will call the animationDidStop: delegate method
-  // which will release our animation.
-  [fadeOutAnimation_ stopAnimation];
-  [super removeFromSuperview];
-}
-
-- (void)animationDidStop:(NSAnimation*)animation {
-  DCHECK(animation == fadeOutAnimation_);
-  [fadeOutAnimation_ setDelegate:nil];
-  [fadeOutAnimation_ release];
-  fadeOutAnimation_ = nil;
-}
-
-- (void)animationDidEnd:(NSAnimation*)animation {
-  [self animationDidStop:animation];
-}
-
-- (void)drawRect:(NSRect)dirtyRect {
-  NSImage* image = [self imageForHoverState:[self hoverState]];
-
-  // Close boxes align left horizontally, and align center vertically.
-  // http:crbug.com/14739 requires this.
-  NSRect imageRect = NSZeroRect;
-  imageRect.size = [image size];
-
-  NSRect destRect = [self bounds];
-  destRect.origin.y = floor((NSHeight(destRect) / 2)
-                            - (NSHeight(imageRect) / 2));
-  destRect.size = imageRect.size;
-
-  switch(self.hoverState) {
-    case kHoverStateMouseOver:
-    case kHoverStateMouseDown:
-      [image drawInRect:destRect
-               fromRect:imageRect
-              operation:NSCompositeSourceOver
-               fraction:1.0
-         respectFlipped:YES
-                  hints:nil];
-      break;
-
-    case kHoverStateNone: {
-      CGFloat value = 1.0;
-      if (fadeOutAnimation_) {
-        value = [fadeOutAnimation_ currentValue];
-        NSImage* previousImage = nil;
-        if (previousState_ == kHoverStateMouseOver)
-          previousImage = [self imageForHoverState:kHoverStateMouseOver];
-        else
-          previousImage = [self imageForHoverState:kHoverStateMouseDown];
-        [previousImage drawInRect:destRect
-                         fromRect:imageRect
-                        operation:NSCompositeSourceOver
-                         fraction:1.0 - value
-                   respectFlipped:YES
-                            hints:nil];
-      }
-      [image drawInRect:destRect
-               fromRect:imageRect
-              operation:NSCompositeSourceOver
-               fraction:value
-         respectFlipped:YES
-                  hints:nil];
-      break;
-    }
-  }
-}
-
-- (void)drawFocusRingMask {
-  // Match the hover image's shape.
-  NSRect circleRect = NSInsetRect([self bounds], 2, 2);
-  [[NSBezierPath bezierPathWithOvalInRect:circleRect] fill];
-}
-
-- (void)setFadeOutValue:(CGFloat)value {
-  [self setNeedsDisplay];
-}
-
-- (NSImage*)imageForHoverState:(CloseButtonHoverState)hoverState {
-  SkColor vectorIconColor = gfx::kPlaceholderColor;
-
-  switch (hoverState) {
-    case kHoverStateNone:
-      break;
-    case kHoverStateMouseOver:
-      // For mouse over, the icon color is the fill color of the circle.
-      vectorIconColor = SkColorSetARGB(0xFF, 0xDB, 0x44, 0x37);
-      break;
-    case kHoverStateMouseDown:
-      // For mouse pressed, the icon color is the fill color of the circle.
-      vectorIconColor = SkColorSetARGB(0xFF, 0xA8, 0x35, 0x2A);
-      break;
-  }
-
-  const gfx::ImageSkia iconImage = gfx::CreateVectorIcon(
-      kTabCloseNormalIcon, kTabCloseButtonSize,
-      hoverState != kHoverStateNone ? SK_ColorWHITE : iconColor_);
-
-  if (hoverState != kHoverStateNone) {
-    const gfx::ImageSkia highlight =
-        gfx::CanvasImageSource::MakeImageSkia<HighlightImage>(
-            kTabCloseButtonSize, vectorIconColor);
-    return NSImageFromImageSkia(
-        gfx::ImageSkiaOperations::CreateSuperimposedImage(highlight,
-                                                          iconImage));
-  }
-  return NSImageFromImageSkia(iconImage);
-}
-
-- (void)setHoverState:(CloseButtonHoverState)state {
-  if (state != self.hoverState) {
-    previousState_ = self.hoverState;
-    [super setHoverState:state];
-    // Only animate the HoverStateNone case and only if this is still in the
-    // view hierarchy.
-    if (state == kHoverStateNone && [self superview] != nil) {
-      DCHECK(fadeOutAnimation_ == nil);
-      fadeOutAnimation_ =
-          [[GTMKeyValueAnimation alloc] initWithTarget:self
-                                               keyPath:kFadeOutValueKeyPath];
-      [fadeOutAnimation_ setDuration:kCloseAnimationDuration];
-      [fadeOutAnimation_ setFrameRate:kFramesPerSecond];
-      [fadeOutAnimation_ setDelegate:self];
-      [fadeOutAnimation_ startAnimation];
-    } else {
-      // -stopAnimation will call the animationDidStop: delegate method
-      // which will clean up the animation.
-      [fadeOutAnimation_ stopAnimation];
-    }
-  }
-}
-
-// Called each time a tooltip is about to be shown.
-- (NSString*)view:(NSView*)view
- stringForToolTip:(NSToolTipTag)tag
-            point:(NSPoint)point
-         userData:(void*)userData {
-  if (self.hoverState == kHoverStateMouseOver) {
-    // In some cases (e.g. the download tray), the button is still in the
-    // hover state, but is outside the bounds of its parent and not visible.
-    // Don't show the tooltip in that case.
-    NSRect buttonRect = [self frame];
-    NSRect parentRect = [[self superview] bounds];
-    if (NSIntersectsRect(buttonRect, parentRect))
-      return gTooltip;
-  }
-
-  return nil;  // Do not show the tooltip.
-}
-
-- (void)setAccessibilityTitle:(NSString*)accessibilityTitle {
-  if (!accessibilityTitle) {
-    [super setAccessibilityTitle:gBasicAccessibilityTitle];
-    return;
-  }
-
-  NSString* extendedTitle = l10n_util::GetNSStringFWithFixup(
-      IDS_ACCNAME_CLOSE_TAB,
-      base::SysNSStringToUTF16(accessibilityTitle));
-  [super setAccessibilityTitle:extendedTitle];
-}
-
-- (void)setIconColor:(SkColor)iconColor {
-  if (iconColor != iconColor_) {
-    iconColor_ = iconColor;
-    [self setNeedsDisplay:YES];
-  }
-}
-
-@end
-
-@implementation WebUIHoverCloseButton
-
-- (NSImage*)imageForHoverState:(CloseButtonHoverState)hoverState {
-  int imageID = IDR_CLOSE_DIALOG;
-  switch (hoverState) {
-    case kHoverStateNone:
-      imageID = IDR_CLOSE_DIALOG;
-      break;
-    case kHoverStateMouseOver:
-      imageID = IDR_CLOSE_DIALOG_H;
-      break;
-    case kHoverStateMouseDown:
-      imageID = IDR_CLOSE_DIALOG_P;
-      break;
-  }
-  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  return bundle.GetNativeImageNamed(imageID).ToNSImage();
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/hover_close_button_unittest.mm b/chrome/browser/ui/cocoa/hover_close_button_unittest.mm
deleted file mode 100644
index bffe11b..0000000
--- a/chrome/browser/ui/cocoa/hover_close_button_unittest.mm
+++ /dev/null
@@ -1,38 +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.
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/hover_close_button.h"
-#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-class HoverCloseButtonTest : public CocoaTest {
- public:
-  HoverCloseButtonTest() {
-    NSRect content_frame = [[test_window() contentView] frame];
-    button_.reset([[HoverCloseButton alloc] initWithFrame:content_frame]);
-    [[test_window() contentView] addSubview:button_];
-  }
-
- protected:
-  base::scoped_nsobject<HoverCloseButton> button_;
-};
-
-class WebUIHoverCloseButtonTest : public CocoaTest {
- public:
-  WebUIHoverCloseButtonTest() {
-    NSRect content_frame = [[test_window() contentView] frame];
-    button_.reset([[WebUIHoverCloseButton alloc] initWithFrame:content_frame]);
-    [[test_window() contentView] addSubview:button_];
-  }
-
- protected:
-  base::scoped_nsobject<WebUIHoverCloseButton> button_;
-};
-
-TEST_VIEW(HoverCloseButtonTest, button_)
-
-TEST_VIEW(WebUIHoverCloseButtonTest, button_)
diff --git a/chrome/browser/ui/cocoa/spinner_view.h b/chrome/browser/ui/cocoa/spinner_view.h
deleted file mode 100644
index 93e8516..0000000
--- a/chrome/browser/ui/cocoa/spinner_view.h
+++ /dev/null
@@ -1,65 +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 CHROME_BROWSER_UI_COCOA_SPINNER_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_SPINNER_VIEW_H_
-
-#import <Cocoa/Cocoa.h>
-
-#import "base/mac/scoped_nsobject.h"
-#include "base/mac/sdk_forward_declarations.h"
-#include "third_party/skia/include/core/SkColor.h"
-
-// A view that displays a Material Design Circular Activity Indicator (aka a
-// "spinner") for Mac Chrome. To use, create a SpinnerView of the desired size
-// and add to a view hierarchy. SpinnerView uses Core Animation to achieve GPU-
-// accelerated animation and smooth scaling to any size.
-@interface SpinnerView : NSView
-@property(retain, nonatomic) CAAnimation* spinnerAnimation;
-@property(retain, nonatomic) CAAnimation* rotationAnimation;
-
-// Returns the time in seconds for one full arc rotation.
-+ (CGFloat)arcRotationTime;
-
-// Returns the spinner arc's radius when unscaled.
-+ (CGFloat)arcUnitRadius;
-
-// Returns the spinner arc's starting angle.
-- (CGFloat)arcStartAngle;
-
-// Returns the spinner arc's end angle delta (i.e. the spinner adds the
-// absolute value of this delta to arcStartAngle to compute the end angle).
-// Return a negative delta to rotate the spinner counter clockwise.
-- (CGFloat)arcEndAngleDelta;
-
-// Returns the arc's length (the distance from arcStart to arcEnd along the
-// circumference of a circle with radius arcRadius).
-- (CGFloat)arcLength;
-
-// Returns the scale factor for sizing the vector strokes to fit the
-// SpinnerView's bounds.
-- (CGFloat)scaleFactor;
-
-// Returns the SpinnerView's custom CALayer (called from setWantsLayer:).
-- (CALayer*)makeBackingLayer;
-
-// Override point for subclasses to perform animation initialization.
-- (void)initializeAnimation;
-
-// Return YES if the spinner is animating.
-- (BOOL)isAnimating;
-
-// Returns the default theme's throbber color. Subclasses can override to
-// return a custom spinner color.
-- (NSColor*)spinnerColor;
-
-// Updates the spinner to the color returned from -spinnerColor.
-- (void)updateSpinnerColor;
-
-// Restarts the spinner's animation.
-- (void)restartAnimation;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_SPINNER_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/spinner_view.mm b/chrome/browser/ui/cocoa/spinner_view.mm
deleted file mode 100644
index cf92e2e..0000000
--- a/chrome/browser/ui/cocoa/spinner_view.mm
+++ /dev/null
@@ -1,345 +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.
-
-#import "chrome/browser/ui/cocoa/spinner_view.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-#include "base/mac/scoped_cftyperef.h"
-#include "base/mac/sdk_forward_declarations.h"
-#import "chrome/browser/ui/cocoa/md_util.h"
-#include "chrome/browser/ui/cocoa/spinner_util.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "ui/base/theme_provider.h"
-#include "ui/native_theme/native_theme.h"
-
-using cocoa_spinner_util::kDegrees90;
-using cocoa_spinner_util::kDegrees135;
-using cocoa_spinner_util::kDegrees180;
-using cocoa_spinner_util::kDegrees270;
-using cocoa_spinner_util::kDegrees360;
-using cocoa_spinner_util::kSpinnerViewUnitWidth;
-using cocoa_spinner_util::kSpinnerUnitInset;
-using cocoa_spinner_util::kArcDiameter;
-using cocoa_spinner_util::kArcRadius;
-using cocoa_spinner_util::kArcLength;
-using cocoa_spinner_util::kArcStrokeWidth;
-using cocoa_spinner_util::kArcAnimationTime;
-using cocoa_spinner_util::kRotationTime;
-using cocoa_spinner_util::kSpinnerAnimationName;
-using cocoa_spinner_util::kRotationAnimationName;
-
-@implementation SpinnerView {
-  CAShapeLayer* shapeLayer_;  // Weak.
-  CALayer* rotationLayer_;    // Weak.
-}
-
-@synthesize spinnerAnimation = spinnerAnimation_;
-@synthesize rotationAnimation = rotationAnimation_;
-
-+ (CGFloat)arcRotationTime {
-  return kRotationTime;
-}
-
-+ (CGFloat)arcUnitRadius {
-  return kArcRadius;
-}
-
-- (instancetype)initWithFrame:(NSRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    [self setWantsLayer:YES];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-  self.spinnerAnimation = nil;
-  self.rotationAnimation = nil;
-  [super dealloc];
-}
-
-- (CGFloat)scaleFactor {
-  return [self bounds].size.width / kSpinnerViewUnitWidth;
-}
-
-// Register/unregister for window miniaturization event notifications so that
-// the spinner can stop animating if the window is minaturized
-// (i.e. not visible).
-- (void)viewWillMoveToWindow:(NSWindow*)newWindow {
-  if ([self window]) {
-    [[NSNotificationCenter defaultCenter]
-        removeObserver:self
-                  name:NSWindowWillMiniaturizeNotification
-                object:[self window]];
-    [[NSNotificationCenter defaultCenter]
-        removeObserver:self
-                  name:NSWindowDidDeminiaturizeNotification
-                object:[self window]];
-  }
-
-  if (newWindow) {
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(updateAnimation:)
-               name:NSWindowWillMiniaturizeNotification
-             object:newWindow];
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(updateAnimation:)
-               name:NSWindowDidDeminiaturizeNotification
-             object:newWindow];
-  }
-}
-
-// Start or stop the animation whenever the view is added to or removed from a
-// window.
-- (void)viewDidMoveToWindow {
-  [self updateAnimation:nil];
-}
-
-- (BOOL)isAnimating {
-  return [shapeLayer_ animationForKey:kSpinnerAnimationName] != nil ||
-         [rotationLayer_ animationForKey:kRotationAnimationName] != nil;
-}
-
-- (NSColor*)spinnerColor {
-  SkColor skSpinnerColor =
-      ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
-          ui::NativeTheme::kColorId_ThrobberSpinningColor);
-  return skia::SkColorToSRGBNSColor(skSpinnerColor);
-}
-
-- (CGFloat)arcStartAngle {
-  return kDegrees180;
-}
-
-- (CGFloat)arcEndAngleDelta {
-  return -kDegrees270;
-}
-
-- (CGFloat)arcLength {
-  return kArcLength;
-}
-
-- (void)updateSpinnerColor {
-  [shapeLayer_ setStrokeColor:[[self spinnerColor] CGColor]];
-}
-
-- (void)updateSpinnerPath {
-  CGRect bounds = [self bounds];
-  CGFloat scaleFactor = [self scaleFactor];
-
-  // Create the arc that, when stroked, creates the spinner.
-  base::ScopedCFTypeRef<CGMutablePathRef> shapePath(CGPathCreateMutable());
-  CGFloat startAngle = [self arcStartAngle];
-  CGFloat endAngleDelta = [self arcEndAngleDelta];
-  bool counterClockwise = endAngleDelta < 0;
-  endAngleDelta = ABS(endAngleDelta);
-
-  CGPathAddArc(shapePath, NULL, bounds.size.width / 2.0,
-               bounds.size.height / 2.0, kArcRadius * scaleFactor, startAngle,
-               startAngle + endAngleDelta, !counterClockwise);
-  [shapeLayer_ setPath:shapePath];
-
-  // Set the line dash pattern. Animating the pattern causes the arc to
-  // grow from start angle to end angle.
-  [shapeLayer_ setLineDashPattern:@[ @([self arcLength] * scaleFactor) ]];
-
-  [self updateSpinnerColor];
-}
-
-- (CALayer*)makeBackingLayer {
-  shapeLayer_ = [CAShapeLayer layer];
-
-  CGRect bounds = [self bounds];
-  [shapeLayer_ setBounds:bounds];
-
-  // Per the design, the line width does not scale linearly.
-  CGFloat scaleFactor = [self scaleFactor];
-  CGFloat scaledDiameter = kArcDiameter * scaleFactor;
-  CGFloat lineWidth;
-  if (scaledDiameter < kArcDiameter) {
-    lineWidth = kArcStrokeWidth - (kArcDiameter - scaledDiameter) / 16.0;
-  } else {
-    lineWidth = kArcStrokeWidth + (scaledDiameter - kArcDiameter) / 11.0;
-  }
-  [shapeLayer_ setLineWidth:lineWidth];
-  [shapeLayer_ setLineCap:kCALineCapRound];
-  [shapeLayer_ setFillColor:NULL];
-
-  [self updateSpinnerPath];
-
-  // Place |shapeLayer_| in a layer so that it's easy to rotate the entire
-  // spinner animation.
-  rotationLayer_ = [CALayer layer];
-  [rotationLayer_ setBounds:bounds];
-  [rotationLayer_ addSublayer:shapeLayer_];
-  [shapeLayer_ setPosition:CGPointMake(NSMidX(bounds), NSMidY(bounds))];
-
-  // Place |rotationLayer_| in a parent layer so that it's easy to rotate
-  // |rotationLayer_| around the center of the view.
-  CALayer* parentLayer = [CALayer layer];
-  [parentLayer setBounds:bounds];
-  [parentLayer addSublayer:rotationLayer_];
-  [rotationLayer_ setPosition:CGPointMake(bounds.size.width / 2.0,
-                                          bounds.size.height / 2.0)];
-  return parentLayer;
-}
-
-// Starts or stops the animation whenever the view's visibility changes.
-- (void)setHidden:(BOOL)flag {
-  BOOL wasHidden = [self isHidden];
-
-  [super setHidden:flag];
-
-  if (wasHidden != flag) {
-    [self updateAnimation:nil];
-  }
-}
-
-// The spinner animation consists of four cycles that it continuously repeats.
-// Each cycle consists of one complete rotation of the spinner's arc plus a
-// rotation adjustment at the end of each cycle (see rotation animation comment
-// below for the reason for the adjustment). The arc's length also grows and
-// shrinks over the course of each cycle, which the spinner achieves by drawing
-// the arc using a (solid) dashed line pattern and animating the "lineDashPhase"
-// property.
-- (void)initializeAnimation {
-  // Make sure |shapeLayer_|'s content scale factor matches the window's
-  // backing depth (e.g. it's 2.0 on Retina Macs). Don't worry about adjusting
-  // any other layers because |shapeLayer_| is the only one displaying content.
-  CGFloat backingScaleFactor = [[self window] backingScaleFactor];
-  [shapeLayer_ setContentsScale:backingScaleFactor];
-
-  // Create the first half of the arc animation, where it grows from a short
-  // block to its full length.
-  base::scoped_nsobject<CAMediaTimingFunction> timingFunction(
-      [CAMediaTimingFunction.cr_materialEaseInOutTimingFunction retain]);
-  base::scoped_nsobject<CAKeyframeAnimation> firstHalfAnimation(
-      [[CAKeyframeAnimation alloc] init]);
-  [firstHalfAnimation setTimingFunction:timingFunction];
-  [firstHalfAnimation setKeyPath:@"lineDashPhase"];
-  // Begin the lineDashPhase animation just short of the full arc length,
-  // otherwise the arc will be zero length at start.
-  CGFloat scaleFactor = [self scaleFactor];
-  NSArray* animationValues = @[ @(-(kArcLength - 0.4) * scaleFactor), @(0.0) ];
-  [firstHalfAnimation setValues:animationValues];
-  NSArray* keyTimes = @[ @(0.0), @(1.0) ];
-  [firstHalfAnimation setKeyTimes:keyTimes];
-  [firstHalfAnimation setDuration:kArcAnimationTime / 2.0];
-  [firstHalfAnimation setRemovedOnCompletion:NO];
-  [firstHalfAnimation setFillMode:kCAFillModeForwards];
-
-  // Create the second half of the arc animation, where it shrinks from full
-  // length back to a short block.
-  base::scoped_nsobject<CAKeyframeAnimation> secondHalfAnimation(
-      [[CAKeyframeAnimation alloc] init]);
-  [secondHalfAnimation setTimingFunction:timingFunction];
-  [secondHalfAnimation setKeyPath:@"lineDashPhase"];
-  // Stop the lineDashPhase animation just before it reaches the full arc
-  // length, otherwise the arc will be zero length at the end.
-  animationValues = @[ @(0.0), @((kArcLength - 0.3) * scaleFactor) ];
-  [secondHalfAnimation setValues:animationValues];
-  [secondHalfAnimation setKeyTimes:keyTimes];
-  [secondHalfAnimation setDuration:kArcAnimationTime / 2.0];
-  [secondHalfAnimation setRemovedOnCompletion:NO];
-  [secondHalfAnimation setFillMode:kCAFillModeForwards];
-
-  // Make four copies of the arc animations, to cover the four complete cycles
-  // of the full animation.
-  NSMutableArray* animations = [NSMutableArray array];
-  CGFloat beginTime = 0;
-  for (NSUInteger i = 0; i < 4; i++, beginTime += kArcAnimationTime) {
-    [firstHalfAnimation setBeginTime:beginTime];
-    [secondHalfAnimation setBeginTime:beginTime + kArcAnimationTime / 2.0];
-    [animations addObject:firstHalfAnimation];
-    [animations addObject:secondHalfAnimation];
-    firstHalfAnimation.reset([firstHalfAnimation copy]);
-    secondHalfAnimation.reset([secondHalfAnimation copy]);
-  }
-
-  // Create a step rotation animation, which rotates the arc 90 degrees on each
-  // cycle. Each arc starts as a short block at degree 0 and ends as a short
-  // block at degree -270. Without a 90 degree rotation at the end of each
-  // cycle, the short block would appear to suddenly jump from -270 degrees to
-  // -360 degrees. The full animation has to contain four of these 90 degree
-  // adjustments in order for the arc to return to its starting point, at which
-  // point the full animation can smoothly repeat.
-  CAKeyframeAnimation* stepRotationAnimation = [CAKeyframeAnimation animation];
-  [stepRotationAnimation setTimingFunction:
-      [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
-  [stepRotationAnimation setKeyPath:@"transform.rotation"];
-  animationValues = @[ @(0.0), @(0.0),
-                       @(kDegrees90),
-                       @(kDegrees90),
-                       @(kDegrees180),
-                       @(kDegrees180),
-                       @(kDegrees270),
-                       @(kDegrees270)];
-  [stepRotationAnimation setValues:animationValues];
-  keyTimes = @[ @(0.0), @(0.25), @(0.25), @(0.5), @(0.5), @(0.75), @(0.75),
-                @(1.0) ];
-  [stepRotationAnimation setKeyTimes:keyTimes];
-  [stepRotationAnimation setDuration:kArcAnimationTime * 4.0];
-  [stepRotationAnimation setRemovedOnCompletion:NO];
-  [stepRotationAnimation setFillMode:kCAFillModeForwards];
-  [stepRotationAnimation setRepeatCount:HUGE_VALF];
-  [animations addObject:stepRotationAnimation];
-
-  // Use an animation group so that the animations are easier to manage, and to
-  // give them the best chance of firing synchronously.
-  CAAnimationGroup* group = [CAAnimationGroup animation];
-  [group setDuration:kArcAnimationTime * 4];
-  [group setRepeatCount:HUGE_VALF];
-  [group setFillMode:kCAFillModeForwards];
-  [group setRemovedOnCompletion:NO];
-  [group setAnimations:animations];
-
-  self.spinnerAnimation = group;
-
-  // Finally, create an animation that rotates the entire spinner layer.
-  CABasicAnimation* rotationAnimation = [CABasicAnimation animation];
-  rotationAnimation.keyPath = @"transform.rotation";
-  [rotationAnimation setFromValue:@0];
-  [rotationAnimation setToValue:@(-kDegrees360)];
-  [rotationAnimation setDuration:kRotationTime];
-  [rotationAnimation setRemovedOnCompletion:NO];
-  [rotationAnimation setFillMode:kCAFillModeForwards];
-  [rotationAnimation setRepeatCount:HUGE_VALF];
-
-  self.rotationAnimation = rotationAnimation;
-}
-
-- (void)updateAnimation:(NSNotification*)notification {
-  // Only animate the spinner if it's within a window, and that window is not
-  // currently minimized or being minimized.
-  if ([self window] && ![[self window] isMiniaturized] && ![self isHidden] &&
-      ![[notification name] isEqualToString:
-           NSWindowWillMiniaturizeNotification]) {
-    [self updateSpinnerPath];
-    if (!spinnerAnimation_) {
-      [self initializeAnimation];
-    }
-    if (![self isAnimating]) {
-      [shapeLayer_ addAnimation:spinnerAnimation_ forKey:kSpinnerAnimationName];
-      [rotationLayer_ addAnimation:rotationAnimation_
-                            forKey:kRotationAnimationName];
-    }
-  } else {
-    [shapeLayer_ removeAllAnimations];
-    [rotationLayer_ removeAllAnimations];
-  }
-}
-
-- (void)restartAnimation {
-  self.spinnerAnimation = nil;
-  self.rotationAnimation = nil;
-  [shapeLayer_ removeAllAnimations];
-  [rotationLayer_ removeAllAnimations];
-
-  [self updateAnimation:nil];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/spinner_view_unittest.mm b/chrome/browser/ui/cocoa/spinner_view_unittest.mm
deleted file mode 100644
index 1244c85..0000000
--- a/chrome/browser/ui/cocoa/spinner_view_unittest.mm
+++ /dev/null
@@ -1,57 +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 "chrome/browser/ui/cocoa/spinner_view.h"
-
-#include "base/mac/mac_util.h"
-#import "ui/base/test/cocoa_helper.h"
-
-namespace {
-
-class SpinnerViewTest : public ui::CocoaTest {
- public:
-  SpinnerViewTest() {
-    CGRect frame = NSMakeRect(0.0, 0.0, 16.0, 16.0);
-    view_.reset([[SpinnerView alloc] initWithFrame:frame]);
-    [[test_window() contentView] addSubview:view_];
-  }
-
-  base::scoped_nsobject<SpinnerView> view_;
-};
-
-TEST_VIEW(SpinnerViewTest, view_)
-
-TEST_F(SpinnerViewTest, StopAnimationOnMiniaturize) {
-  if (base::mac::IsOS10_10())
-    return;  // Fails when swarmed. http://crbug.com/660582
-  EXPECT_TRUE([view_ isAnimating]);
-
-  [test_window() miniaturize:nil];
-  EXPECT_FALSE([view_ isAnimating]);
-
-  [test_window() deminiaturize:nil];
-  EXPECT_TRUE([view_ isAnimating]);
-}
-
-TEST_F(SpinnerViewTest, StopAnimationOnRemoveFromSuperview) {
-  EXPECT_TRUE([view_ isAnimating]);
-
-  [view_ removeFromSuperview];
-  EXPECT_FALSE([view_ isAnimating]);
-
-  [[test_window() contentView] addSubview:view_];
-  EXPECT_TRUE([view_ isAnimating]);
-}
-
-TEST_F(SpinnerViewTest, StopAnimationOnHidden) {
-  EXPECT_TRUE([view_ isAnimating]);
-
-  [view_ setHidden:YES];
-  EXPECT_FALSE([view_ isAnimating]);
-
-  [view_ setHidden:NO];
-  EXPECT_TRUE([view_ isAnimating]);
-}
-
-} // namespace
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller.h b/chrome/browser/ui/cocoa/tabs/tab_controller.h
deleted file mode 100644
index e39c117..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_controller.h
+++ /dev/null
@@ -1,124 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include <memory>
-
-#import "chrome/browser/ui/cocoa/hover_close_button.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h"
-#include "chrome/browser/ui/tabs/tab_menu_model.h"
-#include "chrome/browser/ui/tabs/tab_utils.h"
-#include "url/gurl.h"
-
-// The loading/waiting state of the tab.
-enum TabLoadingState {
-  kTabDone,
-  kTabLoading,
-  kTabWaiting,
-  kTabCrashed,
-};
-
-@class MenuControllerCocoa;
-@class TabViewCocoa;
-@protocol TabControllerTarget;
-
-// A class that manages a single tab in the tab strip. Set its target/action
-// to be sent a message when the tab is selected by the user clicking. Setting
-// the |loading| property to YES visually indicates that this tab is currently
-// loading content via a spinner.
-//
-// The tab has the notion of an "icon view" which can be used to display
-// identifying characteristics such as a favicon, or since it's a full-fledged
-// view, something with state and animation such as a throbber for illustrating
-// progress. The default in the nib is an image view so nothing special is
-// required if that's all you need.
-
-@interface TabControllerCocoa : NSViewController<TabDraggingEventTarget>
-
-@property(readonly, nonatomic) TabLoadingState loadingState;
-
-@property(assign, nonatomic) SEL action;
-// showIcon is YES when the tab should display a favicon (e.g. has an icon, is
-// not the NTP, etc.), and is equivalent to the data.show_icon flag in Views.
-// Actual favicon visibility depends on other factors such as available space,
-// and is reflected in the iconView's isHidden state.
-@property(readonly, nonatomic) BOOL showIcon;
-@property(assign, nonatomic) BOOL pinned;
-@property(assign, nonatomic) BOOL blocked;
-@property(assign, nonatomic) NSString* toolTip;
-// Note that |-selected| will return YES if the controller is |-active|, too.
-// |-setSelected:| affects the selection, while |-setActive:| affects the key
-// status/focus of the content.
-@property(assign, nonatomic) BOOL active;
-@property(assign, nonatomic) BOOL selected;
-@property(assign, nonatomic) id target;
-@property(assign, nonatomic) GURL url;
-@property(readonly, nonatomic) HoverCloseButton* closeButton;
-
-// Default height for tabs.
-+ (CGFloat)defaultTabHeight;
-
-// Minimum and maximum allowable tab width. The minimum width does not show
-// the icon or the close button. The active tab always has at least a close
-// button so it has a different minimum width.
-+ (CGFloat)minTabWidth;
-+ (CGFloat)maxTabWidth;
-+ (CGFloat)minActiveTabWidth;
-+ (CGFloat)pinnedTabWidth;
-
-// The view associated with this controller, pre-casted as a TabViewCocoa
-- (TabViewCocoa*)tabView;
-
-// Sets the tab's icon image.
-// |image| must be 16x16 in size.
-// |showIcon| is YES when the tab should show its favicon.
-- (void)setIconImage:(NSImage*)image
-     forLoadingState:(TabLoadingState)loadingState
-            showIcon:(BOOL)showIcon;
-
-// Sets the current tab alert state and updates the views.
-- (void)setAlertState:(TabAlertState)alertState;
-
-// Sets the tab to display that it needs attention from the user.
-- (void)setNeedsAttention:(bool)attention;
-
-// Closes the associated TabViewCocoa by relaying the message to |target_| to
-// perform the close.
-- (void)closeTab:(id)sender;
-
-// Selects the associated TabViewCocoa by sending |action_| to |target_|.
-- (void)selectTab:(id)sender;
-
-// Called by the tabs to determine whether we are in rapid (tab) closure mode.
-// In this mode, we handle clicks slightly differently due to animation.
-// Ideally, tabs would know about their own animation and wouldn't need this.
-- (BOOL)inRapidClosureMode;
-
-// Updates the visibility of certain subviews, such as the icon and close
-// button, based on criteria such as the tab's selected state and its current
-// width.
-- (void)updateVisibility;
-
-// Update the title color to match the tabs current state.
-- (void)updateTitleColor;
-
-// Returns the accessibility title that should be used for this tab.
-- (NSString*)accessibilityTitle;
-
-// Called by AppKit when this tab is "clicked" using the keyboard.
-- (void)performClick:(id)sender;
-@end
-
-@interface TabControllerCocoa (TestingAPI)
-- (NSView*)iconView;
-- (int)iconCapacity;
-- (BOOL)shouldShowIcon;
-- (BOOL)shouldShowCloseButton;
-@end  // TabControllerCocoa(TestingAPI)
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_controller.mm
deleted file mode 100644
index 81608b3..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_controller.mm
+++ /dev/null
@@ -1,584 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-#include <algorithm>
-#include <cmath>
-
-#include "base/i18n/rtl.h"
-#include "base/mac/bundle_locations.h"
-#include "base/metrics/user_metrics.h"
-#include "base/strings/sys_string_conversions.h"
-#import "chrome/browser/themes/theme_properties.h"
-#import "chrome/browser/themes/theme_service.h"
-#include "chrome/browser/ui/cocoa/l10n_util.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
-#include "chrome/browser/ui/cocoa/tabs/tab_favicon_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-#import "extensions/common/extension.h"
-#include "skia/ext/skia_utils_mac.h"
-#import "ui/base/cocoa/menu_controller.h"
-#include "ui/base/material_design/material_design_controller.h"
-#include "ui/gfx/favicon_size.h"
-#include "ui/native_theme/native_theme.h"
-
-namespace {
-
-// A C++ delegate that handles enabling/disabling menu items and handling when
-// a menu command is chosen. Also fixes up the menu item label for "pin/unpin
-// tab".
-class MenuDelegate : public ui::SimpleMenuModel::Delegate {
- public:
-  explicit MenuDelegate(id<TabControllerTarget> target,
-                        TabControllerCocoa* owner)
-      : target_(target), owner_(owner) {}
-
-  // Overridden from ui::SimpleMenuModel::Delegate
-  bool IsCommandIdChecked(int command_id) const override { return false; }
-  bool IsCommandIdEnabled(int command_id) const override {
-    TabStripModel::ContextMenuCommand command =
-        static_cast<TabStripModel::ContextMenuCommand>(command_id);
-    return [target_ isCommandEnabled:command forController:owner_];
-  }
-  void ExecuteCommand(int command_id, int event_flags) override {
-    TabStripModel::ContextMenuCommand command =
-        static_cast<TabStripModel::ContextMenuCommand>(command_id);
-    [target_ commandDispatch:command forController:owner_];
-  }
-
- private:
-  id<TabControllerTarget> target_;  // weak
-  TabControllerCocoa* owner_;       // weak, owns me
-};
-
-}  // namespace
-
-@interface TabControllerCocoa () {
-  base::scoped_nsobject<TabFaviconView> iconView_;
-  base::scoped_nsobject<NSImage> icon_;
-  base::scoped_nsobject<NSView> attentionDotView_;
-  base::scoped_nsobject<HoverCloseButton> closeButton_;
-
-  BOOL active_;
-  BOOL selected_;
-  std::unique_ptr<ui::SimpleMenuModel> contextMenuModel_;
-  std::unique_ptr<MenuDelegate> contextMenuDelegate_;
-  base::scoped_nsobject<MenuControllerCocoa> contextMenuController_;
-
-  enum AttentionType : int {
-    kBlockedWebContents = 1 << 0,       // The WebContents is marked as blocked.
-    kTabWantsAttentionStatus = 1 << 1,  // SetTabNeedsAttention() was called.
-  };
-}
-
-@property(nonatomic) int currentAttentionTypes;  // Bitmask of AttentionType.
-
-// Recomputes the iconView's frame and updates it with or without animation.
-- (void)updateIconViewFrameWithAnimation:(BOOL)shouldAnimate;
-
-@end
-
-@implementation TabControllerCocoa
-
-@synthesize action = action_;
-@synthesize currentAttentionTypes = currentAttentionTypes_;
-@synthesize loadingState = loadingState_;
-@synthesize showIcon = showIcon_;
-@synthesize pinned = pinned_;
-@synthesize target = target_;
-@synthesize url = url_;
-
-namespace {
-constexpr CGFloat kTabLeadingPadding = 18;
-constexpr CGFloat kTabTrailingPadding = 15;
-constexpr CGFloat kMinTabWidth = 36;
-constexpr CGFloat kMinActiveTabWidth = 52;
-constexpr CGFloat kMaxTabWidth = 246;
-constexpr CGFloat kCloseButtonSize = 16;
-constexpr CGFloat kInitialTabWidth = 160;
-constexpr CGFloat kTitleLeadingPadding = 4;
-constexpr CGFloat kInitialTitleWidth = 92;
-constexpr CGFloat kTitleHeight = 17;
-constexpr CGFloat kTabElementYOrigin = 6;
-constexpr CGFloat kDefaultTabHeight = 29;
-constexpr CGFloat kPinnedTabWidth = kDefaultTabHeight * 2;
-}  // namespace
-
-+ (CGFloat)defaultTabHeight {
-  return kDefaultTabHeight;
-}
-
-// The min widths is the smallest number at which the right edge of the right
-// tab border image is not visibly clipped.  It is a bit smaller than the sum
-// of the two tab edge bitmaps because these bitmaps have a few transparent
-// pixels on the side.  The selected tab width includes the close button width.
-+ (CGFloat)minTabWidth {
-  return kMinTabWidth;
-}
-+ (CGFloat)minActiveTabWidth {
-  return kMinActiveTabWidth;
-}
-+ (CGFloat)maxTabWidth {
-  return kMaxTabWidth;
-}
-
-+ (CGFloat)pinnedTabWidth {
-  return kPinnedTabWidth;
-}
-
-- (TabViewCocoa*)tabView {
-  DCHECK([[self view] isKindOfClass:[TabViewCocoa class]]);
-  return static_cast<TabViewCocoa*>([self view]);
-}
-
-- (id)init {
-  if ((self = [super init])) {
-    BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-
-    // Create the close button.
-    const CGFloat closeButtonXOrigin =
-        isRTL ? kTabTrailingPadding
-              : kInitialTabWidth - kCloseButtonSize - kTabTrailingPadding;
-    NSRect closeButtonFrame = NSMakeRect(closeButtonXOrigin, kTabElementYOrigin,
-                                         kCloseButtonSize, kCloseButtonSize);
-    closeButton_.reset(
-        [[HoverCloseButton alloc] initWithFrame:closeButtonFrame]);
-    [closeButton_
-        setAutoresizingMask:isRTL ? NSViewMaxXMargin : NSViewMinXMargin];
-    [closeButton_ setTarget:self];
-    [closeButton_ setAction:@selector(closeTab:)];
-
-    // Create the TabViewCocoa. The TabViewCocoa works directly with the
-    // closeButton so here (the TabViewCocoa handles adding it as a subview).
-    base::scoped_nsobject<TabViewCocoa> tabView([[TabViewCocoa alloc]
-        initWithFrame:NSMakeRect(0, 0, kInitialTabWidth,
-                                 [TabControllerCocoa defaultTabHeight])
-           controller:self
-          closeButton:closeButton_]);
-    [tabView setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin];
-    [tabView setPostsFrameChangedNotifications:NO];
-    [tabView setPostsBoundsChangedNotifications:NO];
-    [super setView:tabView];
-
-    // Add the favicon view.
-    NSRect iconViewFrame =
-        NSMakeRect(0, kTabElementYOrigin, gfx::kFaviconSize, gfx::kFaviconSize);
-    iconView_.reset([[TabFaviconView alloc] initWithFrame:iconViewFrame]);
-    [iconView_ setAutoresizingMask:isRTL ? NSViewMinXMargin | NSViewMinYMargin
-                                         : NSViewMaxXMargin | NSViewMinYMargin];
-    [self updateIconViewFrameWithAnimation:NO];
-    [tabView addSubview:iconView_];
-
-    // Set up the title.
-    const CGFloat titleXOrigin =
-        isRTL ? NSMinX([iconView_ frame]) - kTitleLeadingPadding -
-                    kInitialTitleWidth
-              : NSMaxX([iconView_ frame]) + kTitleLeadingPadding;
-    NSRect titleFrame = NSMakeRect(titleXOrigin, kTabElementYOrigin,
-                                   kInitialTitleWidth, kTitleHeight);
-    [tabView setTitleFrame:titleFrame];
-
-    NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
-    [defaultCenter addObserver:self
-                      selector:@selector(themeChangedNotification:)
-                          name:kBrowserThemeDidChangeNotification
-                        object:nil];
-
-    [self internalSetSelected:selected_];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-  [[self tabView] setController:nil];
-  [super dealloc];
-}
-
-// The internals of |-setSelected:| and |-setActive:| but doesn't set the
-// backing variables. This updates the drawing state and marks self as needing
-// a re-draw.
-- (void)internalSetSelected:(BOOL)selected {
-  TabViewCocoa* tabView = [self tabView];
-  if ([self active])
-    [tabView setState:NSOnState];
-  else
-    [tabView setState:selected ? NSMixedState : NSOffState];
-
-  // The attention indicator must always be updated, as it needs to disappear
-  // if a tab is blocked and is brought forward. It is updated at the end of
-  // -updateVisibility.
-  [self updateVisibility];
-  [self updateTitleColor];
-}
-
-// Called when Cocoa wants to display the context menu. Lazily instantiate
-// the menu based off of the cross-platform model. Re-create the menu and
-// model every time to get the correct labels and enabling.
-- (NSMenu*)menu {
-  // If the menu is currently open, then this method is being called from
-  // the nested runloop of the menu. This can happen when an accessibility
-  // message is sent to retrieve the menu options. Do not delete the objects
-  // associated with a running menu, which could lead to a use-after-free,
-  // and instead just return the existing instance. https://crbug.com/778776
-  if ([contextMenuController_ isMenuOpen]) {
-    return [contextMenuController_ menu];
-  }
-
-  contextMenuDelegate_.reset(new MenuDelegate(target_, self));
-  contextMenuModel_.reset(
-      [target_ contextMenuModelForController:self
-                                menuDelegate:contextMenuDelegate_.get()]);
-  contextMenuController_.reset([[MenuControllerCocoa alloc]
-               initWithModel:contextMenuModel_.get()
-      useWithPopUpButtonCell:NO]);
-  return [contextMenuController_ menu];
-}
-
-- (void)toggleMute:(id)sender {
-  if ([[self target] respondsToSelector:@selector(toggleMute:)]) {
-    [[self target] performSelector:@selector(toggleMute:)
-                        withObject:[self view]];
-  }
-}
-
-- (void)closeTab:(id)sender {
-  if ([[self target] respondsToSelector:@selector(closeTab:)]) {
-    [[self target] performSelector:@selector(closeTab:)
-                        withObject:[self view]];
-  }
-}
-
-- (void)selectTab:(id)sender {
-  if ([[self tabView] isClosing])
-    return;
-  if ([[self target] respondsToSelector:[self action]]) {
-    [[self target] performSelector:[self action]
-                        withObject:[self view]];
-  }
-}
-
-- (void)setTitle:(NSString*)title {
-  if ([[self title] isEqualToString:title])
-    return;
-
-  TabViewCocoa* tabView = [self tabView];
-  [tabView setTitle:title];
-
-  [super setTitle:title];
-}
-
-- (void)setActive:(BOOL)active {
-  if (active != active_) {
-    active_ = active;
-    [self internalSetSelected:[self selected]];
-  }
-}
-
-- (BOOL)active {
-  return active_;
-}
-
-- (void)setSelected:(BOOL)selected {
-  if (selected_ != selected) {
-    selected_ = selected;
-    [self internalSetSelected:[self selected]];
-  }
-}
-
-- (BOOL)selected {
-  return selected_ || active_;
-}
-
-- (void)setPinned:(BOOL)pinned {
-  if (pinned_ != pinned) {
-    pinned_ = pinned;
-    [self updateIconViewFrameWithAnimation:YES];
-  }
-}
-
-- (void)updateIconViewFrameWithAnimation:(BOOL)shouldAnimate {
-  static const CGFloat kPinnedTabLeadingPadding =
-      std::floor((kPinnedTabWidth - gfx::kFaviconSize) / 2.0);
-  BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-
-  // Determine the padding between the iconView and the tab edge.
-  CGFloat leadingPadding =
-      [self pinned] ? kPinnedTabLeadingPadding : kTabLeadingPadding;
-
-  NSRect iconViewFrame = [iconView_ frame];
-  iconViewFrame.origin.x = isRTL ? NSWidth([[self tabView] frame]) -
-                                       leadingPadding - gfx::kFaviconSize
-                                 : leadingPadding;
-
-  // The iconView animation looks funky in RTL so don't allow it.
-  if (shouldAnimate && !isRTL) {
-    // Animate at the same rate as the tab changes shape.
-    [[NSAnimationContext currentContext]
-        setDuration:[TabStripControllerCocoa tabAnimationDuration]];
-    [[iconView_ animator] setFrame:iconViewFrame];
-  } else {
-    [iconView_ setFrame:iconViewFrame];
-  }
-}
-
-- (void)setAlertState:(TabAlertState)alertState {
-}
-
-- (BOOL)blocked {
-  return self.currentAttentionTypes & AttentionType::kBlockedWebContents ? YES
-                                                                         : NO;
-}
-
-- (void)setBlocked:(BOOL)blocked {
-  if (blocked)
-    self.currentAttentionTypes |= AttentionType::kBlockedWebContents;
-  else
-    self.currentAttentionTypes &= ~AttentionType::kBlockedWebContents;
-}
-
-- (void)setNeedsAttention:(bool)attention {
-  if (attention)
-    self.currentAttentionTypes |= AttentionType::kTabWantsAttentionStatus;
-  else
-    self.currentAttentionTypes &= ~AttentionType::kTabWantsAttentionStatus;
-}
-
-- (void)setCurrentAttentionTypes:(int)attentionTypes {
-  if (currentAttentionTypes_ == attentionTypes)
-    return;
-  currentAttentionTypes_ = attentionTypes;
-  [self updateAttentionIndicator];
-}
-
-- (HoverCloseButton*)closeButton {
-  return closeButton_;
-}
-
-- (NSString*)toolTip {
-  return [[self tabView] toolTipText];
-}
-
-- (void)setToolTip:(NSString*)toolTip {
-  [[self tabView] setToolTipText:toolTip];
-}
-
-- (NSView*)iconView {
-  return iconView_;
-}
-
-// Return a rough approximation of the number of icons we could fit in the
-// tab. We never actually do this, but it's a helpful guide for determining
-// how much space we have available.
-- (int)iconCapacity {
-  const CGFloat availableWidth =
-      std::max<CGFloat>(0, NSWidth([[self tabView] frame]) -
-                               kTabLeadingPadding - kTabTrailingPadding);
-  const CGFloat widthPerIcon = gfx::kFaviconSize;
-  const int kPaddingBetweenIcons = 2;
-  if (availableWidth >= widthPerIcon &&
-      availableWidth < (widthPerIcon + kPaddingBetweenIcons)) {
-    return 1;
-  }
-  return availableWidth / (widthPerIcon + kPaddingBetweenIcons);
-}
-
-- (BOOL)shouldShowIcon {
-  return chrome::ShouldTabShowFavicon(
-      [self iconCapacity], [self pinned], [self active], [self showIcon],
-      TabAlertState::NONE);
-}
-
-- (BOOL)shouldShowCloseButton {
-  return chrome::ShouldTabShowCloseButton(
-      [self iconCapacity], [self pinned], [self active]);
-}
-
-- (void)setIconImage:(NSImage*)image
-     forLoadingState:(TabLoadingState)newLoadingState
-            showIcon:(BOOL)showIcon {
-  // Update the favicon's visbility state. Note that TabStripControllerCocoa
-  // calls -updateVisibility immediately after calling this method, so we don't
-  // need to act on a change in this state.
-  showIcon_ = showIcon;
-
-  // Always draw the favicon when the state is already kTabDone because the site
-  // may have sent an updated favicon.
-  if (newLoadingState == loadingState_ && newLoadingState != kTabDone) {
-    return;
-  }
-  loadingState_ = newLoadingState;
-
-  if (newLoadingState == kTabDone) {
-    [iconView_ setTabDoneStateWithIcon:image];
-  } else {
-    [iconView_ setTabLoadingState:newLoadingState];
-  }
-}
-
-- (void)updateAttentionIndicator {
-  // Don't show the attention indicator for blocked WebContentses if the tab is
-  // active; it's distracting.
-  int actualAttentionTypes = self.currentAttentionTypes;
-  if ([self active])
-    actualAttentionTypes &= ~AttentionType::kBlockedWebContents;
-
-  if (actualAttentionTypes != 0 && ![iconView_ isHidden]) {
-    // The attention indicator consists of two parts:
-    // . a wedge cut out of the bottom right (or left in rtl) of the favicon.
-    // . a circle in the bottom right (or left in rtl) of the favicon.
-    //
-    // The favicon lives in a view to itself, a view which is too small to
-    // contain the dot (the second part of the indicator), so the dot is added
-    // as a separate subview.
-    BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-    CGRect iconViewBounds = iconView_.get().layer.bounds;
-    CGPoint indicatorCenter = CGPointMake(
-        isRTL ? CGRectGetMinX(iconViewBounds) : CGRectGetMaxX(iconViewBounds),
-        CGRectGetMinY(iconViewBounds));
-
-    const CGFloat kIndicatorCropRadius = 4.5;
-    CGRect cropCircleBounds = CGRectZero;
-    cropCircleBounds.origin = indicatorCenter;
-    cropCircleBounds = CGRectInset(cropCircleBounds, -kIndicatorCropRadius,
-                                   -kIndicatorCropRadius);
-
-    base::ScopedCFTypeRef<CGMutablePathRef> maskPath(CGPathCreateMutable());
-    CGPathAddRect(maskPath, nil, iconViewBounds);
-    CGPathAddEllipseInRect(maskPath, nil, cropCircleBounds);
-
-    CAShapeLayer* maskLayer = [CAShapeLayer layer];
-    maskLayer.frame = iconViewBounds;
-    maskLayer.path = maskPath.get();
-    maskLayer.fillRule = kCAFillRuleEvenOdd;
-    iconView_.get().layer.mask = maskLayer;
-
-    if (!attentionDotView_) {
-      NSRect iconViewFrame = [iconView_ frame];
-      NSPoint indicatorCenter =
-          NSMakePoint(isRTL ? NSMinX(iconViewFrame) : NSMaxX(iconViewFrame),
-                      NSMinY(iconViewFrame));
-
-      const float kIndicatorRadius = 3.0f;
-      NSRect indicatorCircleFrame = NSZeroRect;
-      indicatorCircleFrame.origin = indicatorCenter;
-      indicatorCircleFrame = NSInsetRect(indicatorCircleFrame,
-                                         -kIndicatorRadius, -kIndicatorRadius);
-      attentionDotView_.reset(
-          [[NSView alloc] initWithFrame:indicatorCircleFrame]);
-      attentionDotView_.get().wantsLayer = YES;
-      SkColor indicatorColor =
-          ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
-              ui::NativeTheme::kColorId_ProminentButtonColor);
-      attentionDotView_.get().layer.backgroundColor =
-          skia::SkColorToSRGBNSColor(indicatorColor).CGColor;
-      attentionDotView_.get().layer.cornerRadius = kIndicatorRadius;
-
-      [[self view] addSubview:attentionDotView_];
-    }
-  } else {
-    iconView_.get().layer.mask = nil;
-    [attentionDotView_ removeFromSuperview];
-    attentionDotView_.reset();
-  }
-}
-
-- (void)updateVisibility {
-  BOOL newShowIcon = [self shouldShowIcon];
-
-  [iconView_ setHidden:!newShowIcon];
-
-  // If the tab is a pinned-tab, hide the title.
-  TabViewCocoa* tabView = [self tabView];
-  [tabView setTitleHidden:[self pinned]];
-
-  BOOL newShowCloseButton = [self shouldShowCloseButton];
-
-  [closeButton_ setHidden:!newShowCloseButton];
-
-  BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-
-  // Adjust the title view based on changes to the icon's and close button's
-  // visibility.
-  NSRect oldTitleFrame = [tabView titleFrame];
-  NSRect newTitleFrame;
-  newTitleFrame.size.height = oldTitleFrame.size.height;
-  newTitleFrame.origin.y = oldTitleFrame.origin.y;
-
-  CGFloat titleLeft, titleRight;
-  if (isRTL) {
-    if (newShowCloseButton) {
-      titleLeft = NSMaxX([closeButton_ frame]);
-    } else {
-      titleLeft = kTabLeadingPadding;
-    }
-    titleRight = newShowIcon
-                     ? NSMinX([iconView_ frame]) - kTitleLeadingPadding
-                     : NSWidth([[self tabView] frame]) - kTabLeadingPadding;
-  } else {
-    titleLeft = newShowIcon ? NSMaxX([iconView_ frame]) + kTitleLeadingPadding
-                            : kTabLeadingPadding;
-    if (newShowCloseButton) {
-      titleRight = NSMinX([closeButton_ frame]);
-    } else {
-      titleRight = NSWidth([[self tabView] frame]) - kTabTrailingPadding;
-    }
-  }
-
-  newTitleFrame.size.width = titleRight - titleLeft;
-  newTitleFrame.origin.x = titleLeft;
-
-  [tabView setTitleFrame:newTitleFrame];
-
-  [self updateAttentionIndicator];
-}
-
-- (void)updateTitleColor {
-  NSColor* titleColor = nil;
-  const ui::ThemeProvider* theme = [[[self view] window] themeProvider];
-  if (theme && ![self selected])
-    titleColor = theme->GetNSColor(ThemeProperties::COLOR_BACKGROUND_TAB_TEXT);
-  // Default to the selected text color unless told otherwise.
-  if (theme && !titleColor)
-    titleColor = theme->GetNSColor(ThemeProperties::COLOR_TAB_TEXT);
-  [[self tabView] setTitleColor:titleColor ? titleColor : [NSColor textColor]];
-}
-
-- (NSString*)accessibilityTitle {
-  // TODO(ellyjones): the Cocoa tab strip code doesn't keep track of network
-  // error state, so it can't get surfaced here. It should, and then this could
-  // pass in the network error state.
-  return base::SysUTF16ToNSString(chrome::AssembleTabAccessibilityLabel(
-      base::SysNSStringToUTF16([self title]),
-      [self loadingState] == kTabCrashed, false,
-      TabAlertState::NONE));
-}
-
-- (void)themeChangedNotification:(NSNotification*)notification {
-  [self updateTitleColor];
-}
-
-// Called by the tabs to determine whether we are in rapid (tab) closure mode.
-- (BOOL)inRapidClosureMode {
-  if ([[self target] respondsToSelector:@selector(inRapidClosureMode)]) {
-    return [[self target] performSelector:@selector(inRapidClosureMode)] ?
-        YES : NO;
-  }
-  return NO;
-}
-
-- (void)maybeStartDrag:(NSEvent*)event forTab:(TabControllerCocoa*)tab {
-  [[target_ dragController] maybeStartDrag:event forTab:tab];
-}
-
-- (void)performClick:(id)sender {
-  [self selectTab:self];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller_target.h b/chrome/browser/ui/cocoa/tabs/tab_controller_target.h
deleted file mode 100644
index f22e76a..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_controller_target.h
+++ /dev/null
@@ -1,37 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_TARGET_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_TARGET_H_
-
-#include "chrome/browser/ui/tabs/tab_menu_model.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-
-@class TabControllerCocoa;
-@protocol TabDraggingEventTarget;
-
-// A protocol to be implemented by a TabControllerCocoa's target.
-@protocol TabControllerTarget
-- (void)selectTab:(id)sender;
-- (void)closeTab:(id)sender;
-
-// Dispatch context menu commands for the given tab controller.
-- (void)commandDispatch:(TabStripModel::ContextMenuCommand)command
-          forController:(TabControllerCocoa*)controller;
-// Returns YES if the specificed command should be enabled for the given
-// controller.
-- (BOOL)isCommandEnabled:(TabStripModel::ContextMenuCommand)command
-           forController:(TabControllerCocoa*)controller;
-
-// Returns a context menu model for a given controller. Caller owns the result.
-- (ui::SimpleMenuModel*)
-contextMenuModelForController:(TabControllerCocoa*)controller
-                 menuDelegate:(ui::SimpleMenuModel::Delegate*)delegate;
-
-// Returns a weak reference to the controller that manages dragging of tabs.
-- (id<TabDraggingEventTarget>)dragController;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_CONTROLLER_TARGET_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_controller_unittest.mm b/chrome/browser/ui/cocoa/tabs/tab_controller_unittest.mm
deleted file mode 100644
index 215dea2..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_controller_unittest.mm
+++ /dev/null
@@ -1,580 +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.
-
-#import <Cocoa/Cocoa.h>
-#include <stddef.h>
-
-#import "base/mac/scoped_nsobject.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/strings/utf_string_conversions.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#include "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#include "chrome/browser/ui/cocoa/test/scoped_force_rtl_mac.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#import "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-#include "ui/base/resource/resource_bundle.h"
-#import "ui/base/test/menu_test_observer.h"
-#import "ui/events/test/cocoa_test_event_utils.h"
-#include "ui/resources/grit/ui_resources.h"
-
-// Implements the target interface for the tab, which gets sent messages when
-// the tab is clicked on by the user and when its close box is clicked.
-@interface TabControllerTestTarget : NSObject<TabControllerTarget> {
- @private
-  bool selected_;
-  bool closed_;
-  base::scoped_nsobject<TabStripDragController> dragController_;
-}
-- (bool)selected;
-- (bool)closed;
-@end
-
-@implementation TabControllerTestTarget
-- (id)init {
-  if ((self = [super init])) {
-    dragController_.reset(
-        [[TabStripDragController alloc] initWithTabStripController:nil]);
-  }
-  return self;
-}
-- (bool)selected {
-  return selected_;
-}
-- (bool)closed {
-  return closed_;
-}
-- (void)selectTab:(id)sender {
-  selected_ = true;
-}
-- (void)closeTab:(id)sender {
-  closed_ = true;
-}
-- (void)mouseTimer:(NSTimer*)timer {
-  // Fire the mouseUp to break the TabViewCocoa drag loop.
-  NSEvent* current = [NSApp currentEvent];
-  NSWindow* window = [timer userInfo];
-  NSEvent* up = [NSEvent mouseEventWithType:NSLeftMouseUp
-                                   location:[current locationInWindow]
-                              modifierFlags:0
-                                  timestamp:[current timestamp]
-                               windowNumber:[window windowNumber]
-                                    context:nil
-                                eventNumber:0
-                                 clickCount:1
-                                   pressure:1.0];
-  [window postEvent:up atStart:YES];
-}
-- (void)commandDispatch:(TabStripModel::ContextMenuCommand)command
-          forController:(TabControllerCocoa*)controller {
-}
-- (BOOL)isCommandEnabled:(TabStripModel::ContextMenuCommand)command
-           forController:(TabControllerCocoa*)controller {
-  return NO;
-}
-- (ui::SimpleMenuModel*)
-contextMenuModelForController:(TabControllerCocoa*)controller
-                 menuDelegate:(ui::SimpleMenuModel::Delegate*)delegate {
-  ui::SimpleMenuModel* model = new ui::SimpleMenuModel(delegate);
-  model->AddItem(1, base::ASCIIToUTF16("Hello World"));
-  model->AddItem(2, base::ASCIIToUTF16("Allays"));
-  model->AddItem(3, base::ASCIIToUTF16("Chromium"));
-  return model;
-}
-- (id<TabDraggingEventTarget>)dragController {
-  return dragController_.get();
-}
-@end
-
-namespace {
-
-CGFloat LeftMargin(NSRect superFrame, NSRect subFrame) {
-  return NSMinX(subFrame) - NSMinX(superFrame);
-}
-
-CGFloat RightMargin(NSRect superFrame, NSRect subFrame) {
-  return NSMaxX(superFrame) - NSMaxX(subFrame);
-}
-
-// The dragging code in TabViewCocoa makes heavy use of autorelease pools so
-// inherit from CocoaTest to have one created for us.
-class TabControllerTest : public CocoaTest {
- public:
-  TabControllerTest() { }
-
- protected:
-  void CheckLayoutAndVisibilityOfSubviewsForAllStates(bool is_rtl) {
-    NSWindow* const window = test_window();
-
-    // Create TabControllerCocoa instance and place its view into the test
-    // window.
-    base::scoped_nsobject<TabControllerCocoa> controller(
-        [[TabControllerCocoa alloc] init]);
-    [[window contentView] addSubview:[controller view]];
-
-    // Create favicon.
-    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-    base::scoped_nsobject<NSImage> favicon(
-        rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
-
-    // Perform layout over all possible combinations, checking for correct
-    // results.
-    for (int isPinnedTab = 0; isPinnedTab < 2; ++isPinnedTab) {
-      for (int isActiveTab = 0; isActiveTab < 2; ++isActiveTab) {
-        SCOPED_TRACE(::testing::Message()
-                     << (isActiveTab ? "Active" : "Inactive") << ' '
-                     << (isPinnedTab ? "Pinned " : ""));
-
-        // Simulate what tab_strip_controller would do to set up the
-        // TabControllerCocoa state.
-        [controller setPinned:(isPinnedTab ? YES : NO)];
-        [controller setActive:(isActiveTab ? YES : NO)];
-        [controller setIconImage:favicon
-                 forLoadingState:kTabDone
-                        showIcon:YES];
-        [controller updateVisibility];
-
-        // Test layout for every width from maximum to minimum.
-        NSRect tabFrame = [[controller view] frame];
-        int minWidth;
-        if (isPinnedTab) {
-          tabFrame.size.width = minWidth =
-              [TabControllerCocoa pinnedTabWidth];
-        } else {
-          tabFrame.size.width = [TabControllerCocoa maxTabWidth];
-          minWidth = isActiveTab ? [TabControllerCocoa minActiveTabWidth]
-                                 : [TabControllerCocoa minTabWidth];
-        }
-        while (NSWidth(tabFrame) >= minWidth) {
-          SCOPED_TRACE(::testing::Message() << "width="
-                                            << tabFrame.size.width);
-          [[controller view] setFrame:tabFrame];
-          if (is_rtl)
-            CheckForExpectedLayoutAndVisibilityOfSubviewsRTL(controller);
-          else
-            CheckForExpectedLayoutAndVisibilityOfSubviews(controller);
-          --tabFrame.size.width;
-        }
-      }
-    }
-  }
-
- private:
-  static void CheckForExpectedLayoutAndVisibilityOfSubviews(
-      const TabControllerCocoa* controller) {
-    CheckVisibilityOfSubviews(controller);
-
-    // Check positioning of elements with respect to each other, and that they
-    // are fully within the tab frame.
-    const NSRect tabFrame = [[controller view] frame];
-    const NSRect titleFrame = [[controller tabView] titleFrame];
-    if ([controller shouldShowIcon]) {
-      const NSRect iconFrame = [[controller iconView] frame];
-      EXPECT_LE(NSMinX(tabFrame), NSMinX(iconFrame));
-      if (NSWidth(titleFrame) > 0)
-        EXPECT_LE(NSMaxX(iconFrame), NSMinX(titleFrame));
-      EXPECT_LE(NSMinY(tabFrame), NSMinY(iconFrame));
-      EXPECT_LE(NSMaxY(iconFrame), NSMaxY(tabFrame));
-    }
-    if ([controller shouldShowCloseButton]) {
-      const NSRect closeButtonFrame = [[controller closeButton] frame];
-      if (NSWidth(titleFrame) > 0)
-        EXPECT_LE(NSMaxX(titleFrame), NSMinX(closeButtonFrame));
-      EXPECT_LE(NSMaxX(closeButtonFrame), NSMaxX(tabFrame));
-      EXPECT_LE(NSMinY(tabFrame), NSMinY(closeButtonFrame));
-      EXPECT_LE(NSMaxY(closeButtonFrame), NSMaxY(tabFrame));
-    }
-  }
-  static void CheckForExpectedLayoutAndVisibilityOfSubviewsRTL(
-      const TabControllerCocoa* controller) {
-    CheckVisibilityOfSubviews(controller);
-    // Check positioning of elements with respect to each other, and that they
-    // are fully within the tab frame.
-    const NSRect tabFrame = [[controller view] frame];
-    const NSRect titleFrame = [[controller tabView] titleFrame];
-    if ([controller shouldShowCloseButton]) {
-      const NSRect closeButtonFrame = [[controller closeButton] frame];
-      EXPECT_TRUE(NSContainsRect(tabFrame, closeButtonFrame));
-      if (NSWidth(titleFrame) > 0)
-        EXPECT_LE(NSMaxX(closeButtonFrame), NSMinX(titleFrame));
-    }
-    if ([controller shouldShowIcon]) {
-      const NSRect iconFrame = [[controller iconView] frame];
-      EXPECT_TRUE(NSContainsRect(tabFrame, iconFrame));
-      if (NSWidth(titleFrame) > 0)
-        EXPECT_LE(NSMaxX(titleFrame), NSMinX(iconFrame));
-    }
-  }
-  // Common for RTL and LTR
-  static void CheckVisibilityOfSubviews(const TabControllerCocoa* controller) {
-    // Check whether subviews should be visible when they are supposed to be,
-    // given Tab size and TabRendererData state.
-    if ([controller pinned]) {
-      EXPECT_EQ(1, [controller iconCapacity]);
-      EXPECT_TRUE([controller shouldShowIcon]);
-      EXPECT_FALSE([controller shouldShowCloseButton]);
-    } else if ([controller selected]) {
-      EXPECT_TRUE([controller shouldShowCloseButton]);
-      switch ([controller iconCapacity]) {
-        case 0:
-        case 1:
-          EXPECT_FALSE([controller shouldShowIcon]);
-          break;
-        case 2:
-          EXPECT_TRUE([controller shouldShowIcon]);
-          break;
-        default:
-          EXPECT_LE(3, [controller iconCapacity]);
-          EXPECT_TRUE([controller shouldShowIcon]);
-          break;
-      }
-    } else {  // Tab not selected/active and not pinned tab.
-      switch ([controller iconCapacity]) {
-        case 0:
-          EXPECT_FALSE([controller shouldShowCloseButton]);
-          EXPECT_FALSE([controller shouldShowIcon]);
-          break;
-        case 1:
-          EXPECT_FALSE([controller shouldShowCloseButton]);
-          EXPECT_TRUE([controller shouldShowIcon]);
-          break;
-        default:
-          EXPECT_LE(2, [controller iconCapacity]);
-          EXPECT_TRUE([controller shouldShowIcon]);
-          break;
-      }
-    }
-  }
-
-  base::MessageLoop message_loop_;
-};
-
-// Tests creating the controller, sticking it in a window, and removing it.
-TEST_F(TabControllerTest, Creation) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-  EXPECT_TRUE([controller tabView]);
-  EXPECT_EQ([[controller view] window], window);
-  [[controller view] display];  // Test drawing to ensure nothing leaks/crashes.
-  [[controller view] removeFromSuperview];
-}
-
-// Tests sending it a close message and ensuring that the target/action get
-// called. Mimics the user clicking on the close button in the tab.
-TEST_F(TabControllerTest, Close) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-
-  base::scoped_nsobject<TabControllerTestTarget> target(
-      [[TabControllerTestTarget alloc] init]);
-  EXPECT_FALSE([target closed]);
-  [controller setTarget:target];
-  EXPECT_EQ(target.get(), [controller target]);
-
-  [controller closeTab:nil];
-  EXPECT_TRUE([target closed]);
-
-  [[controller view] removeFromSuperview];
-}
-
-// Tests setting the |selected| property via code.
-TEST_F(TabControllerTest, APISelection) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-
-  EXPECT_FALSE([controller selected]);
-  [controller setSelected:YES];
-  EXPECT_TRUE([controller selected]);
-
-  [[controller view] removeFromSuperview];
-}
-
-// Tests setting the |loading| property via code.
-TEST_F(TabControllerTest, Loading) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-
-  EXPECT_EQ(kTabDone, [controller loadingState]);
-  [controller setIconImage:nil forLoadingState:kTabWaiting showIcon:YES];
-  EXPECT_EQ(kTabWaiting, [controller loadingState]);
-  [controller setIconImage:nil forLoadingState:kTabLoading showIcon:YES];
-  EXPECT_EQ(kTabLoading, [controller loadingState]);
-  // Create favicon.
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  base::scoped_nsobject<NSImage> favicon(
-      rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
-  [controller setIconImage:favicon forLoadingState:kTabDone showIcon:YES];
-  EXPECT_EQ(kTabDone, [controller loadingState]);
-
-  [[controller view] removeFromSuperview];
-}
-
-// Tests selecting the tab with the mouse click and ensuring the target/action
-// get called.
-TEST_F(TabControllerTest, UserSelection) {
-  NSWindow* window = test_window();
-
-  // Create a tab at a known location in the window that we can click on
-  // to activate selection.
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-  NSRect frame = [[controller view] frame];
-  frame.size.width = [TabControllerCocoa minTabWidth];
-  frame.origin = NSZeroPoint;
-  [[controller view] setFrame:frame];
-
-  // Set the target and action.
-  base::scoped_nsobject<TabControllerTestTarget> target(
-      [[TabControllerTestTarget alloc] init]);
-  EXPECT_FALSE([target selected]);
-  [controller setTarget:target];
-  [controller setAction:@selector(selectTab:)];
-  EXPECT_EQ(target.get(), [controller target]);
-  EXPECT_EQ(@selector(selectTab:), [controller action]);
-
-  // In order to track a click, we have to fake a mouse down and a mouse
-  // up, but the down goes into a tight drag loop. To break the loop, we have
-  // to fire a timer that sends a mouse up event while the "drag" is ongoing.
-  [NSTimer scheduledTimerWithTimeInterval:0.1
-                                   target:target.get()
-                                 selector:@selector(mouseTimer:)
-                                 userInfo:window
-                                  repeats:NO];
-  NSEvent* current = [NSApp currentEvent];
-  NSPoint click_point = NSMakePoint(frame.size.width / 2,
-                                    frame.size.height / 2);
-  NSEvent* down = [NSEvent mouseEventWithType:NSLeftMouseDown
-                                     location:click_point
-                                modifierFlags:0
-                                    timestamp:[current timestamp]
-                                 windowNumber:[window windowNumber]
-                                      context:nil
-                                  eventNumber:0
-                                   clickCount:1
-                                     pressure:1.0];
-  [[controller view] mouseDown:down];
-
-  // Check our target was told the tab got selected.
-  EXPECT_TRUE([target selected]);
-
-  [[controller view] removeFromSuperview];
-}
-
-TEST_F(TabControllerTest, IconCapacity) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-  int cap = [controller iconCapacity];
-  EXPECT_GE(cap, 1);
-
-  NSRect frame = [[controller view] frame];
-  frame.size.width += 500;
-  [[controller view] setFrame:frame];
-  int newcap = [controller iconCapacity];
-  EXPECT_GT(newcap, cap);
-}
-
-TEST_F(TabControllerTest, ShouldShowIcon) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-  int cap = [controller iconCapacity];
-  EXPECT_GT(cap, 0);
-
-  // Tab is minimum width, both icon and close box should be hidden.
-  NSRect frame = [[controller view] frame];
-  frame.size.width = [TabControllerCocoa minTabWidth];
-  [[controller view] setFrame:frame];
-  EXPECT_FALSE([controller shouldShowIcon]);
-  EXPECT_FALSE([controller shouldShowCloseButton]);
-
-  // Setting the icon when tab is at min width should not show icon (bug 18359).
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  base::scoped_nsobject<NSImage> favicon(
-      rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
-  [controller setIconImage:favicon forLoadingState:kTabDone showIcon:YES];
-  [controller updateVisibility];
-  NSView* newIcon = [controller iconView];
-  EXPECT_TRUE([newIcon isHidden]);
-
-  // Tab is at active minimum width. Since it's active, the close box
-  // should be visible.
-  [controller setActive:YES];
-  frame = [[controller view] frame];
-  frame.size.width = [TabControllerCocoa minActiveTabWidth];
-  [[controller view] setFrame:frame];
-  EXPECT_FALSE([controller shouldShowIcon]);
-  EXPECT_TRUE([newIcon isHidden]);
-  EXPECT_TRUE([controller shouldShowCloseButton]);
-
-  // Test expanding the tab to max width and ensure the icon and close box
-  // get put back, even when de-activated.
-  frame.size.width = [TabControllerCocoa maxTabWidth];
-  [[controller view] setFrame:frame];
-  EXPECT_TRUE([controller shouldShowIcon]);
-  EXPECT_FALSE([newIcon isHidden]);
-  EXPECT_TRUE([controller shouldShowCloseButton]);
-  [controller setActive:NO];
-  EXPECT_TRUE([controller shouldShowIcon]);
-  EXPECT_TRUE([controller shouldShowCloseButton]);
-
-  cap = [controller iconCapacity];
-  EXPECT_GT(cap, 0);
-}
-
-TEST_F(TabControllerTest, Menu) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  base::scoped_nsobject<TabControllerTestTarget> target(
-      [[TabControllerTestTarget alloc] init]);
-  [controller setTarget:target];
-
-  [[window contentView] addSubview:[controller view]];
-  int cap = [controller iconCapacity];
-  EXPECT_GT(cap, 0);
-
-  // Asking the view for its menu should yield a valid menu.
-  NSMenu* menu = [[controller view] menu];
-  EXPECT_TRUE(menu);
-  EXPECT_EQ(3, [menu numberOfItems]);
-}
-
-// Regression test for https://crbug.com/778776. An accessibility message can
-// cause -[TabControllerCocoa menu] to be called while the existing menu is
-// open. Test that this does not cause the running menu to be deleted.
-TEST_F(TabControllerTest, RecursiveMenu) {
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  base::scoped_nsobject<TabControllerTestTarget> target(
-      [[TabControllerTestTarget alloc] init]);
-  [controller setTarget:target];
-
-  NSMenu* menu = [controller menu];
-
-  base::scoped_nsobject<MenuTestObserver> menu_observer(
-      [[MenuTestObserver alloc] initWithMenu:menu]);
-  [menu_observer setCloseAfterOpening:YES];
-  [menu_observer setOpenCallback:^(MenuTestObserver*) {
-    NSMenu* open_menu = [controller menu];
-    EXPECT_TRUE(open_menu);
-    EXPECT_EQ(menu, open_menu);
-  }];
-
-  [NSMenu
-      popUpContextMenu:menu
-             withEvent:cocoa_test_event_utils::LeftMouseDownAtPoint(NSZeroPoint)
-               forView:[controller view]];
-
-  EXPECT_NE(menu, [controller menu]);
-}
-
-// Tests that the title field is correctly positioned and sized when the
-// view is resized.
-TEST_F(TabControllerTest, TitleViewLayout) {
-  NSWindow* window = test_window();
-
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-  NSRect tabFrame = [[controller view] frame];
-  tabFrame.size.width = [TabControllerCocoa maxTabWidth];
-  [[controller view] setFrame:tabFrame];
-
-  // Set up the favicon in the tabview.
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  base::scoped_nsobject<NSImage> favicon(
-      rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
-  [controller setIconImage:favicon forLoadingState:kTabDone showIcon:YES];
-  [controller updateVisibility];
-
-  const NSRect originalTabFrame = [[controller view] frame];
-  const NSRect originalIconFrame = [[controller iconView] frame];
-  const NSRect originalCloseFrame = [[controller closeButton] frame];
-  const NSRect originalTitleFrame = [[controller tabView] titleFrame];
-
-  // Sanity check the start state.
-  EXPECT_FALSE([[controller iconView] isHidden]);
-  EXPECT_FALSE([[controller closeButton] isHidden]);
-  EXPECT_GT(NSWidth([[controller view] frame]),
-            NSWidth([[controller tabView] titleFrame]));
-
-  // Resize the tab so that that the it shrinks.
-  tabFrame.size.width = [TabControllerCocoa minTabWidth];
-  [[controller view] setFrame:tabFrame];
-
-  // The icon view and close button should be hidden and the title view should
-  // resize to take up their space.
-  EXPECT_TRUE([[controller iconView] isHidden]);
-  EXPECT_TRUE([[controller closeButton] isHidden]);
-  EXPECT_GT(NSWidth([[controller view] frame]),
-            NSWidth([[controller tabView] titleFrame]));
-  EXPECT_EQ(LeftMargin(originalTabFrame, originalIconFrame),
-            LeftMargin([[controller view] frame],
-                       [[controller tabView] titleFrame]));
-  EXPECT_EQ(RightMargin(originalTabFrame, originalCloseFrame),
-            RightMargin([[controller view] frame],
-                        [[controller tabView] titleFrame]));
-
-  // Resize the tab so that that the it grows.
-  tabFrame.size.width =
-      static_cast<int>([TabControllerCocoa maxTabWidth] * 0.75);
-  [[controller view] setFrame:tabFrame];
-
-  // The icon view and close button should be visible again and the title view
-  // should be resized to make room for them.
-  EXPECT_FALSE([[controller iconView] isHidden]);
-  EXPECT_FALSE([[controller closeButton] isHidden]);
-  EXPECT_GT(NSWidth([[controller view] frame]),
-            NSWidth([[controller tabView] titleFrame]));
-  EXPECT_EQ(LeftMargin(originalTabFrame, originalTitleFrame),
-            LeftMargin([[controller view] frame],
-                       [[controller tabView] titleFrame]));
-  EXPECT_EQ(RightMargin(originalTabFrame, originalTitleFrame),
-            RightMargin([[controller view] frame],
-                        [[controller tabView] titleFrame]));
-}
-
-TEST_F(TabControllerTest, LayoutAndVisibilityOfSubviews) {
-  CheckLayoutAndVisibilityOfSubviewsForAllStates(false);
-}
-
-TEST_F(TabControllerTest, LayoutAndVisibilityOfSubviewsRTL) {
-  cocoa_l10n_util::ScopedForceRTLMac scoped_rtl;
-
-  CheckLayoutAndVisibilityOfSubviewsForAllStates(true);
-}
-
-TEST_F(TabControllerTest, TabSelection) {
-  NSWindow* window = test_window();
-  base::scoped_nsobject<TabControllerCocoa> controller(
-      [[TabControllerCocoa alloc] init]);
-  [[window contentView] addSubview:[controller view]];
-
-  base::scoped_nsobject<TabControllerTestTarget> target(
-      [[TabControllerTestTarget alloc] init]);
-  [controller setTarget:target];
-  [controller setAction:@selector(selectTab:)];
-
-  EXPECT_FALSE([target selected]);
-  [controller performClick:controller];
-  EXPECT_TRUE([target selected]);
-}
-
-}  // namespace
diff --git a/chrome/browser/ui/cocoa/tabs/tab_favicon_view.h b/chrome/browser/ui/cocoa/tabs/tab_favicon_view.h
deleted file mode 100644
index 48be53d..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_favicon_view.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_COCOA_TABS_TAB_FAVICON_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_FAVICON_VIEW_H_
-
-#import "chrome/browser/ui/cocoa/tabs/tab_spinner_view.h"
-
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-
-@interface TabFaviconView : NSView<ThemedWindowDrawing>
-
-// Accessor for the tab's loading state. Use setTabDoneIcon: to set the
-// icon and loading state to kTabDone.
-@property(assign, nonatomic) TabLoadingState tabLoadingState;
-
-// Sets the tab's icon and loading state to kTabDone.
-- (void)setTabDoneStateWithIcon:(NSImage*)anImage;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_FAVICON_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_favicon_view.mm b/chrome/browser/ui/cocoa/tabs/tab_favicon_view.mm
deleted file mode 100644
index 01781442..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_favicon_view.mm
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_favicon_view.h"
-
-#include "base/mac/scoped_cftyperef.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/grit/theme_resources.h"
-#include "components/grit/components_scaled_resources.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/theme_provider.h"
-#include "ui/gfx/geometry/angle_conversions.h"
-#include "ui/native_theme/native_theme.h"
-
-namespace {
-constexpr CGFloat kSadTabAnimationTime = 0.5;
-}  // namespace
-
-@implementation TabFaviconView {
-  TabSpinnerView* spinnerView_;  // Weak.
-  NSImageView* iconView_;        // Weak.
-}
-
-@synthesize tabLoadingState = tabLoadingState_;
-
-- (instancetype)initWithFrame:(NSRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    NSRect subviewFrame = NSMakeRect(0, 0, frame.size.width, frame.size.height);
-    spinnerView_ =
-        [[[TabSpinnerView alloc] initWithFrame:subviewFrame] autorelease];
-    [self addSubview:spinnerView_];
-    iconView_ = [[[NSImageView alloc] initWithFrame:subviewFrame] autorelease];
-    [self addSubview:iconView_];
-  }
-
-  return self;
-}
-
-- (NSImage*)sadTabIcon {
-  NSImage* sadTabIcon = ui::ResourceBundle::GetSharedInstance()
-                            .GetNativeImageNamed(IDR_CRASH_SAD_FAVICON)
-                            .AsNSImage();
-  BOOL hasDarkTheme =
-      [[self window] respondsToSelector:@selector(hasDarkTheme)] &&
-      [[self window] hasDarkTheme];
-
-  if (hasDarkTheme) {
-    NSRect bounds = NSZeroRect;
-    bounds.size = [sadTabIcon size];
-
-    return [NSImage imageWithSize:bounds.size
-                          flipped:NO
-                   drawingHandler:^BOOL(NSRect destRect) {
-                     [[NSColor whiteColor] set];
-                     NSRectFill(destRect);
-                     [sadTabIcon drawInRect:destRect
-                                   fromRect:NSZeroRect
-                                  operation:NSCompositeDestinationIn
-                                   fraction:1.0];
-                     return YES;
-                   }];
-  }
-
-  return sadTabIcon;
-}
-
-- (void)setTabLoadingState:(TabLoadingState)newLoadingState
-                   forIcon:(NSImage*)anImage {
-  // Always update the tab done icon, otherwise exit if the state has not
-  // changed.
-  if (newLoadingState != kTabDone && tabLoadingState_ == newLoadingState) {
-    return;
-  }
-
-  tabLoadingState_ = newLoadingState;
-
-  BOOL showingAnIcon =
-      (tabLoadingState_ == kTabCrashed || tabLoadingState_ == kTabDone);
-
-  [spinnerView_ setHidden:showingAnIcon];
-  [iconView_ setHidden:!showingAnIcon];
-
-  if (tabLoadingState_ == kTabCrashed) {
-    CAMediaTimingFunction* linearTimingFunction =
-        [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
-    NSImage* sadTabIcon = [self sadTabIcon];
-
-    [NSAnimationContext beginGrouping];
-
-    [[NSAnimationContext currentContext] setDuration:kSadTabAnimationTime];
-    [[NSAnimationContext currentContext]
-        setTimingFunction:linearTimingFunction];
-    [[NSAnimationContext currentContext] setCompletionHandler:^{
-      [NSAnimationContext beginGrouping];
-
-      [iconView_ setImage:sadTabIcon];
-      [[NSAnimationContext currentContext] setDuration:kSadTabAnimationTime];
-      [[NSAnimationContext currentContext]
-          setTimingFunction:linearTimingFunction];
-      [[iconView_ animator] setFrameOrigin:NSZeroPoint];
-
-      [NSAnimationContext endGrouping];
-    }];
-
-    [[iconView_ animator]
-        setFrameOrigin:NSMakePoint(0, -NSHeight([self bounds]))];
-
-    [NSAnimationContext endGrouping];
-  } else if (tabLoadingState_ == kTabDone) {
-    [iconView_ setImage:anImage];
-  } else if (tabLoadingState_ == kTabWaiting) {
-    [spinnerView_ setSpinDirection:SpinDirection::REVERSE];
-  } else {
-    [spinnerView_ setSpinDirection:SpinDirection::FORWARD];
-  }
-}
-
-- (void)setTabLoadingState:(TabLoadingState)newLoadingState {
-  [self setTabLoadingState:newLoadingState forIcon:nil];
-}
-
-- (void)setTabDoneStateWithIcon:(NSImage*)anImage {
-  [self setTabLoadingState:kTabDone forIcon:anImage];
-}
-
-// ThemedWindowDrawing implementation.
-
-- (void)windowDidChangeTheme {
-  // If showing the sad tab icon, make sure that icon matches the current theme.
-  if (tabLoadingState_ == kTabCrashed) {
-    [iconView_ setImage:[self sadTabIcon]];
-  }
-}
-
-- (void)windowDidChangeActive {
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_spinner_view.h b/chrome/browser/ui/cocoa/tabs/tab_spinner_view.h
deleted file mode 100644
index 4c01b1b..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_spinner_view.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_COCOA_TABS_TAB_SPINNER_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_SPINNER_VIEW_H_
-
-#import "chrome/browser/ui/cocoa/spinner_view.h"
-
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-
-enum class SpinDirection { FORWARD, REVERSE };
-
-@interface TabSpinnerView : SpinnerView<ThemedWindowDrawing>
-
-- (void)setSpinDirection:(SpinDirection)newSpinDirection;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_SPINNER_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_spinner_view.mm b/chrome/browser/ui/cocoa/tabs/tab_spinner_view.mm
deleted file mode 100644
index a71c07dd..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_spinner_view.mm
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_spinner_view.h"
-
-#include "base/mac/scoped_cftyperef.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/ui/cocoa/spinner_util.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "ui/base/theme_provider.h"
-#include "ui/gfx/geometry/angle_conversions.h"
-#include "ui/native_theme/native_theme.h"
-
-using cocoa_spinner_util::kDegrees90;
-using cocoa_spinner_util::kDegrees180;
-using cocoa_spinner_util::kDegrees270;
-using cocoa_spinner_util::kDegrees360;
-using cocoa_spinner_util::kWaitingStrokeAlpha;
-
-@implementation TabSpinnerView {
-  BOOL spinReverse_;
-}
-
-- (NSColor*)spinnerColor {
-  BOOL hasDarkTheme =
-      [[self window] respondsToSelector:@selector(hasDarkTheme)] &&
-      [[self window] hasDarkTheme];
-
-  if (hasDarkTheme) {
-    return spinReverse_ ? [[NSColor whiteColor]
-                              colorWithAlphaComponent:kWaitingStrokeAlpha]
-                        : [NSColor whiteColor];
-  }
-
-  const ui::ThemeProvider* theme = nullptr;
-  if ([[self window] respondsToSelector:@selector(themeProvider)]) {
-    theme = [[self window] themeProvider];
-  }
-
-  if (spinReverse_) {
-    if (theme) {
-      return theme->GetNSColor(ThemeProperties::COLOR_TAB_THROBBER_WAITING);
-    }
-
-    SkColor skWaitingColor =
-        ui::NativeTheme::GetInstanceForNativeUi()->GetSystemColor(
-            ui::NativeTheme::kColorId_ThrobberWaitingColor);
-    return skia::SkColorToSRGBNSColor(skWaitingColor);
-  }
-
-  return theme ? theme->GetNSColor(ThemeProperties::COLOR_TAB_THROBBER_SPINNING)
-               : [super spinnerColor];
-}
-
-- (CGFloat)arcStartAngle {
-  return spinReverse_ ? kDegrees270 : [super arcStartAngle];
-}
-
-- (CGFloat)arcEndAngleDelta {
-  return spinReverse_ ? kDegrees180 : [super arcEndAngleDelta];
-}
-
-- (CGFloat)arcLength {
-  // The reverse arc spans 90 degrees of circumference.
-  static CGFloat reverseArcLength =
-      kDegrees90 * ([SpinnerView arcUnitRadius] * 2);
-
-  return spinReverse_ ? reverseArcLength : [super arcLength];
-}
-
-- (void)initializeAnimation {
-  if (!spinReverse_) {
-    return [super initializeAnimation];
-  }
-
-  const CGFloat forwardArcRotationTime = [SpinnerView arcRotationTime];
-  const CGFloat reverseArcAnimationTime = forwardArcRotationTime / 2.0;
-
-  // Create the arc animation.
-  base::scoped_nsobject<CAKeyframeAnimation> arcAnimation(
-      [[CAKeyframeAnimation animationWithKeyPath:@"lineDashPhase"] retain]);
-  [arcAnimation
-      setTimingFunction:[CAMediaTimingFunction
-                            functionWithName:kCAMediaTimingFunctionLinear]];
-  CGFloat scaleFactor = [self scaleFactor];
-  NSArray* animationValues = @[ @(-[self arcLength] * scaleFactor), @(0.0) ];
-  [arcAnimation setValues:animationValues];
-  NSArray* keyTimes = @[ @(0.0), @(1.0) ];
-  [arcAnimation setKeyTimes:keyTimes];
-  [arcAnimation setDuration:reverseArcAnimationTime];
-  [arcAnimation setFillMode:kCAFillModeForwards];
-
-  CAAnimationGroup* group = [CAAnimationGroup animation];
-  [group setDuration:reverseArcAnimationTime];
-  [group setFillMode:kCAFillModeForwards];
-  [group setAnimations:@[ arcAnimation ]];
-  [self setSpinnerAnimation:group];
-
-  // Finally, create an animation that rotates the entire spinner layer.
-  CABasicAnimation* rotationAnimation =
-      [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
-  [rotationAnimation setFromValue:@0];
-  [rotationAnimation setToValue:@(kDegrees360)];
-
-  // Start the rotation once the stroke animation has completed.
-  [rotationAnimation
-      setBeginTime:CACurrentMediaTime() + reverseArcAnimationTime];
-  [rotationAnimation setDuration:forwardArcRotationTime];
-  [rotationAnimation setFillMode:kCAFillModeForwards];
-  [rotationAnimation setRepeatCount:HUGE_VALF];
-
-  [self setRotationAnimation:rotationAnimation];
-}
-
-- (void)setSpinDirection:(SpinDirection)newSpinDirection {
-  BOOL spinReverse = (newSpinDirection == SpinDirection::REVERSE);
-
-  if (spinReverse == spinReverse_) {
-    return;
-  }
-  spinReverse_ = spinReverse;
-
-  [self restartAnimation];
-}
-
-// ThemedWindowDrawing implementation.
-
-- (void)windowDidChangeTheme {
-  // Make sure the spinner colors matches the current theme.
-  [self updateSpinnerColor];
-}
-
-- (void)windowDidChangeActive {
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h b/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h
deleted file mode 100644
index 5639540..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h
+++ /dev/null
@@ -1,19 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_BACKGROUND_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_BACKGROUND_VIEW_H_
-
-#import <Cocoa/Cocoa.h>
-
-#import "chrome/browser/ui/cocoa/themed_window.h"
-
-// A view that draws the theme image in the top area of the window (behind the
-// tab strip area). It should be arranged so that its z-order is below its
-// overlapping sibling views (window controls, tab strip view, profile button
-// and fullscreen button).
-@interface TabStripBackgroundView : NSView<ThemedWindowDrawing>
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_BACKGROUND_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.mm
deleted file mode 100644
index 4b32010..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_background_view.mm
+++ /dev/null
@@ -1,53 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h"
-
-#import "chrome/browser/ui/cocoa/framed_browser_window.h"
-#import "ui/base/cocoa/nsview_additions.h"
-
-@implementation TabStripBackgroundView
-
-- (void)drawRect:(NSRect)dirtyRect {
-  // Only the top corners are rounded. For simplicity, round all 4 corners but
-  // draw the bottom corners outside of the visible bounds.
-  float cornerRadius = 4.0;
-  NSRect roundedRect = [self bounds];
-  roundedRect.origin.y -= cornerRadius;
-  roundedRect.size.height += cornerRadius;
-  [[NSBezierPath bezierPathWithRoundedRect:roundedRect
-                                   xRadius:cornerRadius
-                                   yRadius:cornerRadius] addClip];
-  BOOL themed = [FramedBrowserWindow drawWindowThemeInDirtyRect:dirtyRect
-                                                        forView:self
-                                                         bounds:roundedRect
-                                           forceBlackBackground:NO];
-
-  // Draw a 1px border on the top edge and top corners.
-  if (themed) {
-    CGFloat lineWidth = [self cr_lineWidth];
-    // Inset the vertical lines by 0.5px so that the top line gets a full pixel.
-    // Outset the horizontal lines by 0.5px so that they are not visible, but
-    // still get the rounded corners to get a border.
-    NSRect strokeRect = NSInsetRect(roundedRect, -lineWidth/2, lineWidth/2);
-    NSBezierPath* path = [NSBezierPath bezierPathWithRoundedRect:strokeRect
-                                                         xRadius:cornerRadius
-                                                         yRadius:cornerRadius];
-    [path setLineWidth:lineWidth];
-    [[NSColor colorWithCalibratedWhite:1.0 alpha:0.5] set];
-    [path stroke];
-  }
-}
-
-// ThemedWindowDrawing implementation.
-
-- (void)windowDidChangeTheme {
-  [self setNeedsDisplay:YES];
-}
-
-- (void)windowDidChangeActive {
-  [self setNeedsDisplay:YES];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h
deleted file mode 100644
index 355b3b3..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.h
+++ /dev/null
@@ -1,301 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_CONTROLLER_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_CONTROLLER_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include <memory>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/has_weak_browser_pointer.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h"
-#import "chrome/browser/ui/cocoa/url_drop_target.h"
-#include "chrome/browser/ui/tabs/hover_tab_selector.h"
-#include "chrome/browser/ui/tabs/tab_utils.h"
-
-@class CrTrackingArea;
-@class CustomWindowControlsView;
-@class TabContentsController;
-@class TabControllerCocoa;
-@class TabViewCocoa;
-@class TabStripDragController;
-@class TabStripView;
-
-class Browser;
-class TabStripModel;
-
-namespace content {
-class WebContents;
-}
-
-// The interface for the tab strip controller's delegate.
-// Delegating TabStripModelObserverBridge's events (in lieu of directly
-// subscribing to TabStripModelObserverBridge events, as TabStripControllerCocoa
-// does) is necessary to guarantee a proper order of subviews layout updates,
-// otherwise it might trigger unnecessary content relayout, UI flickering etc.
-@protocol TabStripControllerDelegate
-
-// Stripped down version of TabStripModelObserverBridge:selectTabWithContents.
-- (void)onActivateTabWithContents:(content::WebContents*)contents;
-
-// Stripped down version of TabStripModelObserverBridge:tabChangedWithContents.
-- (void)onTabChanged:(TabChangeType)change
-        withContents:(content::WebContents*)contents;
-
-// Stripped down version of TabStripModelObserverBridge:tabDetachedWithContents.
-- (void)onTabDetachedWithContents:(content::WebContents*)contents;
-
-// Stripped down version of
-// TabStripModelObserverBridge:onTabInsertedInForeground.
-- (void)onTabInsertedWithContents:(content::WebContents*)contents
-                     inForeground:(BOOL)inForeground;
-
-@end
-
-// A class that handles managing the tab strip in a browser window. It uses
-// a supporting C++ bridge object to register for notifications from the
-// TabStripModel. The Obj-C part of this class handles drag and drop and all
-// the other Cocoa-y aspects.
-//
-// For a full description of the design, see
-// http://www.chromium.org/developers/design-documents/tab-strip-mac
-@interface TabStripControllerCocoa : NSObject<TabControllerTarget,
-                                              URLDropTargetController,
-                                              HasWeakBrowserPointer,
-                                              TabStripModelBridge> {
- @private
-  base::scoped_nsobject<TabStripView> tabStripView_;
-  NSView* switchView_;  // weak
-  base::scoped_nsobject<NSView> dragBlockingView_;  // avoid bad window server
-                                                    // drags
-  // The controller that manages all the interactions of dragging tabs.
-  base::scoped_nsobject<TabStripDragController> dragController_;
-
-  std::unique_ptr<TabStripModelObserverBridge> bridge_;
-  Browser* browser_;  // weak
-  TabStripModel* tabStripModel_;  // weak
-  // Delegate that is informed about tab state changes.
-  id<TabStripControllerDelegate> delegate_;  // weak
-
-  // Access to the TabContentsControllers (which own the parent view
-  // for the toolbar and associated tab contents) given an index. Call
-  // |indexFromModelIndex:| to convert a |tabStripModel_| index to a
-  // |tabContentsArray_| index. Do NOT assume that the indices of
-  // |tabStripModel_| and this array are identical, this is e.g. not true while
-  // tabs are animating closed (closed tabs are removed from |tabStripModel_|
-  // immediately, but from |tabContentsArray_| only after their close animation
-  // has completed).
-  base::scoped_nsobject<NSMutableArray> tabContentsArray_;
-  // An array of TabControllers which manage the actual tab views. See note
-  // above |tabContentsArray_|. |tabContentsArray_| and |tabArray_| always
-  // contain objects belonging to the same tabs at the same indices.
-  base::scoped_nsobject<NSMutableArray> tabArray_;
-
-  // Set of TabControllers that are currently animating closed.
-  base::scoped_nsobject<NSMutableSet> closingControllers_;
-
-  // These values are only used during a drag, and override tab positioning.
-  TabViewCocoa* placeholderTab_;  // weak. Tab being dragged
-  NSRect placeholderFrame_;  // Frame to use
-  NSRect droppedTabFrame_;  // Initial frame of a dropped tab, for animation.
-  // Frame targets for all the current views.
-  // target frames are used because repeated requests to [NSView animator].
-  // aren't coalesced, so we store frames to avoid redundant calls.
-  base::scoped_nsobject<NSMutableDictionary> targetFrames_;
-  NSRect newTabTargetFrame_;
-  // YES if we've successfully completed the initial layout. When this is
-  // NO, we probably don't want to do any animation because we're just coming
-  // into being.
-  BOOL initialLayoutComplete_;
-
-  // Width available for resizing the tabs (doesn't include the new tab
-  // button). Used to restrict the available width when closing many tabs at
-  // once to prevent them from resizing to fit the full width. If the entire
-  // width should be used, this will have a value of |kUseFullAvailableWidth|.
-  float availableResizeWidth_;
-  // A tracking area that's the size of the tab strip used to be notified
-  // when the mouse moves in the tab strip
-  base::scoped_nsobject<CrTrackingArea> trackingArea_;
-  TabViewCocoa* hoveredTab_;  // weak. Tab that the mouse is hovering over
-
-  // A transparent subview of |tabStripView_| used to show the hovered tab's
-  // tooltip text.
-  base::scoped_nsobject<NSView> toolTipView_;
-
-  // Array of subviews which are permanent (and which should never be removed),
-  // such as the new-tab button, but *not* the tabs themselves.
-  base::scoped_nsobject<NSMutableArray> permanentSubviews_;
-
-  // The default favicon, so we can use one copy for all buttons.
-  base::scoped_nsobject<NSImage> defaultFavicon_;
-
-  // The amount by which to indent the tabs on the sides (to make room for the
-  // red/yellow/green and incognito/fullscreen buttons).
-  CGFloat leadingIndentForControls_;
-  CGFloat trailingIndentForControls_;
-
-  // Is the mouse currently inside the strip;
-  BOOL mouseInside_;
-
-  // Helper for performing tab selection as a result of dragging over a tab.
-  std::unique_ptr<HoverTabSelector> hoverTabSelector_;
-
-  // A container view for custom traffic light buttons, which must be manually
-  // added in fullscreen in 10.10+.
-  base::scoped_nsobject<CustomWindowControlsView> customWindowControls_;
-  base::scoped_nsobject<CrTrackingArea> customWindowControlsTrackingArea_;
-
-  // The set stores the WebContens that were hiding their throbbers.
-  std::set<content::WebContents*> wasHidingThrobberSet_;
-}
-
-@property(nonatomic) CGFloat leadingIndentForControls;
-@property(nonatomic) CGFloat trailingIndentForControls;
-
-@property(assign, nonatomic) TabViewCocoa* hoveredTab;
-
-// Time (in seconds) in which tabs animate to their final position.
-+ (CGFloat)tabAnimationDuration;
-
-// Initialize the controller with a view and browser that contains
-// everything else we'll need. |switchView| is the view whose contents get
-// "switched" every time the user switches tabs. The children of this view
-// will be released, so if you want them to stay around, make sure
-// you have retained them.
-// |delegate| is the one listening to filtered TabStripModelObserverBridge's
-// events (see TabStripControllerDelegate for more details).
-- (id)initWithView:(TabStripView*)view
-        switchView:(NSView*)switchView
-           browser:(Browser*)browser
-          delegate:(id<TabStripControllerDelegate>)delegate;
-
-// Returns the model behind this controller.
-- (TabStripModel*)tabStripModel;
-
-// Returns all tab views.
-- (NSArray*)tabViews;
-
-// Return the view for the currently active tab.
-- (NSView*)activeTabView;
-
-// Find the model index based on the x coordinate of the placeholder. If there
-// is no placeholder, this returns the end of the tab strip. Closing tabs are
-// not considered in computing the index.
-- (int)indexOfPlaceholder;
-
-// Set the frame of |tabView|, also updates the internal frame dict.
-- (void)setFrame:(NSRect)frame ofTabView:(NSView*)tabView;
-
-// Move the given tab at index |from| in this window to the location of the
-// current placeholder.
-- (void)moveTabFromIndex:(NSInteger)from;
-
-// Drop a given WebContents at |modelIndex|. Used when dragging from
-// another window when we don't have access to the WebContents as part of our
-// strip. |frame| is in the coordinate system of the tab strip view and
-// represents where the user dropped the new tab so it can be animated into its
-// correct location when the tab is added to the model. If the tab was pinned in
-// its previous window, setting |pinned| to YES will propagate that state to the
-// new window. Mini-tabs are either app or pinned tabs; the app state is stored
-// by the |contents|, but the |pinned| state is the caller's responsibility.
-// Setting |activate| to YES will make the new tab active.
-- (void)dropWebContents:(content::WebContents*)contents
-                atIndex:(int)modelIndex
-              withFrame:(NSRect)frame
-            asPinnedTab:(BOOL)pinned
-               activate:(BOOL)activate;
-
-// Returns the index of the subview |view|. Returns -1 if not present. Takes
-// closing tabs into account such that this index will correctly match the tab
-// model. If |view| is in the process of closing, returns -1, as closing tabs
-// are no longer in the model.
-- (NSInteger)modelIndexForTabView:(NSView*)view;
-
-// Returns all selected tab views.
-- (NSArray*)selectedViews;
-
-// Return the view at a given index.
-- (NSView*)viewAtIndex:(NSUInteger)index;
-
-// Return the number of tab views in the tab strip. It's same as number of tabs
-// in the model, except when a tab is closing, which will be counted in views
-// count, but no longer in the model.
-- (NSUInteger)viewsCount;
-
-// Set the placeholder for a dragged tab, allowing the |frame| to be specified.
-// This causes this tab to be rendered in an arbitrary position.
-- (void)insertPlaceholderForTab:(TabViewCocoa*)tab frame:(NSRect)frame;
-
-// Returns whether a tab is being dragged within the tab strip.
-- (BOOL)isDragSessionActive;
-
-// Returns whether or not |tab| can still be fully seen in the tab strip or if
-// its current position would cause it be obscured by things such as the edge
-// of the window or the window decorations. Returns YES only if the entire tab
-// is visible.
-- (BOOL)isTabFullyVisible:(TabViewCocoa*)tab;
-
-// Returns the right edge of the tab strip's tab area (i.e. the width of the
-// tab strip, less the right indent for controls).
-- (CGFloat)tabAreaRightEdge;
-
-// Force the tabs to rearrange themselves to reflect the current model.
-- (void)layoutTabs;
-- (void)layoutTabsWithoutAnimation;
-
-// Are we in rapid (tab) closure mode? I.e., is a full layout deferred (while
-// the user closes tabs)? Needed to overcome missing clicks during rapid tab
-// closure.
-- (BOOL)inRapidClosureMode;
-
-// Returns YES if the user is allowed to drag tabs on the strip at this moment.
-// For example, this returns NO if there are any pending tab close animations.
-- (BOOL)tabDraggingAllowed;
-
-// Default height for tabs.
-+ (CGFloat)defaultTabHeight;
-
-// Default indentation for tabs (see |leadingIndentForControls_|).
-+ (CGFloat)defaultLeadingIndentForControls;
-
-// Returns the amount by which tabs overlap.
-+ (CGFloat)tabOverlap;
-
-// Returns the currently active TabContentsController.
-- (TabContentsController*)activeTabContentsController;
-
-// Adds custom traffic light buttons to the tab strip. Idempotent.
-- (void)addCustomWindowControls;
-
-// Removes custom traffic light buttons from the tab strip. Idempotent.
-- (void)removeCustomWindowControls;
-
-// Gets the tab and the alert state to check whether the window
-// alert state should be updated or not. If the tab alert state is
-// AUDIO_PLAYING, the window alert state should be set to AUDIO_PLAYING.
-// If the tab alert state is AUDIO_MUTING, this method will check if the
-// window has no other tabs with state AUDIO_PLAYING. If so the window
-// alert state will be set to AUDIO_MUTING. If the tab alert state is NONE,
-// this method checks if the window has no playing or muting tab, then window
-// alert state will be set to NONE.
-- (void)updateWindowAlertState:(TabAlertState)alertState
-                forWebContents:(content::WebContents*)changed;
-
-// Returns the alert state associated with the contents.
-- (TabAlertState)alertStateForContents:(content::WebContents*)contents;
-
-// Leaving visual effects enabled when fullscreen results in higher power
-// consumption. This is used to disable effects when fullscreen.
-- (void)setVisualEffectsDisabledForFullscreen:(BOOL)disabled;
-@end
-
-@interface TabStripControllerCocoa (TestingAPI)
-- (void)setTabTitle:(TabControllerCocoa*)tab
-       withContents:(content::WebContents*)contents;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
deleted file mode 100644
index 76a1d0e..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
+++ /dev/null
@@ -1,2305 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-#include <cmath>
-#include <limits>
-#include <string>
-
-#include "base/command_line.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mac_util.h"
-#include "base/mac/scoped_nsautorelease_pool.h"
-#include "base/mac/sdk_forward_declarations.h"
-#include "base/macros.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/user_metrics.h"
-#include "base/stl_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
-#include "chrome/browser/extensions/tab_helper.h"
-#include "chrome/browser/favicon/favicon_utils.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/themes/theme_service.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_navigator.h"
-#include "chrome/browser/ui/browser_navigator_params.h"
-#include "chrome/browser/ui/browser_tabstrip.h"
-#import "chrome/browser/ui/cocoa/browser_window_controller.h"
-#include "chrome/browser/ui/cocoa/drag_util.h"
-#include "chrome/browser/ui/cocoa/l10n_util.h"
-#import "chrome/browser/ui/cocoa/tab_contents/favicon_util_mac.h"
-#import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-#include "chrome/browser/ui/find_bar/find_bar.h"
-#include "chrome/browser/ui/find_bar/find_bar_controller.h"
-#include "chrome/browser/ui/find_bar/find_tab_helper.h"
-#include "chrome/browser/ui/tab_ui_helper.h"
-#include "chrome/browser/ui/tabs/tab_menu_model.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/theme_resources.h"
-#include "components/grit/components_scaled_resources.h"
-#include "components/omnibox/browser/autocomplete_classifier.h"
-#include "components/omnibox/browser/autocomplete_match.h"
-#include "components/prefs/pref_service.h"
-#include "components/url_formatter/url_fixer.h"
-#include "components/web_modal/web_contents_modal_dialog_manager.h"
-#include "content/public/browser/navigation_controller.h"
-#include "content/public/browser/web_contents.h"
-#include "skia/ext/skia_utils_mac.h"
-#import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSAnimation+Duration.h"
-#include "third_party/metrics_proto/omnibox_event.pb.h"
-#include "ui/base/cocoa/animation_utils.h"
-#include "ui/base/cocoa/cocoa_base_utils.h"
-#import "ui/base/cocoa/tracking_area.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/material_design/material_design_controller.h"
-#include "ui/base/models/list_selection_model.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/base/theme_provider.h"
-#include "ui/gfx/image/image.h"
-#include "ui/gfx/mac/scoped_cocoa_disable_screen_updates.h"
-#include "ui/resources/grit/ui_resources.h"
-
-using base::UserMetricsAction;
-using content::OpenURLParams;
-using content::Referrer;
-using content::WebContents;
-
-namespace {
-
-// A value to indicate tab layout should use the full available width of the
-// view.
-const CGFloat kUseFullAvailableWidth = -1.0;
-
-// The amount by which pinned tabs are separated from normal tabs.
-const CGFloat kLastPinnedTabSpacing = 2.0;
-
-const NSTimeInterval kTabAnimationDuration = 0.125;
-
-// Helper class for doing NSAnimationContext calls that takes a bool to disable
-// all the work.  Useful for code that wants to conditionally animate.
-class ScopedNSAnimationContextGroup {
- public:
-  explicit ScopedNSAnimationContextGroup(bool animate)
-      : animate_(animate) {
-    if (animate_) {
-      [NSAnimationContext beginGrouping];
-    }
-  }
-
-  ~ScopedNSAnimationContextGroup() {
-    if (animate_) {
-      [NSAnimationContext endGrouping];
-    }
-  }
-
-  void SetCurrentContextDuration(NSTimeInterval duration) {
-    if (animate_) {
-      [[NSAnimationContext currentContext] gtm_setDuration:duration
-                                                 eventMask:NSLeftMouseUpMask];
-    }
-  }
-
-  void SetCurrentContextShortestDuration() {
-    if (animate_) {
-      // The minimum representable time interval.  This used to stop an
-      // in-progress animation as quickly as possible.
-      const NSTimeInterval kMinimumTimeInterval =
-          std::numeric_limits<NSTimeInterval>::min();
-      // Directly set the duration to be short, avoiding the Steve slowmotion
-      // ettect the gtm_setDuration: provides.
-      [[NSAnimationContext currentContext] setDuration:kMinimumTimeInterval];
-    }
-  }
-
-private:
-  bool animate_;
-  DISALLOW_COPY_AND_ASSIGN(ScopedNSAnimationContextGroup);
-};
-
-CGFloat FlipXInView(NSView* view, CGFloat width, CGFloat x) {
-  if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout())
-    return [view frame].size.width - x - width;
-  return x;
-}
-
-NSRect FlipRectInView(NSView* view, NSRect rect) {
-  rect.origin.x = FlipXInView(view, NSWidth(rect), NSMinX(rect));
-  return rect;
-}
-
-}  // namespace
-
-@interface NSView (PrivateTabStripControllerAPI)
-// Called by AppKit to check if dragging this view should move the window.
-// NSButton overrides this method in the same way so dragging window buttons
-// has no effect. NSView implementation returns NSZeroRect so the whole view
-// area can be dragged.
-- (NSRect)_opaqueRectForWindowMoveWhenInTitlebar;
-@end
-
-@interface TabStripControllerCocoa (Private)
-- (void)addSubviewToPermanentList:(NSView*)aView;
-- (void)regenerateSubviewList;
-- (NSInteger)indexForContentsView:(NSView*)view;
-- (NSImage*)iconImageForContents:(content::WebContents*)contents
-                         atIndex:(NSInteger)modelIndex;
-- (void)updateIconsForContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)modelIndex;
-- (void)layoutTabsWithAnimation:(BOOL)animate
-             regenerateSubviews:(BOOL)doUpdate;
-- (void)animationDidStop:(CAAnimation*)animation
-           forController:(TabControllerCocoa*)controller
-                finished:(BOOL)finished;
-- (NSInteger)indexFromModelIndex:(NSInteger)index;
-- (NSInteger)numberOfOpenTabs;
-- (NSInteger)numberOfOpenPinnedTabs;
-- (NSInteger)numberOfOpenNonPinnedTabs;
-- (void)mouseMoved:(NSEvent*)event;
-- (void)setTabTrackingAreasEnabled:(BOOL)enabled;
-- (void)droppingURLsAt:(NSPoint)point
-            givesIndex:(NSInteger*)index
-           disposition:(WindowOpenDisposition*)disposition
-           activateTab:(BOOL)activateTab;
-- (void)themeDidChangeNotification:(NSNotification*)notification;
-- (BOOL)doesAnyOtherWebContents:(content::WebContents*)selected
-                 haveAlertState:(TabAlertState)state;
-@end
-
-// A simple view class that contains the traffic light buttons. This class
-// ensures that the buttons display the icons when the mouse hovers over
-// them by overriding the _mouseInGroup method.
-@interface CustomWindowControlsView : NSView {
- @private
-  BOOL mouseInside_;
-}
-
-// Overrides the undocumented NSView method: _mouseInGroup. When the traffic
-// light buttons are drawn, they call _mouseInGroup from the superview. If
-// _mouseInGroup returns YES, the buttons will draw themselves with the icons
-// inside.
-- (BOOL)_mouseInGroup:(NSButton*)button;
-- (void)setMouseInside:(BOOL)isInside;
-
-@end
-
-@implementation CustomWindowControlsView
-
-- (void)setMouseInside:(BOOL)isInside {
-  if (mouseInside_ != isInside) {
-    mouseInside_ = isInside;
-    for (NSButton* button : [self subviews])
-      [button setNeedsDisplay];
-  }
-}
-
-- (BOOL)_mouseInGroup:(NSButton*)button {
-  return mouseInside_;
-}
-
-@end
-
-// A simple view class that prevents the Window Server from dragging the area
-// behind tabs. Sometimes core animation confuses it. Unfortunately, it can also
-// falsely pick up clicks during rapid tab closure, so we have to account for
-// that.
-@interface TabStripControllerDragBlockingView : NSView {
-  TabStripControllerCocoa* controller_;  // weak; owns us
-}
-
-- (id)initWithFrame:(NSRect)frameRect
-         controller:(TabStripControllerCocoa*)controller;
-
-// Runs a nested runloop to do window move tracking. Overriding
-// -mouseDownCanMoveWindow with a dynamic result instead doesn't work:
-// http://www.cocoabuilder.com/archive/cocoa/219261-conditional-mousedowncanmovewindow-for-nsview.html
-// http://www.cocoabuilder.com/archive/cocoa/92973-brushed-metal-window-dragging.html
-- (void)trackClickForWindowMove:(NSEvent*)event;
-@end
-
-@implementation TabStripControllerDragBlockingView
-- (BOOL)mouseDownCanMoveWindow {
-  return NO;
-}
-
-- (NSRect)_opaqueRectForWindowMoveWhenInTitlebar {
- return [self bounds];
-}
-
-- (id)initWithFrame:(NSRect)frameRect
-         controller:(TabStripControllerCocoa*)controller {
-  if ((self = [super initWithFrame:frameRect])) {
-    controller_ = controller;
-  }
-  return self;
-}
-
-// In "rapid tab closure" mode (i.e., the user is clicking close tab buttons in
-// rapid succession), the animations confuse Cocoa's hit testing (which appears
-// to use cached results, among other tricks), so this view can somehow end up
-// getting a mouse down event. Thus we do an explicit hit test during rapid tab
-// closure, and if we find that we got a mouse down we shouldn't have, we send
-// it off to the appropriate view.
-- (void)mouseDown:(NSEvent*)event {
-  NSView* superview = [self superview];
-  NSPoint hitLocation =
-      [[superview superview] convertPoint:[event locationInWindow]
-                                 fromView:nil];
-  NSView* hitView = [superview hitTest:hitLocation];
-
-  if ([controller_ inRapidClosureMode]) {
-    if (hitView != self) {
-      [hitView mouseDown:event];
-      return;
-    }
-  }
-
-  if (hitView == self) {
-    BrowserWindowController* windowController =
-        [BrowserWindowController browserWindowControllerForView:self];
-    if (![windowController isInAnyFullscreenMode]) {
-      [self trackClickForWindowMove:event];
-      return;
-    }
-  }
-  [super mouseDown:event];
-}
-
-- (void)trackClickForWindowMove:(NSEvent*)event {
-  NSWindow* window = [self window];
-  NSPoint frameOrigin = [window frame].origin;
-  NSPoint lastEventLoc =
-      ui::ConvertPointFromWindowToScreen(window, [event locationInWindow]);
-  while ((event = [NSApp nextEventMatchingMask:
-      NSLeftMouseDownMask|NSLeftMouseDraggedMask|NSLeftMouseUpMask
-                                    untilDate:[NSDate distantFuture]
-                                       inMode:NSEventTrackingRunLoopMode
-                                      dequeue:YES]) &&
-      [event type] != NSLeftMouseUp) {
-    base::mac::ScopedNSAutoreleasePool pool;
-
-    NSPoint now =
-        ui::ConvertPointFromWindowToScreen(window, [event locationInWindow]);
-    frameOrigin.x += now.x - lastEventLoc.x;
-    frameOrigin.y += now.y - lastEventLoc.y;
-    [window setFrameOrigin:frameOrigin];
-    lastEventLoc = now;
-  }
-}
-
-@end
-
-#pragma mark -
-
-// A delegate, owned by the CAAnimation system, that is alerted when the
-// animation to close a tab is completed. Calls back to the given tab strip
-// to let it know that |controller_| is ready to be removed from the model.
-// Since we only maintain weak references, the tab strip must call -invalidate:
-// to prevent the use of dangling pointers.
-@interface TabCloseAnimationDelegate : NSObject <CAAnimationDelegate> {
- @private
-  TabStripControllerCocoa* strip_;  // weak; owns us indirectly
-  TabControllerCocoa* controller_;  // weak
-}
-
-// Will tell |strip| when the animation for |controller|'s view has completed.
-// These should not be nil, and will not be retained.
-- (id)initWithTabStrip:(TabStripControllerCocoa*)strip
-         tabController:(TabControllerCocoa*)controller;
-
-// Invalidates this object so that no further calls will be made to
-// |strip_|.  This should be called when |strip_| is released, to
-// prevent attempts to call into the released object.
-- (void)invalidate;
-
-// CAAnimation delegate methods
-- (void)animationDidStart:(CAAnimation*)animation;
-- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished;
-
-@end
-
-@implementation TabCloseAnimationDelegate
-
-- (id)initWithTabStrip:(TabStripControllerCocoa*)strip
-         tabController:(TabControllerCocoa*)controller {
-  if ((self = [super init])) {
-    DCHECK(strip && controller);
-    strip_ = strip;
-    controller_ = controller;
-  }
-  return self;
-}
-
-- (void)invalidate {
-  strip_ = nil;
-  controller_ = nil;
-}
-
-- (void)animationDidStart:(CAAnimation*)theAnimation {
-  // CAAnimationDelegate method added on OSX 10.12.
-}
-- (void)animationDidStop:(CAAnimation*)animation finished:(BOOL)finished {
-  [strip_ animationDidStop:animation
-             forController:controller_
-                  finished:finished];
-}
-
-@end
-
-#pragma mark -
-
-// In general, there is a one-to-one correspondence between TabControllers,
-// TabViews, TabContentsControllers, and the WebContents in the
-// TabStripModel. In the steady-state, the indices line up so an index coming
-// from the model is directly mapped to the same index in the parallel arrays
-// holding our views and controllers. This is also true when new tabs are
-// created (even though there is a small period of animation) because the tab is
-// present in the model while the TabViewCocoa is animating into place. As a
-// result, nothing special need be done to handle "new tab" animation.
-//
-// This all goes out the window with the "close tab" animation. The animation
-// kicks off in |-tabDetachedWithContents:atIndex:| with the notification that
-// the tab has been removed from the model. The simplest solution at this
-// point would be to remove the views and controllers as well, however once
-// the TabViewCocoa is removed from the view list, the tab z-order code takes
-// care of removing it from the tab strip and we'll get no animation. That means
-// if there is to be any visible animation, the TabViewCocoa needs to stay
-// around until its animation is complete. In order to maintain consistency
-// among the internal parallel arrays, this means all structures are kept around
-// until the animation completes. At this point, though, the model and our
-// internal structures are out of sync: the indices no longer line up. As a
-// result, there is a concept of a "model index" which represents an index valid
-// in the TabStripModel. During steady-state, the "model index" is just the same
-// index as our parallel arrays (as above), but during tab close animations,
-// it is different, offset by the number of tabs preceding the index which
-// are undergoing tab closing animation. As a result, the caller needs to be
-// careful to use the available conversion routines when accessing the internal
-// parallel arrays (e.g., -indexFromModelIndex:). Care also needs to be taken
-// during tab layout to ignore closing tabs in the total width calculations and
-// in individual tab positioning (to avoid moving them right back to where they
-// were).
-//
-// In order to prevent actions being taken on tabs which are closing, the tab
-// itself gets marked as such so it no longer will send back its select action
-// or allow itself to be dragged. In addition, drags on the tab strip as a
-// whole are disabled while there are tabs closing.
-
-@implementation TabStripControllerCocoa
-
-@synthesize leadingIndentForControls = leadingIndentForControls_;
-@synthesize trailingIndentForControls = trailingIndentForControls_;
-
-+ (CGFloat)tabAnimationDuration {
-  return kTabAnimationDuration;
-}
-
-- (id)initWithView:(TabStripView*)view
-        switchView:(NSView*)switchView
-           browser:(Browser*)browser
-          delegate:(id<TabStripControllerDelegate>)delegate {
-  DCHECK(view && switchView && browser && delegate);
-  if ((self = [super init])) {
-    tabStripView_.reset([view retain]);
-    [tabStripView_ setController:self];
-    switchView_ = switchView;
-    browser_ = browser;
-    tabStripModel_ = browser_->tab_strip_model();
-    hoverTabSelector_.reset(new HoverTabSelector(tabStripModel_));
-    delegate_ = delegate;
-    bridge_.reset(new TabStripModelObserverBridge(tabStripModel_, self));
-    dragController_.reset(
-        [[TabStripDragController alloc] initWithTabStripController:self]);
-    tabContentsArray_.reset([[NSMutableArray alloc] init]);
-    tabArray_.reset([[NSMutableArray alloc] init]);
-    NSWindow* browserWindow = [view window];
-
-    // Important note: any non-tab subviews not added to |permanentSubviews_|
-    // (see |-addSubviewToPermanentList:|) will be wiped out.
-    permanentSubviews_.reset([[NSMutableArray alloc] init]);
-
-    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-    defaultFavicon_.reset(
-        rb.GetNativeImageNamed(IDR_DEFAULT_FAVICON).CopyNSImage());
-
-    [self setLeadingIndentForControls:[[self class]
-                                          defaultLeadingIndentForControls]];
-    [self setTrailingIndentForControls:0];
-
-    // Add this invisible view first so that it is ordered below other views.
-    dragBlockingView_.reset(
-        [[TabStripControllerDragBlockingView alloc] initWithFrame:NSZeroRect
-                                                       controller:self]);
-    [self addSubviewToPermanentList:dragBlockingView_];
-
-    targetFrames_.reset([[NSMutableDictionary alloc] init]);
-
-    availableResizeWidth_ = kUseFullAvailableWidth;
-
-    closingControllers_.reset([[NSMutableSet alloc] init]);
-
-    // Install the permanent subviews.
-    [self regenerateSubviewList];
-
-    // Watch for notifications that the tab strip view has changed size so
-    // we can tell it to layout for the new size.
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(tabViewFrameChanged:)
-               name:NSViewFrameDidChangeNotification
-             object:tabStripView_];
-
-    [[NSNotificationCenter defaultCenter]
-        addObserver:self
-           selector:@selector(themeDidChangeNotification:)
-               name:kBrowserThemeDidChangeNotification
-             object:nil];
-
-    trackingArea_.reset([[CrTrackingArea alloc]
-        initWithRect:NSZeroRect  // Ignored by NSTrackingInVisibleRect
-             options:NSTrackingMouseEnteredAndExited |
-                     NSTrackingMouseMoved |
-                     NSTrackingActiveAlways |
-                     NSTrackingInVisibleRect
-               owner:self
-            userInfo:nil]);
-    if (browserWindow)  // Nil for Browsers without a tab strip (e.g. popups).
-      [trackingArea_ clearOwnerWhenWindowWillClose:browserWindow];
-    [tabStripView_ addTrackingArea:trackingArea_.get()];
-
-    // Check to see if the mouse is currently in our bounds so we can
-    // enable the tracking areas.  Otherwise we won't get hover states
-    // or tab gradients if we load the window up under the mouse.
-    NSPoint mouseLoc = [[view window] mouseLocationOutsideOfEventStream];
-    mouseLoc = [view convertPoint:mouseLoc fromView:nil];
-    if (NSPointInRect(mouseLoc, [view bounds])) {
-      [self setTabTrackingAreasEnabled:YES];
-      mouseInside_ = YES;
-    }
-
-    // Controller may have been (re-)created by switching layout modes, which
-    // means the tab model is already fully formed with tabs. Need to walk the
-    // list and create the UI for each.
-    const int existingTabCount = tabStripModel_->count();
-    const content::WebContents* selection =
-        tabStripModel_->GetActiveWebContents();
-    for (int i = 0; i < existingTabCount; ++i) {
-      content::WebContents* currentContents =
-          tabStripModel_->GetWebContentsAt(i);
-      [self insertTabWithContents:currentContents
-                          atIndex:i
-                     inForeground:NO];
-      if (selection == currentContents) {
-        // Must manually force a selection since the model won't send
-        // selection messages in this scenario.
-        [self
-            activateTabWithContents:currentContents
-                   previousContents:NULL
-                            atIndex:i
-                             reason:TabStripModelObserver::CHANGE_REASON_NONE];
-      }
-    }
-    // Don't lay out the tabs until after the controller has been fully
-    // constructed.
-    if (existingTabCount) {
-      [self performSelectorOnMainThread:@selector(layoutTabs)
-                             withObject:nil
-                          waitUntilDone:NO];
-    }
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self browserWillBeDestroyed];
-  [super dealloc];
-}
-
-- (void)browserWillBeDestroyed {
-  [tabStripView_ setController:nil];
-
-  if (trackingArea_.get())
-    [tabStripView_ removeTrackingArea:trackingArea_.get()];
-
-  // Invalidate all closing animations so they don't call back to us after
-  // we're gone.
-  for (TabControllerCocoa* controller in closingControllers_.get()) {
-    NSView* view = [controller view];
-    [[[view animationForKey:@"frameOrigin"] delegate] invalidate];
-  }
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-
-  browser_ = nullptr;
-}
-
-+ (CGFloat)defaultTabHeight {
-  return [TabControllerCocoa defaultTabHeight];
-}
-
-+ (CGFloat)defaultLeadingIndentForControls {
-  // Default indentation leaves enough room so tabs don't overlap with the
-  // window controls.
-  return 70.0;
-}
-
-+ (CGFloat)tabOverlap {
-  // The overlap value needs to be <= the x position of the favicon within a
-  // tab. Else, every time the throbber is painted, the throbber's invalidation
-  // will also invalidate parts of the tab to the left, and two tabs's
-  // backgrounds need to be painted on each throbber frame instead of one.
-  const CGFloat kTabOverlap = 18.0;
-  return kTabOverlap;
-}
-
-// Finds the TabContentsController associated with the given index into the tab
-// model and swaps out the sole child of the contentArea to display its
-// contents.
-- (void)swapInTabAtIndex:(NSInteger)modelIndex {
-  DCHECK(modelIndex >= 0 && modelIndex < tabStripModel_->count());
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-  TabContentsController* controller = [tabContentsArray_ objectAtIndex:index];
-
-  // Make sure we do not draw any transient arrangements of views.
-  gfx::ScopedCocoaDisableScreenUpdates cocoa_disabler;
-  // Make sure that any layers that move are not animated to their new
-  // positions.
-  ScopedCAActionDisabler ca_disabler;
-
-  // Ensure the nib is loaded. Sizing won't occur until it's added to the view
-  // hierarchy with -ensureContentsVisibleInSuperview:.
-  [controller view];
-
-  // Remove the old view from the view hierarchy to suppress resizes. We know
-  // there's only one child of |switchView_| because we're the one who put it
-  // there. There may not be any children in the case of a tab that's been
-  // closed, in which case there's nothing removed.
-  [[[switchView_ subviews] firstObject] removeFromSuperview];
-
-  // Prepare the container with any infobars or docked devtools it wants.
-  [delegate_ onActivateTabWithContents:[controller webContents]];
-
-  // Sizes the WebContents to match the possibly updated size of |switchView_|,
-  // then adds it and starts auto-resizing again.
-  [controller ensureContentsVisibleInSuperview:switchView_];
-}
-
-// Create a new tab view and set its cell correctly so it draws the way we want
-// it to. It will be sized and positioned by |-layoutTabs| so there's no need to
-// set the frame here. This also creates the view as hidden, it will be
-// shown during layout.
-- (TabControllerCocoa*)newTab {
-  TabControllerCocoa* controller =
-      [[[TabControllerCocoa alloc] init] autorelease];
-  [controller setTarget:self];
-  [controller setAction:@selector(selectTab:)];
-  [[controller view] setHidden:YES];
-
-  return controller;
-}
-
-// (Private) Returns the number of open tabs in the tab strip. This is the
-// number of TabControllers we know about (as there's a 1-to-1 mapping from
-// these controllers to a tab) less the number of closing tabs.
-- (NSInteger)numberOfOpenTabs {
-  return static_cast<NSInteger>(tabStripModel_->count());
-}
-
-// (Private) Returns the number of open, pinned tabs.
-- (NSInteger)numberOfOpenPinnedTabs {
-  // Ask the model for the number of pinned tabs. Note that tabs which are in
-  // the process of closing (i.e., whose controllers are in
-  // |closingControllers_|) have already been removed from the model.
-  return tabStripModel_->IndexOfFirstNonPinnedTab();
-}
-
-// (Private) Returns the number of open, non-pinned tabs.
-- (NSInteger)numberOfOpenNonPinnedTabs {
-  NSInteger number = [self numberOfOpenTabs] - [self numberOfOpenPinnedTabs];
-  DCHECK_GE(number, 0);
-  return number;
-}
-
-// Given an index into the tab model, returns the index into the tab controller
-// or tab contents controller array accounting for tabs that are currently
-// closing. For example, if there are two tabs in the process of closing before
-// |index|, this returns |index| + 2. If there are no closing tabs, this will
-// return |index|.
-- (NSInteger)indexFromModelIndex:(NSInteger)index {
-  DCHECK_GE(index, 0);
-  if (index < 0)
-    return index;
-
-  NSInteger i = 0;
-  for (TabControllerCocoa* controller in tabArray_.get()) {
-    if ([closingControllers_ containsObject:controller]) {
-      DCHECK([[controller tabView] isClosing]);
-      ++index;
-    }
-    if (i == index)  // No need to check anything after, it has no effect.
-      break;
-    ++i;
-  }
-  return index;
-}
-
-// Given an index into |tabArray_|, return the corresponding index into
-// |tabStripModel_| or NSNotFound if the specified tab does not exist in
-// the model (if it's closing, for example).
-- (NSInteger)modelIndexFromIndex:(NSInteger)index {
-  NSInteger modelIndex = 0;
-  NSInteger arrayIndex = 0;
-  for (TabControllerCocoa* controller in tabArray_.get()) {
-    if (![closingControllers_ containsObject:controller]) {
-      if (arrayIndex == index)
-        return modelIndex;
-      ++modelIndex;
-    } else if (arrayIndex == index) {
-      // Tab is closing - no model index.
-      return NSNotFound;
-    }
-    ++arrayIndex;
-  }
-  return NSNotFound;
-}
-
-// Returns the index of the subview |view|. Returns -1 if not present. Takes
-// closing tabs into account such that this index will correctly match the tab
-// model. If |view| is in the process of closing, returns -1, as closing tabs
-// are no longer in the model.
-- (NSInteger)modelIndexForTabView:(NSView*)view {
-  NSInteger index = 0;
-  for (TabControllerCocoa* current in tabArray_.get()) {
-    // If |current| is closing, skip it.
-    if ([closingControllers_ containsObject:current])
-      continue;
-    else if ([current view] == view)
-      return index;
-    ++index;
-  }
-  return -1;
-}
-
-// Returns the index of the contents subview |view|. Returns -1 if not present.
-// Takes closing tabs into account such that this index will correctly match the
-// tab model. If |view| is in the process of closing, returns -1, as closing
-// tabs are no longer in the model.
-- (NSInteger)modelIndexForContentsView:(NSView*)view {
-  NSInteger index = 0;
-  NSInteger i = 0;
-  for (TabContentsController* current in tabContentsArray_.get()) {
-    // If the TabControllerCocoa corresponding to |current| is closing, skip it.
-    TabControllerCocoa* controller = [tabArray_ objectAtIndex:i];
-    if ([closingControllers_ containsObject:controller]) {
-      ++i;
-      continue;
-    } else if ([current view] == view) {
-      return index;
-    }
-    ++index;
-    ++i;
-  }
-  return -1;
-}
-
-- (NSArray*)selectedViews {
-  NSMutableArray* views = [NSMutableArray arrayWithCapacity:[tabArray_ count]];
-  for (TabControllerCocoa* tab in tabArray_.get()) {
-    if ([tab selected])
-      [views addObject:[tab tabView]];
-  }
-  return views;
-}
-
-// Returns the view at the given index, using the array of TabControllers to
-// get the associated view. Returns nil if out of range.
-- (NSView*)viewAtIndex:(NSUInteger)index {
-  if (index >= [tabArray_ count])
-    return NULL;
-  return [[tabArray_ objectAtIndex:index] view];
-}
-
-- (NSUInteger)viewsCount {
-  return [tabArray_ count];
-}
-
-// Called when the user clicks a tab. Tell the model the selection has changed,
-// which feeds back into us via a notification.
-- (void)selectTab:(id)sender {
-  DCHECK([sender isKindOfClass:[NSView class]]);
-  int index = [self modelIndexForTabView:sender];
-  NSUInteger modifiers = [[NSApp currentEvent] modifierFlags];
-  if (tabStripModel_->ContainsIndex(index)) {
-    if (modifiers & NSCommandKeyMask && modifiers & NSShiftKeyMask) {
-      tabStripModel_->AddSelectionFromAnchorTo(index);
-    } else if (modifiers & NSShiftKeyMask) {
-      tabStripModel_->ExtendSelectionTo(index);
-    } else if (modifiers & NSCommandKeyMask) {
-      tabStripModel_->ToggleSelectionAt(index);
-    } else {
-      tabStripModel_->ActivateTabAt(index, true);
-    }
-  }
-}
-
-// Called when the user clicks the tab audio indicator to mute the tab.
-- (void)toggleMute:(id)sender {
-  DCHECK([sender isKindOfClass:[TabViewCocoa class]]);
-  NSInteger index = [self modelIndexForTabView:sender];
-  if (!tabStripModel_->ContainsIndex(index))
-    return;
-  WebContents* contents = tabStripModel_->GetWebContentsAt(index);
-  chrome::SetTabAudioMuted(contents, !contents->IsAudioMuted(),
-                           TabMutedReason::AUDIO_INDICATOR, std::string());
-}
-
-// Called when the user closes a tab. Asks the model to close the tab. |sender|
-// is the TabViewCocoa that is potentially going away.
-- (void)closeTab:(id)sender {
-  DCHECK([sender isKindOfClass:[TabViewCocoa class]]);
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  if ([hoveredTab_ isEqual:sender])
-    [self setHoveredTab:nil];
-
-  NSInteger index = [self modelIndexForTabView:sender];
-  if (!tabStripModel_->ContainsIndex(index))
-    return;
-
-  base::RecordAction(UserMetricsAction("CloseTab_Mouse"));
-  const NSInteger numberOfOpenTabs = [self numberOfOpenTabs];
-  if (numberOfOpenTabs > 1) {
-    bool isClosingLastTab = index == numberOfOpenTabs - 1;
-    if (!isClosingLastTab) {
-      // Limit the width available for laying out tabs so that tabs are not
-      // resized until a later time (when the mouse leaves the tab strip).
-      // However, if the tab being closed is a pinned tab, break out of
-      // rapid-closure mode since the mouse is almost guaranteed not to be over
-      // the closebox of the adjacent tab (due to the difference in widths).
-      // TODO(pinkerton): re-visit when handling tab overflow.
-      // http://crbug.com/188
-      if (tabStripModel_->IsTabPinned(index)) {
-        availableResizeWidth_ = kUseFullAvailableWidth;
-      } else {
-        NSView* penultimateTab = [self viewAtIndex:numberOfOpenTabs - 2];
-        availableResizeWidth_ =
-            cocoa_l10n_util::ShouldDoExperimentalRTLLayout()
-                ? FlipXInView(tabStripView_, 0, NSMinX([penultimateTab frame]))
-                : NSMaxX([penultimateTab frame]);
-      }
-    } else {
-      // If the trailing tab is closed, change the available width so that
-      // another tab's close button lands below the cursor (assuming the tabs
-      // are currently below their maximum width and can grow).
-      NSView* lastTab = [self viewAtIndex:numberOfOpenTabs - 1];
-      availableResizeWidth_ =
-          cocoa_l10n_util::ShouldDoExperimentalRTLLayout()
-              ? FlipXInView(tabStripView_, 0, NSMinX([lastTab frame]))
-              : NSMaxX([lastTab frame]);
-    }
-    tabStripModel_->CloseWebContentsAt(
-        index,
-        TabStripModel::CLOSE_USER_GESTURE |
-        TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
-  } else {
-    // Use the standard window close if this is the last tab
-    // this prevents the tab from being removed from the model until after
-    // the window dissapears
-    [[tabStripView_ window] performClose:nil];
-  }
-}
-
-// Dispatch context menu commands for the given tab controller.
-- (void)commandDispatch:(TabStripModel::ContextMenuCommand)command
-          forController:(TabControllerCocoa*)controller {
-  int index = [self modelIndexForTabView:[controller view]];
-  if (tabStripModel_->ContainsIndex(index))
-    tabStripModel_->ExecuteContextMenuCommand(index, command);
-}
-
-// Returns YES if the specificed command should be enabled for the given
-// controller.
-- (BOOL)isCommandEnabled:(TabStripModel::ContextMenuCommand)command
-           forController:(TabControllerCocoa*)controller {
-  int index = [self modelIndexForTabView:[controller view]];
-  if (!tabStripModel_->ContainsIndex(index))
-    return NO;
-  return tabStripModel_->IsContextMenuCommandEnabled(index, command) ? YES : NO;
-}
-
-// Returns a context menu model for a given controller. Caller owns the result.
-- (ui::SimpleMenuModel*)
-contextMenuModelForController:(TabControllerCocoa*)controller
-                 menuDelegate:(ui::SimpleMenuModel::Delegate*)delegate {
-  int index = [self modelIndexForTabView:[controller view]];
-  return new TabMenuModel(delegate, tabStripModel_, index);
-}
-
-// Returns a weak reference to the controller that manages dragging of tabs.
-- (id<TabDraggingEventTarget>)dragController {
-  return dragController_.get();
-}
-
-- (void)insertPlaceholderForTab:(TabViewCocoa*)tab frame:(NSRect)frame {
-  placeholderTab_ = tab;
-  placeholderFrame_ = frame;
-  [self layoutTabsWithAnimation:initialLayoutComplete_ regenerateSubviews:NO];
-}
-
-- (BOOL)isDragSessionActive {
-  return placeholderTab_ != nil;
-}
-
-- (BOOL)isTabFullyVisible:(TabViewCocoa*)tab {
-  NSRect frame = [tab frame];
-  if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) {
-    return NSMinX(frame) >= [self trailingIndentForControls] &&
-           NSMaxX(frame) <= [self tabAreaRightEdge];
-  } else {
-    return NSMinX(frame) >= [self leadingIndentForControls] &&
-           NSMaxX(frame) <= [self tabAreaRightEdge];
-  }
-}
-
-- (CGFloat)tabAreaRightEdge {
-  CGFloat rightEdge = cocoa_l10n_util::ShouldDoExperimentalRTLLayout()
-                          ? [self leadingIndentForControls]
-                          : [self trailingIndentForControls];
-  return NSMaxX([tabStripView_ frame]) - rightEdge;
-}
-
-// Lay out all tabs in the order of their TabContentsControllers, which matches
-// the ordering in the TabStripModel. This call isn't that expensive, though
-// it is O(n) in the number of tabs. Tabs will animate to their new position
-// if the window is visible and |animate| is YES.
-// TODO(pinkerton): Note this doesn't do too well when the number of min-sized
-// tabs would cause an overflow. http://crbug.com/188
-- (void)layoutTabsWithAnimation:(BOOL)animate
-             regenerateSubviews:(BOOL)doUpdate {
-  DCHECK([NSThread isMainThread]);
-  if (![tabArray_ count])
-    return;
-
-  const CGFloat kMaxTabWidth = [TabControllerCocoa maxTabWidth];
-  const CGFloat kMinTabWidth = [TabControllerCocoa minTabWidth];
-  const CGFloat kMinActiveTabWidth = [TabControllerCocoa minActiveTabWidth];
-  const CGFloat kPinnedTabWidth = [TabControllerCocoa pinnedTabWidth];
-  const CGFloat kTabOverlap = [TabStripControllerCocoa tabOverlap];
-
-  NSRect enclosingRect = NSZeroRect;
-  ScopedNSAnimationContextGroup mainAnimationGroup(animate);
-  mainAnimationGroup.SetCurrentContextDuration(kTabAnimationDuration);
-
-  // Update the current subviews and their z-order if requested.
-  if (doUpdate)
-    [self regenerateSubviewList];
-
-  // Compute the base width of tabs given how much room we're allowed. Note that
-  // pinned tabs have a fixed width. We may not be able to use the entire width
-  // if the user is quickly closing tabs. This may be negative, but that's okay
-  // (taken care of by |MAX()| when calculating tab sizes).
-  CGFloat availableSpace = 0;
-  if ([self inRapidClosureMode]) {
-    availableSpace = availableResizeWidth_;
-  } else {
-    availableSpace = NSWidth([tabStripView_ frame]);
-
-    // Account for the trailing controls if not in rapid closure mode.
-    // (In rapid closure mode, the available width is set based on the
-    // position of the trailing tab, not based on the width of the tab strip,
-    // so the trailing controls have already been accounted for.)
-    availableSpace -= [self trailingIndentForControls];
-  }
-
-  // Need to leave room for the leading controls even in rapid closure mode.
-  availableSpace -= [self leadingIndentForControls];
-
-  // This may be negative, but that's okay (taken care of by |MAX()| when
-  // calculating tab sizes). "pinned" tabs in horizontal mode just get a special
-  // section, they don't change size.
-  CGFloat availableSpaceForNonPinned = availableSpace;
-  if ([self numberOfOpenPinnedTabs]) {
-    availableSpaceForNonPinned -=
-        [self numberOfOpenPinnedTabs] * (kPinnedTabWidth - kTabOverlap);
-    availableSpaceForNonPinned -= kLastPinnedTabSpacing;
-  }
-
-  // Initialize |nonPinnedTabWidth| in case there aren't any non-pinned tabs;
-  // this value shouldn't actually be used.
-  CGFloat nonPinnedTabWidth = kMaxTabWidth;
-  CGFloat nonPinnedTabWidthFraction = 0;
-  NSInteger numberOfNonPinnedTabs = MIN(
-      [self numberOfOpenNonPinnedTabs],
-      (availableSpaceForNonPinned - kTabOverlap) /
-          (kMinTabWidth - kTabOverlap));
-
-  if (numberOfNonPinnedTabs) {
-    // Find the width of a non-pinned tab. This only applies to horizontal
-    // mode. Add in the amount we "get back" from the tabs overlapping.
-    nonPinnedTabWidth =
-        ((availableSpaceForNonPinned - kTabOverlap) / numberOfNonPinnedTabs) +
-        kTabOverlap;
-
-    // Clamp the width between the max and min.
-    nonPinnedTabWidth = MAX(MIN(nonPinnedTabWidth, kMaxTabWidth), kMinTabWidth);
-
-    // When there are multiple tabs, we'll have one active and some inactive
-    // tabs.  If the desired width was between the minimum sizes of these types,
-    // try to shrink the tabs with the smaller minimum.  For example, if we have
-    // a strip of width 10 with 4 tabs, the desired width per tab will be 2.5.
-    // If selected tabs have a minimum width of 4 and unselected tabs have
-    // minimum width of 1, the above code would set *unselected_width = 2.5,
-    // *selected_width = 4, which results in a total width of 11.5.  Instead, we
-    // want to set *unselected_width = 2, *selected_width = 4, for a total width
-    // of 10.
-    if (numberOfNonPinnedTabs > 1 && nonPinnedTabWidth < kMinActiveTabWidth) {
-      nonPinnedTabWidth = (availableSpaceForNonPinned - kMinActiveTabWidth) /
-                            (numberOfNonPinnedTabs - 1) + kTabOverlap;
-      if (nonPinnedTabWidth < kMinTabWidth) {
-        // The above adjustment caused the tabs to not fit, show 1 less tab.
-        --numberOfNonPinnedTabs;
-        nonPinnedTabWidth = ((availableSpaceForNonPinned - kTabOverlap) /
-                                numberOfNonPinnedTabs) + kTabOverlap;
-      }
-    }
-
-    // Separate integral and fractional parts.
-    CGFloat integralPart = std::floor(nonPinnedTabWidth);
-    nonPinnedTabWidthFraction = nonPinnedTabWidth - integralPart;
-    nonPinnedTabWidth = integralPart;
-  }
-
-  BOOL visible = [[tabStripView_ window] isVisible];
-
-  CGFloat offset = [self leadingIndentForControls];
-  bool hasPlaceholderGap = false;
-  // Whether or not the last tab processed by the loop was a pinned tab.
-  BOOL isLastTabPinned = NO;
-  CGFloat tabWidthAccumulatedFraction = 0;
-  NSInteger laidOutNonPinnedTabs = 0;
-
-  // Lay everything out as if it was LTR and flip at the end
-  // for RTL, if necessary.
-  for (TabControllerCocoa* tab in tabArray_.get()) {
-    // Ignore a tab that is going through a close animation.
-    if ([closingControllers_ containsObject:tab])
-      continue;
-
-    BOOL isPlaceholder = [[tab view] isEqual:placeholderTab_];
-    NSRect tabFrame = [[tab view] frame];
-    tabFrame.size.height = [[self class] defaultTabHeight];
-    tabFrame.origin.y = 0;
-    tabFrame.origin.x = offset;
-
-    // If the tab is hidden, we consider it a new tab. We make it visible
-    // and animate it in.
-    BOOL newTab = [[tab view] isHidden];
-    if (newTab)
-      [[tab view] setHidden:NO];
-
-    if (isPlaceholder) {
-      // Move the current tab to the correct location instantly.
-      // We need a duration or else it doesn't cancel an inflight animation.
-      ScopedNSAnimationContextGroup localAnimationGroup(animate);
-      localAnimationGroup.SetCurrentContextShortestDuration();
-      tabFrame.origin.x = placeholderFrame_.origin.x;
-      id target = animate ? [[tab view] animator] : [tab view];
-      [target setFrame:tabFrame];
-
-      // Store the frame by identifier to avoid redundant calls to animator.
-      NSValue* identifier = [NSValue valueWithPointer:[tab view]];
-      [targetFrames_ setObject:[NSValue valueWithRect:tabFrame]
-                        forKey:identifier];
-      continue;
-    }
-
-    if (placeholderTab_ && !hasPlaceholderGap) {
-      // If the back edge is behind the placeholder's back edge, but the
-      // mid is in front of it of it, slide over to make space for it.
-      bool shouldLeaveGap;
-      if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) {
-        const CGFloat tabMidpoint =
-            NSMidX(FlipRectInView(tabStripView_, tabFrame));
-        shouldLeaveGap = tabMidpoint < NSMaxX(placeholderFrame_);
-      } else {
-        shouldLeaveGap = NSMidX(tabFrame) > NSMinX(placeholderFrame_);
-      }
-      if (shouldLeaveGap) {
-        hasPlaceholderGap = true;
-        offset += NSWidth(placeholderFrame_);
-        offset -= kTabOverlap;
-        tabFrame.origin.x = offset;
-      }
-    }
-
-    // Set the width. Selected tabs are slightly wider when things get really
-    // small and thus we enforce a different minimum width.
-    BOOL isPinned = [tab pinned];
-    if (isPinned) {
-      tabFrame.size.width = kPinnedTabWidth;
-    } else {
-      // Tabs have non-integer widths. Assign the integer part to the tab, and
-      // keep an accumulation of the fractional parts. When the fractional
-      // accumulation gets to be more than one pixel, assign that to the current
-      // tab being laid out. This is vaguely inspired by Bresenham's line
-      // algorithm.
-      tabFrame.size.width = nonPinnedTabWidth;
-      tabWidthAccumulatedFraction += nonPinnedTabWidthFraction;
-
-      if (tabWidthAccumulatedFraction >= 1.0) {
-        ++tabFrame.size.width;
-        --tabWidthAccumulatedFraction;
-      }
-
-      // In case of rounding error, give any left over pixels to the last tab.
-      if (laidOutNonPinnedTabs == numberOfNonPinnedTabs - 1 &&
-          tabWidthAccumulatedFraction > 0.5) {
-        ++tabFrame.size.width;
-      }
-
-      ++laidOutNonPinnedTabs;
-    }
-
-    if ([tab active])
-      tabFrame.size.width = MAX(tabFrame.size.width, kMinActiveTabWidth);
-
-    // If this is the first non-pinned tab, then add a bit of spacing between
-    // this and the last pinned tab.
-    if (!isPinned && isLastTabPinned) {
-      offset += kLastPinnedTabSpacing;
-      tabFrame.origin.x = offset;
-    }
-    isLastTabPinned = isPinned;
-
-    // Flip if in RTL mode.
-    tabFrame.origin.x =
-        FlipXInView(tabStripView_, tabFrame.size.width, tabFrame.origin.x);
-
-    if (laidOutNonPinnedTabs > numberOfNonPinnedTabs) {
-      // There is not enough space to fit this tab.
-      tabFrame.size.width = 0;
-      [self setFrame:tabFrame ofTabView:[tab view]];
-      continue;
-    }
-
-    // Animate a new tab in by putting it below the horizon unless told to put
-    // it in a specific location (i.e., from a drop).
-    if (newTab && visible && animate) {
-      if (NSEqualRects(droppedTabFrame_, NSZeroRect)) {
-        [[tab view] setFrame:NSOffsetRect(tabFrame, 0, -NSHeight(tabFrame))];
-      } else {
-        [[tab view] setFrame:droppedTabFrame_];
-        droppedTabFrame_ = NSZeroRect;
-      }
-    }
-
-    // Check the frame by identifier to avoid redundant calls to animator.
-    id frameTarget = visible && animate ? [[tab view] animator] : [tab view];
-    NSValue* identifier = [NSValue valueWithPointer:[tab view]];
-    NSValue* oldTargetValue = [targetFrames_ objectForKey:identifier];
-    if (!oldTargetValue ||
-        !NSEqualRects([oldTargetValue rectValue], tabFrame)) {
-      // Redraw the tab once it moves to its final location. Because we're
-      // using Core Animation, each tab caches its contents until told to
-      // redraw. Without forcing a redraw at the end of the move, tabs will
-      // display the wrong content when using a theme that creates transparent
-      // tabs.
-      ScopedNSAnimationContextGroup subAnimationGroup(animate);
-      subAnimationGroup.SetCurrentContextDuration(kTabAnimationDuration);
-      NSView* tabView = [tab view];
-      [[NSAnimationContext currentContext] setCompletionHandler:^{
-        [tabView setNeedsDisplay:YES];
-      }];
-
-      [frameTarget setFrame:tabFrame];
-      [targetFrames_ setObject:[NSValue valueWithRect:tabFrame]
-                        forKey:identifier];
-    }
-
-    enclosingRect = NSUnionRect(tabFrame, enclosingRect);
-
-    offset += NSWidth(tabFrame);
-    offset -= kTabOverlap;
-  }
-
-  [dragBlockingView_ setFrame:enclosingRect];
-
-  // Mark that we've successfully completed layout of at least one tab.
-  initialLayoutComplete_ = YES;
-}
-
-// When we're told to layout from the public API we usually want to animate,
-// except when it's the first time.
-- (void)layoutTabs {
-  [self layoutTabsWithAnimation:initialLayoutComplete_ regenerateSubviews:YES];
-}
-
-- (void)layoutTabsWithoutAnimation {
-  [self layoutTabsWithAnimation:NO regenerateSubviews:YES];
-}
-
-// Handles setting the title of the tab based on the given |contents|. Uses
-// a canned string if |contents| is NULL.
-- (void)setTabTitle:(TabControllerCocoa*)tab
-       withContents:(WebContents*)contents {
-  base::string16 title;
-  if (contents)
-    title = TabUIHelper::FromWebContents(contents)->GetTitle();
-  [tab setTitle:base::SysUTF16ToNSString(title)];
-
-  NSString* toolTip = base::SysUTF16ToNSString(chrome::AssembleTabTooltipText(
-      title, [self alertStateForContents:contents]));
-  [tab setToolTip:toolTip];
-  if ([tab tabView] == hoveredTab_)
-    [toolTipView_ setToolTip:toolTip];
-}
-
-// Called when a notification is received from the model to insert a new tab
-// at |modelIndex|.
-- (void)insertTabWithContents:(content::WebContents*)contents
-                      atIndex:(NSInteger)modelIndex
-                 inForeground:(bool)inForeground {
-  DCHECK(contents);
-  DCHECK(modelIndex == TabStripModel::kNoTab ||
-         tabStripModel_->ContainsIndex(modelIndex));
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  // Make a new tab. Load the contents of this tab from the nib and associate
-  // the new controller with |contents| so it can be looked up later.
-  base::scoped_nsobject<TabContentsController> contentsController(
-      [[TabContentsController alloc]
-          initWithContents:contents
-                   isPopup:browser_->is_type_popup()]);
-  [tabContentsArray_ insertObject:contentsController atIndex:index];
-
-  // Make a new tab and add it to the strip. Keep track of its controller.
-  TabControllerCocoa* newController = [self newTab];
-  [newController setPinned:tabStripModel_->IsTabPinned(modelIndex)];
-  [newController setUrl:contents->GetURL()];
-  [tabArray_ insertObject:newController atIndex:index];
-  NSView* newView = [newController view];
-
-  // Set the originating frame to just below the strip so that it animates
-  // upwards as it's being initially layed out. Oddly, this works while doing
-  // something similar in |-layoutTabs| confuses the window server.
-  [newView setFrame:NSOffsetRect([newView frame],
-                                 0, -[[self class] defaultTabHeight])];
-
-  [self setTabTitle:newController withContents:contents];
-
-  // If a tab is being inserted, we can again use the entire tab strip width
-  // for layout.
-  availableResizeWidth_ = kUseFullAvailableWidth;
-
-  // We don't need to call |-layoutTabs| if the tab will be in the foreground
-  // because it will get called when the new tab is selected by the tab model.
-  // Whenever |-layoutTabs| is called, it'll also add the new subview.
-  if (!inForeground) {
-    [self layoutTabs];
-  }
-
-  // During normal loading, we won't yet have a favicon and we'll get
-  // subsequent state change notifications to show the throbber, but when we're
-  // dragging a tab out into a new window, we have to put the tab's favicon
-  // into the right state up front as we won't be told to do it from anywhere
-  // else.
-  [self updateIconsForContents:contents atIndex:modelIndex];
-
-  [delegate_ onTabInsertedWithContents:contents inForeground:inForeground];
-}
-
-// Called when a notification is received from the model to close the tab with
-// the WebContents.
-- (void)tabClosingWithContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)index {
-  wasHidingThrobberSet_.erase(contents);
-}
-
-// Called before |contents| is deactivated.
-- (void)tabDeactivatedWithContents:(content::WebContents*)contents {
-  contents->StoreFocus();
-}
-
-// Called when a notification is received from the model to select a particular
-// tab. Swaps in the toolbar and content area associated with |newContents|.
-- (void)activateTabWithContents:(content::WebContents*)newContents
-               previousContents:(content::WebContents*)oldContents
-                        atIndex:(NSInteger)modelIndex
-                         reason:(int)reason {
-  // It's possible for |newContents| to be null when the final tab in a tab
-  // strip is closed.
-  if (newContents && modelIndex != TabStripModel::kNoTab)
-    TabUIHelper::FromWebContents(newContents)->set_was_active_at_least_once();
-
-  // Take closing tabs into account.
-  if (oldContents) {
-    for (TabContentsController* controller in tabContentsArray_.get()) {
-      if (controller.webContents == oldContents) {
-        [controller willBecomeUnselectedTab];
-      }
-    }
-  }
-
-  NSUInteger activeIndex = [self indexFromModelIndex:modelIndex];
-
-  [tabArray_ enumerateObjectsUsingBlock:^(TabControllerCocoa* current,
-                                          NSUInteger index, BOOL* stop) {
-    [current setActive:index == activeIndex];
-    [self updateIconsForContents:newContents atIndex:modelIndex];
-  }];
-
-  // Tell the new tab contents it is about to become the selected tab. Here it
-  // can do things like make sure the toolbar is up to date.
-  TabContentsController* newController =
-      [tabContentsArray_ objectAtIndex:activeIndex];
-  [newController willBecomeSelectedTab];
-
-  // Relayout for new tabs and to let the selected tab grow to be larger in
-  // size than surrounding tabs if the user has many. This also raises the
-  // selected tab to the top.
-  [self layoutTabs];
-
-  // Swap in the contents for the new tab.
-  [self swapInTabAtIndex:modelIndex];
-
-  if (newContents)
-    newContents->RestoreFocus();
-}
-
-- (void)tabSelectionChanged {
-  // First get the vector of indices, which is allays sorted in ascending order.
-  ui::ListSelectionModel::SelectedIndices selection(
-      tabStripModel_->selection_model().selected_indices());
-  // Iterate through all of the tabs, selecting each as necessary.
-  ui::ListSelectionModel::SelectedIndices::iterator iter = selection.begin();
-  int i = 0;
-  for (TabControllerCocoa* current in tabArray_.get()) {
-    BOOL selected = iter != selection.end() &&
-        [self indexFromModelIndex:*iter] == i;
-    [current setSelected:selected];
-    [self updateIconsForContents:tabStripModel_->GetWebContentsAt(i) atIndex:i];
-    if (selected)
-      ++iter;
-    ++i;
-  }
-}
-
-- (void)tabReplacedWithContents:(content::WebContents*)newContents
-               previousContents:(content::WebContents*)oldContents
-                        atIndex:(NSInteger)modelIndex {
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-  TabContentsController* oldController =
-      [tabContentsArray_ objectAtIndex:index];
-  DCHECK_EQ(oldContents, [oldController webContents]);
-
-  // Simply create a new TabContentsController for |newContents| and place it
-  // into the array, replacing |oldContents|.  An ActiveTabChanged notification
-  // will follow, at which point we will install the new view.
-  base::scoped_nsobject<TabContentsController> newController(
-      [[TabContentsController alloc]
-          initWithContents:newContents
-                   isPopup:browser_->is_type_popup()]);
-
-  // Bye bye, |oldController|.
-  [tabContentsArray_ replaceObjectAtIndex:index withObject:newController];
-
-  // Fake a tab changed notification to force tab titles and favicons to update.
-  [self tabChangedWithContents:newContents
-                       atIndex:modelIndex
-                    changeType:TabChangeType::kAll];
-}
-
-// Remove all knowledge about this tab and its associated controller, and remove
-// the view from the strip.
-- (void)removeTab:(TabControllerCocoa*)controller {
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  NSUInteger index = [tabArray_ indexOfObject:controller];
-
-  // Release the tab contents controller so those views get destroyed. This
-  // will remove all the tab content Cocoa views from the hierarchy. A
-  // subsequent "select tab" notification will follow from the model. To
-  // tell us what to swap in in its absence.
-  [tabContentsArray_ removeObjectAtIndex:index];
-
-  // Remove the view from the tab strip.
-  NSView* tab = [controller view];
-  [tab removeFromSuperview];
-
-  // Remove ourself as an observer.
-  [[NSNotificationCenter defaultCenter]
-      removeObserver:self
-                name:NSViewDidUpdateTrackingAreasNotification
-              object:tab];
-
-  // Clear the tab controller's target.
-  // TODO(viettrungluu): [crbug.com/23829] Find a better way to handle the tab
-  // controller's target.
-  [controller setTarget:nil];
-
-  if ([hoveredTab_ isEqual:tab])
-    [self setHoveredTab:nil];
-
-  NSValue* identifier = [NSValue valueWithPointer:tab];
-  [targetFrames_ removeObjectForKey:identifier];
-
-  // Once we're totally done with the tab, delete its controller
-  [tabArray_ removeObjectAtIndex:index];
-}
-
-// Called by the CAAnimation delegate when the tab completes the closing
-// animation.
-- (void)animationDidStop:(CAAnimation*)animation
-           forController:(TabControllerCocoa*)controller
-                finished:(BOOL)finished {
-  [(TabCloseAnimationDelegate *)[animation delegate] invalidate];
-  [closingControllers_ removeObject:controller];
-  [self removeTab:controller];
-}
-
-// Save off which TabControllerCocoa is closing and tell its view's animator
-// where to move the tab to. Registers a delegate to call back when the
-// animation is complete in order to remove the tab from the model.
-- (void)startClosingTabWithAnimation:(TabControllerCocoa*)closingTab {
-  DCHECK([NSThread isMainThread]);
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  // Save off the controller into the set of animating tabs. This alerts
-  // the layout method to not do anything with it and allows us to correctly
-  // calculate offsets when working with indices into the model.
-  [closingControllers_ addObject:closingTab];
-
-  // Mark the tab as closing. This prevents it from generating any drags or
-  // selections while it's animating closed.
-  [[closingTab tabView] setClosing:YES];
-
-  // Register delegate (owned by the animation system).
-  NSView* tabView = [closingTab view];
-  CAAnimation* animation = [[tabView animationForKey:@"frameOrigin"] copy];
-  [animation autorelease];
-  base::scoped_nsobject<TabCloseAnimationDelegate> delegate(
-      [[TabCloseAnimationDelegate alloc] initWithTabStrip:self
-                                            tabController:closingTab]);
-  [animation setDelegate:delegate.get()];  // Retains delegate.
-  NSMutableDictionary* animationDictionary =
-      [NSMutableDictionary dictionaryWithDictionary:[tabView animations]];
-  [animationDictionary setObject:animation forKey:@"frameOrigin"];
-  [tabView setAnimations:animationDictionary];
-
-  // Periscope down! Animate the tab.
-  NSRect newFrame = [tabView frame];
-  newFrame = NSOffsetRect(newFrame, 0, -newFrame.size.height);
-  ScopedNSAnimationContextGroup animationGroup(true);
-  animationGroup.SetCurrentContextDuration(kTabAnimationDuration);
-  [[tabView animator] setFrame:newFrame];
-}
-
-// Called when a notification is received from the model that the given tab
-// has gone away. Start an animation then force a layout to put everything
-// in motion.
-- (void)tabDetachedWithContents:(content::WebContents*)contents
-                        atIndex:(NSInteger)modelIndex {
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  TabControllerCocoa* tab = [tabArray_ objectAtIndex:index];
-  if (tabStripModel_->count() > 0) {
-    [self startClosingTabWithAnimation:tab];
-    [self layoutTabs];
-  } else {
-    // Don't remove the tab, as that makes the window look jarring without any
-    // tabs. Instead, simply mark it as closing to prevent the tab from
-    // generating any drags or selections.
-    [[tab tabView] setClosing:YES];
-  }
-
-  [delegate_ onTabDetachedWithContents:contents];
-}
-
-// A helper routine for creating an NSImageView to hold the favicon or app icon
-// for |contents|.
-- (NSImage*)iconImageForContents:(content::WebContents*)contents
-                         atIndex:(NSInteger)modelIndex {
-  extensions::TabHelper* extensions_tab_helper =
-      extensions::TabHelper::FromWebContents(contents);
-  BOOL isApp = extensions_tab_helper->is_app();
-  NSImage* image = nil;
-  // Favicons come from the renderer, and the renderer draws everything in the
-  // system color space.
-  CGColorSpaceRef colorSpace = base::mac::GetSystemColorSpace();
-  if (isApp) {
-    SkBitmap* icon = extensions_tab_helper->GetExtensionAppIcon();
-    if (icon)
-      image = skia::SkBitmapToNSImageWithColorSpace(*icon, colorSpace);
-  } else {
-    TabControllerCocoa* tab = [tabArray_ objectAtIndex:modelIndex];
-    image = mac::FaviconForWebContents(contents, [[tab tabView] iconColor]);
-  }
-
-  // Either we don't have a valid favicon or there was some issue converting it
-  // from an SkBitmap. Either way, just show the default.
-  if (!image)
-    image = defaultFavicon_.get();
-
-  return image;
-}
-
-// Updates the current loading state, replacing the icon view with a favicon,
-// a throbber, the default icon, or nothing at all.
-- (void)updateIconsForContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)modelIndex {
-  if (!contents)
-    return;
-
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-  TabControllerCocoa* tabController = [tabArray_ objectAtIndex:index];
-  TabUIHelper* tabUIHelper = TabUIHelper::FromWebContents(contents);
-
-  bool oldShowIcon = [tabController showIcon];
-  bool tabIsCrashed = contents->IsCrashed();
-  bool showIcon = favicon::ShouldDisplayFavicon(contents) || tabIsCrashed ||
-                  tabStripModel_->IsTabPinned(modelIndex);
-
-  TabLoadingState oldLoadingState = [tabController loadingState];
-  TabLoadingState newLoadingState = kTabDone;
-  if (tabIsCrashed) {
-    newLoadingState = kTabCrashed;
-  } else if (contents->IsWaitingForResponse()) {
-    newLoadingState = kTabWaiting;
-  } else if (contents->IsLoadingToDifferentDocument()) {
-    newLoadingState = kTabLoading;
-  }
-
-  // Use TabUIHelper to determine if we would like to hide the throbber and
-  // override the favicon. We want to hide the throbber for 2 cases. 1) when a
-  // new tab is opened in the background and its initial navigation is delayed,
-  // and 2) when a tab is created by session restore. For the 1st one, there is
-  // no favicon available when the WebContents' initial navigation is delayed.
-  // So TabUIHelper will fetch the favicon from history if available and use
-  // that. For the 2nd case, TabUIhelper will return an empty favicon, so the
-  // WebContents' favicon is used.
-  NSImage* newImage = nil;
-  if (tabUIHelper->ShouldHideThrobber()) {
-    wasHidingThrobberSet_.insert(contents);
-
-    gfx::Image favicon = tabUIHelper->GetFavicon();
-    newImage = favicon.IsEmpty()
-                   ? [self iconImageForContents:contents atIndex:modelIndex]
-                   : favicon.AsNSImage();
-  } else if (base::ContainsKey(wasHidingThrobberSet_, contents) ||
-             newLoadingState == kTabDone ||
-             oldLoadingState != newLoadingState || oldShowIcon != showIcon) {
-    wasHidingThrobberSet_.erase(contents);
-
-    if (showIcon && newLoadingState == kTabDone) {
-      newImage = [self iconImageForContents:contents atIndex:modelIndex];
-    }
-  }
-
-  [tabController setIconImage:newImage
-              forLoadingState:newLoadingState
-                     showIcon:showIcon];
-
-  TabAlertState alertState = [self alertStateForContents:contents];
-  [self updateWindowAlertState:alertState forWebContents:contents];
-  [tabController setAlertState:alertState];
-
-  [tabController updateVisibility];
-}
-
-// Called when a notification is received from the model that the given tab
-// has been updated. |loading| will be YES when we only want to update the
-// throbber state, not anything else about the (partially) loading tab.
-- (void)tabChangedWithContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)modelIndex
-                    changeType:(TabChangeType)change {
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  if (modelIndex == tabStripModel_->active_index())
-    [delegate_ onTabChanged:change withContents:contents];
-
-  TabControllerCocoa* tabController = [tabArray_ objectAtIndex:index];
-
-  if (change != TabChangeType::kLoadingOnly)
-    [self setTabTitle:tabController withContents:contents];
-
-  [self updateIconsForContents:contents atIndex:modelIndex];
-
-  TabContentsController* updatedController =
-      [tabContentsArray_ objectAtIndex:index];
-  [updatedController tabDidChange:contents];
-}
-
-// Called when a tab is moved (usually by drag&drop). Keep our parallel arrays
-// in sync with the tab strip model. It can also be pinned/unpinned
-// simultaneously, so we need to take care of that.
-- (void)tabMovedWithContents:(content::WebContents*)contents
-                   fromIndex:(NSInteger)modelFrom
-                     toIndex:(NSInteger)modelTo {
-  // Take closing tabs into account.
-  NSInteger from = [self indexFromModelIndex:modelFrom];
-  NSInteger to = [self indexFromModelIndex:modelTo];
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  base::scoped_nsobject<TabContentsController> movedTabContentsController(
-      [[tabContentsArray_ objectAtIndex:from] retain]);
-  [tabContentsArray_ removeObjectAtIndex:from];
-  [tabContentsArray_ insertObject:movedTabContentsController.get()
-                          atIndex:to];
-  base::scoped_nsobject<TabControllerCocoa> movedTabController(
-      base::mac::ObjCCastStrict<TabControllerCocoa>(
-          [[tabArray_ objectAtIndex:from] retain]));
-  [tabArray_ removeObjectAtIndex:from];
-  [tabArray_ insertObject:movedTabController.get() atIndex:to];
-
-  // The tab moved, which means that the pinned tab state may have changed.
-  if (tabStripModel_->IsTabPinned(modelTo) != [movedTabController pinned])
-    [self tabPinnedStateChangedWithContents:contents atIndex:modelTo];
-
-  [self layoutTabs];
-}
-
-// Called when a tab is pinned or unpinned without moving.
-- (void)tabPinnedStateChangedWithContents:(content::WebContents*)contents
-                                atIndex:(NSInteger)modelIndex {
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  TabControllerCocoa* tabController =
-      base::mac::ObjCCastStrict<TabControllerCocoa>(
-          [tabArray_ objectAtIndex:index]);
-
-  // Don't do anything if the change was already picked up by the move event.
-  if (tabStripModel_->IsTabPinned(modelIndex) == [tabController pinned])
-    return;
-
-  [tabController setPinned:tabStripModel_->IsTabPinned(modelIndex)];
-  [tabController setUrl:contents->GetURL()];
-  [self updateIconsForContents:contents atIndex:modelIndex];
-  // If the tab is being restored and it's pinned, the pinned state is set after
-  // the tab has already been rendered, so re-layout the tabstrip. In all other
-  // cases, the state is set before the tab is rendered so this isn't needed.
-  [self layoutTabs];
-}
-
-- (void)tabBlockedStateChangedWithContents:(content::WebContents*)contents
-                                   atIndex:(NSInteger)modelIndex {
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  TabControllerCocoa* tabController =
-      base::mac::ObjCCastStrict<TabControllerCocoa>(
-          [tabArray_ objectAtIndex:index]);
-
-  [tabController setBlocked:tabStripModel_->IsTabBlocked(modelIndex)];
-}
-
-- (void)tabAtIndex:(NSInteger)modelIndex needsAttention:(bool)attention {
-  // Take closing tabs into account.
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-
-  TabControllerCocoa* tabController =
-      base::mac::ObjCCastStrict<TabControllerCocoa>(
-          [tabArray_ objectAtIndex:index]);
-
-  [tabController setNeedsAttention:attention];
-}
-
-- (void)setFrame:(NSRect)frame ofTabView:(NSView*)view {
-  NSValue* identifier = [NSValue valueWithPointer:view];
-  [targetFrames_ setObject:[NSValue valueWithRect:frame]
-                    forKey:identifier];
-  [view setFrame:frame];
-}
-
-- (TabStripModel*)tabStripModel {
-  return tabStripModel_;
-}
-
-- (NSArray*)tabViews {
-  NSMutableArray* views = [NSMutableArray arrayWithCapacity:[tabArray_ count]];
-  for (TabControllerCocoa* tab in tabArray_.get()) {
-    [views addObject:[tab tabView]];
-  }
-  return views;
-}
-
-- (NSView*)activeTabView {
-  int activeIndex = tabStripModel_->active_index();
-  // Take closing tabs into account. They can't ever be selected.
-  activeIndex = [self indexFromModelIndex:activeIndex];
-  return [self viewAtIndex:activeIndex];
-}
-
-- (int)indexOfPlaceholder {
-  // Use |tabArray_| here instead of the tab strip count in order to get the
-  // correct index when there are closing tabs to the left of the placeholder.
-  const int count = [tabArray_ count];
-
-  // No placeholder, return the end of the strip.
-  if (placeholderTab_ == nil)
-    return count;
-  BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-  double placeholderX =
-      isRTL ? NSMaxX(placeholderFrame_) : placeholderFrame_.origin.x;
-  int index = 0;
-  int location = 0;
-  while (index < count) {
-    // Ignore closing tabs for simplicity. The only drawback of this is that
-    // if the placeholder is placed right before one or several contiguous
-    // currently closing tabs, the associated TabControllerCocoa will start at
-    // the end of the closing tabs.
-    if ([closingControllers_ containsObject:[tabArray_ objectAtIndex:index]]) {
-      index++;
-      continue;
-    }
-    NSView* curr = [self viewAtIndex:index];
-    // The placeholder tab works by changing the frame of the tab being dragged
-    // to be the bounds of the placeholder, so we need to skip it while we're
-    // iterating, otherwise we'll end up off by one.  Note This only effects
-    // dragging to the right, not to the left.
-    if (curr == placeholderTab_) {
-      index++;
-      continue;
-    }
-    if (isRTL ? placeholderX >= NSMaxX([curr frame])
-              : placeholderX <= NSMinX([curr frame]))
-      break;
-    index++;
-    location++;
-  }
-  return location;
-}
-
-// Move the given tab at index |from| in this window to the location of the
-// current placeholder.
-- (void)moveTabFromIndex:(NSInteger)from {
-  int toIndex = [self indexOfPlaceholder];
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-  tabStripModel_->MoveWebContentsAt(from, toIndex, true);
-}
-
-// Drop a given WebContents at the location of the current placeholder.
-// If there is no placeholder, it will go at the end. Used when dragging from
-// another window when we don't have access to the WebContents as part of our
-// strip. |frame| is in the coordinate system of the tab strip view and
-// represents where the user dropped the new tab so it can be animated into its
-// correct location when the tab is added to the model. If the tab was pinned in
-// its previous window, setting |pinned| to YES will propagate that state to the
-// new window. Pinned tabs are pinned tabs; the |pinned| state is the caller's
-// responsibility.
-- (void)dropWebContents:(WebContents*)contents
-                atIndex:(int)modelIndex
-              withFrame:(NSRect)frame
-            asPinnedTab:(BOOL)pinned
-               activate:(BOOL)activate {
-  // Mark that the new tab being created should start at |frame|. It will be
-  // reset as soon as the tab has been positioned.
-  droppedTabFrame_ = frame;
-
-  // Insert it into this tab strip. We want it in the foreground and to not
-  // inherit the current tab's group.
-  tabStripModel_->InsertWebContentsAt(
-      modelIndex, base::WrapUnique(contents),
-      (activate ? TabStripModel::ADD_ACTIVE : TabStripModel::ADD_NONE) |
-          (pinned ? TabStripModel::ADD_PINNED : TabStripModel::ADD_NONE));
-}
-
-// Called when the tab strip view changes size. As we only registered for
-// changes on our view, we know it's only for our view. Layout w/out
-// animations since they are blocked by the resize nested runloop. We need
-// the views to adjust immediately. Neither the tabs nor their z-order are
-// changed, so we don't need to update the subviews.
-- (void)tabViewFrameChanged:(NSNotification*)info {
-  [self layoutTabsWithAnimation:NO regenerateSubviews:NO];
-}
-
-// Called when the tracking areas for any given tab are updated. This allows
-// the individual tabs to update their hover states correctly.
-// Only generates the event if the cursor is in the tab strip.
-- (void)tabUpdateTracking:(NSNotification*)notification {
-  DCHECK([[notification object] isKindOfClass:[TabViewCocoa class]]);
-  DCHECK(mouseInside_);
-  NSWindow* window = [tabStripView_ window];
-  NSPoint location = [window mouseLocationOutsideOfEventStream];
-  if (NSPointInRect(location, [tabStripView_ frame])) {
-    NSEvent* mouseEvent = [NSEvent mouseEventWithType:NSMouseMoved
-                                             location:location
-                                        modifierFlags:0
-                                            timestamp:0
-                                         windowNumber:[window windowNumber]
-                                              context:nil
-                                          eventNumber:0
-                                           clickCount:0
-                                             pressure:0];
-    [self mouseMoved:mouseEvent];
-  }
-}
-
-- (BOOL)inRapidClosureMode {
-  return availableResizeWidth_ != kUseFullAvailableWidth;
-}
-
-// Disable tab dragging when there are any pending animations.
-- (BOOL)tabDraggingAllowed {
-  return [closingControllers_ count] == 0;
-}
-
-- (void)mouseMoved:(NSEvent*)event {
-  // We don't want the dragged tab to repeatedly redraw its glow unnecessarily.
-  // We also want the dragged tab to keep the glow even when it slides behind
-  // another tab.
-  if ([dragController_ draggedTab])
-    return;
-
-  // Use hit test to figure out what view we are hovering over.
-  NSView* targetView = [tabStripView_ hitTest:[event locationInWindow]];
-
-  TabViewCocoa* tabView = base::mac::ObjCCast<TabViewCocoa>(targetView);
-  if (!tabView)
-    tabView = base::mac::ObjCCast<TabViewCocoa>([targetView superview]);
-
-  if (hoveredTab_ != tabView) {
-    [self setHoveredTab:tabView];
-  } else {
-    [hoveredTab_ mouseMoved:event];
-  }
-}
-
-- (void)mouseEntered:(NSEvent*)event {
-  NSTrackingArea* area = [event trackingArea];
-  if ([area isEqual:trackingArea_]) {
-    mouseInside_ = YES;
-    [self setTabTrackingAreasEnabled:YES];
-    [self mouseMoved:event];
-  } else if ([area isEqual:customWindowControlsTrackingArea_]) {
-    [customWindowControls_ setMouseInside:YES];
-  }
-}
-
-// Called when the tracking area is in effect which means we're tracking to
-// see if the user leaves the tab strip with their mouse. When they do,
-// reset layout to use all available width.
-- (void)mouseExited:(NSEvent*)event {
-  NSTrackingArea* area = [event trackingArea];
-  if ([area isEqual:trackingArea_]) {
-    mouseInside_ = NO;
-    [self setTabTrackingAreasEnabled:NO];
-    availableResizeWidth_ = kUseFullAvailableWidth;
-    [self setHoveredTab:nil];
-    [self layoutTabs];
-  } else if ([area isEqual:customWindowControlsTrackingArea_]) {
-    [customWindowControls_ setMouseInside:NO];
-  }
-}
-
-- (TabViewCocoa*)hoveredTab {
-  return hoveredTab_;
-}
-
-- (void)setHoveredTab:(TabViewCocoa*)newHoveredTab {
-  if (hoveredTab_) {
-    [hoveredTab_ mouseExited:nil];
-    [toolTipView_ setFrame:NSZeroRect];
-  }
-
-  hoveredTab_ = newHoveredTab;
-
-  if (newHoveredTab) {
-    [newHoveredTab mouseEntered:nil];
-
-    // Use a transparent subview to show the hovered tab's tooltip while the
-    // mouse pointer is inside the tab's custom shape.
-    if (!toolTipView_)
-      toolTipView_.reset([[NSView alloc] init]);
-    [toolTipView_ setToolTip:[newHoveredTab toolTipText]];
-    [toolTipView_ setFrame:[newHoveredTab frame]];
-    if (![toolTipView_ superview]) {
-      [tabStripView_ addSubview:toolTipView_
-                     positioned:NSWindowAbove
-                     relativeTo:dragBlockingView_];
-    }
-  }
-}
-
-// Enable/Disable the tracking areas for the tabs. They are only enabled
-// when the mouse is in the tabstrip.
-- (void)setTabTrackingAreasEnabled:(BOOL)enabled {
-  NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
-  for (TabControllerCocoa* controller in tabArray_.get()) {
-    TabViewCocoa* tabView = [controller tabView];
-    if (enabled) {
-      // Set self up to observe tabs so hover states will be correct.
-      [defaultCenter addObserver:self
-                        selector:@selector(tabUpdateTracking:)
-                            name:NSViewDidUpdateTrackingAreasNotification
-                          object:tabView];
-    } else {
-      [defaultCenter removeObserver:self
-                               name:NSViewDidUpdateTrackingAreasNotification
-                             object:tabView];
-    }
-    [tabView setTrackingEnabled:enabled];
-  }
-}
-
-// Adds the given subview to (the end of) the list of permanent subviews
-// (specified from bottom up). These subviews will always be below the
-// transitory subviews (tabs). |-regenerateSubviewList| must be called to
-// effectuate the addition.
-- (void)addSubviewToPermanentList:(NSView*)aView {
-  if (aView)
-    [permanentSubviews_ addObject:aView];
-}
-
-// Update the subviews, keeping the permanent ones (or, more correctly, putting
-// in the ones listed in permanentSubviews_), and putting in the current tabs in
-// the correct z-order. Any current subviews which is neither in the permanent
-// list nor a (current) tab will be removed. So if you add such a subview, you
-// should call |-addSubviewToPermanentList:| (or better yet, call that and then
-// |-regenerateSubviewList| to actually add it).
-- (void)regenerateSubviewList {
-  // Remove self as an observer from all the old tabs before a new set of
-  // potentially different tabs is put in place.
-  [self setTabTrackingAreasEnabled:NO];
-
-  // Subviews to put in (in bottom-to-top order), beginning with the permanent
-  // ones.
-  NSMutableArray* subviews = [NSMutableArray arrayWithArray:permanentSubviews_];
-
-  NSView* activeTabView = nil;
-  // Go through tabs in reverse order, since |subviews| is bottom-to-top.
-  for (TabControllerCocoa* tab in [tabArray_ reverseObjectEnumerator]) {
-    NSView* tabView = [tab view];
-    if ([tab active]) {
-      DCHECK(!activeTabView);
-      activeTabView = tabView;
-    } else {
-      [subviews addObject:tabView];
-    }
-  }
-  if (activeTabView) {
-    [subviews addObject:activeTabView];
-  }
-  WithNoAnimation noAnimation;
-  [tabStripView_ setSubviews:subviews];
-  [self setTabTrackingAreasEnabled:mouseInside_];
-}
-
-// Get the index and disposition for a potential URL(s) drop given a point (in
-// the |TabStripView|'s coordinates). It considers only the x-coordinate of the
-// given point. If it's in the "middle" of a tab, it drops on that tab. If it's
-// to the left, it inserts to the left, and similarly for the right.
-- (void)droppingURLsAt:(NSPoint)point
-            givesIndex:(NSInteger*)index
-           disposition:(WindowOpenDisposition*)disposition
-           activateTab:(BOOL)activateTab {
-  // Proportion of the tab which is considered the "middle" (and causes things
-  // to drop on that tab).
-  const double kMiddleProportion = 0.5;
-  const double kLRProportion = (1.0 - kMiddleProportion) / 2.0;
-  const CGFloat kTabOverlap = [TabStripControllerCocoa tabOverlap];
-
-  DCHECK(index && disposition);
-  NSInteger i = 0;
-  BOOL isRTL = cocoa_l10n_util::ShouldDoExperimentalRTLLayout();
-  for (TabControllerCocoa* tab in tabArray_.get()) {
-    TabViewCocoa* view = base::mac::ObjCCastStrict<TabViewCocoa>([tab view]);
-
-    // Recall that |-[NSView frame]| is in its superview's coordinates, so a
-    // |TabViewCocoa|'s frame is in the coordinates of the |TabStripView| (which
-    // matches the coordinate system of |point|).
-    NSRect frame = [view frame];
-
-    // Modify the frame to make it "unoverlapped".
-    frame.origin.x += kTabOverlap / 2.0;
-    frame.size.width -= kTabOverlap;
-    if (frame.size.width < 1.0)
-      frame.size.width = 1.0;  // try to avoid complete failure
-
-    CGFloat rightEdge = NSMaxX(frame) - kLRProportion * frame.size.width;
-    CGFloat leftEdge = frame.origin.x + kLRProportion * frame.size.width;
-
-    // Drop in a new tab before  tab |i|?
-    if (isRTL ? point.x > rightEdge : point.x < leftEdge) {
-      *index = i;
-      if (activateTab) {
-        *disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
-      } else {
-        *disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
-      }
-      return;
-    }
-
-    // Drop on tab |i|?
-    if (isRTL ? point.x >= leftEdge : point.x <= rightEdge) {
-      *index = i;
-      *disposition = WindowOpenDisposition::CURRENT_TAB;
-      return;
-    }
-
-    // (Dropping in a new tab to the right of tab |i| will be taken care of in
-    // the next iteration.)
-    i++;
-  }
-
-  // If we've made it here, we want to append a new tab to the end.
-  *index = -1;
-  if (activateTab) {
-    *disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
-  } else {
-    *disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
-  }
-}
-
-- (void)openURL:(GURL*)url
-         inView:(NSView*)view
-             at:(NSPoint)point
-    activateTab:(BOOL)activateTab {
-  // Security: Block JavaScript to prevent self-XSS.
-  if (url->SchemeIs(url::kJavaScriptScheme))
-    return;
-
-  // Get the index and disposition.
-  NSInteger index;
-  WindowOpenDisposition disposition;
-  [self droppingURLsAt:point
-            givesIndex:&index
-           disposition:&disposition
-           activateTab:activateTab];
-
-  // Either insert a new tab or open in a current tab.
-  switch (disposition) {
-    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
-    case WindowOpenDisposition::NEW_BACKGROUND_TAB: {
-      base::RecordAction(UserMetricsAction("Tab_DropURLBetweenTabs"));
-      NavigateParams params(browser_, *url, ui::PAGE_TRANSITION_TYPED);
-      params.disposition = disposition;
-      params.tabstrip_index = index;
-      params.tabstrip_add_types =
-          TabStripModel::ADD_ACTIVE | TabStripModel::ADD_FORCE_INDEX;
-      Navigate(&params);
-      break;
-    }
-    case WindowOpenDisposition::CURRENT_TAB: {
-      base::RecordAction(UserMetricsAction("Tab_DropURLOnTab"));
-      OpenURLParams params(*url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
-                           ui::PAGE_TRANSITION_TYPED, false);
-      tabStripModel_->GetWebContentsAt(index)->OpenURL(params);
-      tabStripModel_->ActivateTabAt(index, true);
-      break;
-    }
-    default:
-      NOTIMPLEMENTED();
-  }
-}
-
-// (URLDropTargetController protocol)
-- (void)dropURLs:(NSArray*)urls inView:(NSView*)view at:(NSPoint)point {
-  DCHECK_EQ(view, tabStripView_.get());
-
-  if ([urls count] < 1) {
-    NOTREACHED();
-    return;
-  }
-
-  for (NSInteger index = [urls count] - 1; index >= 0; index--) {
-    // Refactor this code.
-    // https://crbug.com/665261.
-    GURL url = url_formatter::FixupURL(
-        base::SysNSStringToUTF8([urls objectAtIndex:index]), std::string());
-
-    // If the URL isn't valid, don't bother.
-    if (!url.is_valid())
-      continue;
-
-    if (index == static_cast<NSInteger>([urls count]) - 1) {
-      [self openURL:&url inView:view at:point activateTab:YES];
-    } else {
-      [self openURL:&url inView:view at:point activateTab:NO];
-    }
-  }
-}
-
-// (URLDropTargetController protocol)
-- (void)dropText:(NSString*)text inView:(NSView*)view at:(NSPoint)point {
-  DCHECK_EQ(view, tabStripView_.get());
-
-  // If the input is plain text, classify the input and make the URL.
-  AutocompleteMatch match;
-  AutocompleteClassifierFactory::GetForProfile(browser_->profile())->Classify(
-      base::SysNSStringToUTF16(text), false, false,
-      metrics::OmniboxEventProto::BLANK, &match, NULL);
-  GURL url(match.destination_url);
-
-  [self openURL:&url inView:view at:point activateTab:YES];
-}
-
-// (URLDropTargetController protocol)
-- (void)indicateDropURLsInView:(NSView*)view at:(NSPoint)point {
-  DCHECK_EQ(view, tabStripView_.get());
-
-  // The minimum y-coordinate at which one should consider place the arrow.
-  const CGFloat arrowBaseY = 25;
-  const CGFloat kTabOverlap = [TabStripControllerCocoa tabOverlap];
-
-  NSInteger index;
-  WindowOpenDisposition disposition;
-  [self droppingURLsAt:point
-            givesIndex:&index
-           disposition:&disposition
-           activateTab:YES];
-
-  NSPoint arrowPos = NSMakePoint(0, arrowBaseY);
-  if (index == -1) {
-    // Append a tab at the end.
-    DCHECK(disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB);
-    NSInteger lastIndex = [tabArray_ count] - 1;
-    NSRect overRect = [[[tabArray_ objectAtIndex:lastIndex] view] frame];
-    if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) {
-      arrowPos.x = NSMinX(overRect) + kTabOverlap / 2.0;
-    } else {
-      arrowPos.x = NSMaxX(overRect) - kTabOverlap / 2.0;
-    }
-  } else {
-    NSRect overRect = [[[tabArray_ objectAtIndex:index] view] frame];
-    switch (disposition) {
-      case WindowOpenDisposition::NEW_FOREGROUND_TAB:
-        // Insert tab (before the given tab).
-        if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout()) {
-          arrowPos.x = NSMaxX(overRect) - kTabOverlap / 2.0;
-        } else {
-          arrowPos.x = NSMinX(overRect) + kTabOverlap / 2.0;
-        }
-        break;
-      case WindowOpenDisposition::CURRENT_TAB:
-        // Overwrite the given tab.
-        arrowPos.x = overRect.origin.x + overRect.size.width / 2.0;
-        break;
-      default:
-        NOTREACHED();
-    }
-  }
-
-  [tabStripView_ setDropArrowPosition:arrowPos];
-  [tabStripView_ setDropArrowShown:YES];
-  [tabStripView_ setNeedsDisplay:YES];
-
-  // Perform a delayed tab transition if hovering directly over a tab.
-  if (index != -1 && disposition == WindowOpenDisposition::CURRENT_TAB) {
-    NSInteger modelIndex = [self modelIndexFromIndex:index];
-    // Only start the transition if it has a valid model index (i.e. it's not
-    // in the middle of closing).
-    if (modelIndex != NSNotFound) {
-      hoverTabSelector_->StartTabTransition(modelIndex);
-      return;
-    }
-  }
-  // If a tab transition was not started, cancel the pending one.
-  hoverTabSelector_->CancelTabTransition();
-}
-
-// (URLDropTargetController protocol)
-- (void)hideDropURLsIndicatorInView:(NSView*)view {
-  DCHECK_EQ(view, tabStripView_.get());
-
-  // Cancel any pending tab transition.
-  hoverTabSelector_->CancelTabTransition();
-
-  if ([tabStripView_ dropArrowShown]) {
-    [tabStripView_ setDropArrowShown:NO];
-    [tabStripView_ setNeedsDisplay:YES];
-  }
-}
-
-// (URLDropTargetController protocol)
-- (BOOL)isUnsupportedDropData:(id<NSDraggingInfo>)info {
-  return drag_util::IsUnsupportedDropData(browser_->profile(), info);
-}
-
-- (TabContentsController*)activeTabContentsController {
-  int modelIndex = tabStripModel_->active_index();
-  if (modelIndex < 0)
-    return nil;
-  NSInteger index = [self indexFromModelIndex:modelIndex];
-  if (index < 0 ||
-      index >= (NSInteger)[tabContentsArray_ count])
-    return nil;
-  return [tabContentsArray_ objectAtIndex:index];
-}
-
-- (void)addCustomWindowControls {
-  BOOL shouldFlipWindowControls =
-      cocoa_l10n_util::ShouldFlipWindowControlsInRTL();
-  if (!customWindowControls_) {
-    // Make the container view.
-    CGFloat height = NSHeight([tabStripView_ frame]);
-    CGFloat width = [self leadingIndentForControls];
-    if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout() &&
-        !shouldFlipWindowControls)
-      // The trailing indent is correct in this case, since the controls should
-      // stay on the left.
-      width = [self trailingIndentForControls];
-    CGFloat xOrigin =
-        shouldFlipWindowControls ? NSWidth([tabStripView_ frame]) - width : 0;
-    NSRect frame = NSMakeRect(xOrigin, 0, width, height);
-    customWindowControls_.reset(
-        [[CustomWindowControlsView alloc] initWithFrame:frame]);
-    [customWindowControls_
-        setAutoresizingMask:shouldFlipWindowControls
-                                ? NSViewMinXMargin | NSViewHeightSizable
-                                : NSViewMaxXMargin | NSViewHeightSizable];
-
-    // Add the traffic light buttons. The horizontal layout was determined by
-    // manual inspection on Yosemite.
-    CGFloat closeButtonX = 11;
-    CGFloat pinnedButtonX = 31;
-    CGFloat zoomButtonX = 51;
-    if (shouldFlipWindowControls)
-      std::swap(closeButtonX, zoomButtonX);
-
-    NSUInteger styleMask = [[tabStripView_ window] styleMask];
-    NSButton* closeButton = [NSWindow standardWindowButton:NSWindowCloseButton
-                                              forStyleMask:styleMask];
-
-    // Vertically center the buttons in the tab strip.
-    CGFloat buttonY = floor((height - NSHeight([closeButton bounds])) / 2);
-    [closeButton setFrameOrigin:NSMakePoint(closeButtonX, buttonY)];
-    [customWindowControls_ addSubview:closeButton];
-
-    NSButton* miniaturizeButton =
-        [NSWindow standardWindowButton:NSWindowMiniaturizeButton
-                          forStyleMask:styleMask];
-    [miniaturizeButton setFrameOrigin:NSMakePoint(pinnedButtonX, buttonY)];
-    [miniaturizeButton setEnabled:NO];
-    [customWindowControls_ addSubview:miniaturizeButton];
-
-    NSButton* zoomButton =
-        [NSWindow standardWindowButton:NSWindowZoomButton
-                          forStyleMask:styleMask];
-    [customWindowControls_ addSubview:zoomButton];
-    [zoomButton setFrameOrigin:NSMakePoint(zoomButtonX, buttonY)];
-
-    customWindowControlsTrackingArea_.reset([[CrTrackingArea alloc]
-        initWithRect:[customWindowControls_ bounds]
-             options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways)
-               owner:self
-            userInfo:nil]);
-    [customWindowControls_
-        addTrackingArea:customWindowControlsTrackingArea_.get()];
-  }
-  if (shouldFlipWindowControls &&
-      NSMaxX([customWindowControls_ frame]) != NSMaxX([tabStripView_ frame])) {
-    NSRect frame = [customWindowControls_ frame];
-    frame.origin.x =
-        NSMaxX([tabStripView_ frame]) - [self leadingIndentForControls];
-    [customWindowControls_ setFrame:frame];
-  }
-  if (![permanentSubviews_ containsObject:customWindowControls_]) {
-    [self addSubviewToPermanentList:customWindowControls_];
-    [self regenerateSubviewList];
-  }
-}
-
-- (void)removeCustomWindowControls {
-  if (customWindowControls_)
-    [permanentSubviews_ removeObject:customWindowControls_];
-  [self regenerateSubviewList];
-  [customWindowControls_ setMouseInside:NO];
-}
-
-// Gets the tab and the alert state to check whether the window
-// alert state should be updated or not. If the tab alert state is
-// AUDIO_PLAYING, the window alert state should be set to AUDIO_PLAYING.
-// If the tab alert state is AUDIO_MUTING, this method would check if the
-// window has no other tab with state AUDIO_PLAYING, then the window
-// alert state will be set to AUDIO_MUTING. If the tab alert state is NONE,
-// this method checks if the window has no playing or muting tab, then window
-// alert state will be set as NONE.
-- (void)updateWindowAlertState:(TabAlertState)alertState
-                forWebContents:(content::WebContents*)selected {
-  NSWindow* window = [tabStripView_ window];
-  BrowserWindowController* windowController =
-      [BrowserWindowController browserWindowControllerForWindow:window];
-  if (alertState == TabAlertState::NONE) {
-    if (![self doesAnyOtherWebContents:selected
-                        haveAlertState:TabAlertState::AUDIO_PLAYING] &&
-        ![self doesAnyOtherWebContents:selected
-                        haveAlertState:TabAlertState::AUDIO_MUTING]) {
-      [windowController setAlertState:TabAlertState::NONE];
-    } else if ([self doesAnyOtherWebContents:selected
-                              haveAlertState:TabAlertState::AUDIO_MUTING]) {
-      [windowController setAlertState:TabAlertState::AUDIO_MUTING];
-    }
-  } else if (alertState == TabAlertState::AUDIO_MUTING) {
-    if (![self doesAnyOtherWebContents:selected
-                        haveAlertState:TabAlertState::AUDIO_PLAYING]) {
-      [windowController setAlertState:TabAlertState::AUDIO_MUTING];
-    }
-  } else {
-    [windowController setAlertState:alertState];
-  }
-}
-
-// Checks if tabs (excluding selected) has alert state equals to the second
-// parameter. It returns YES when it finds the first tab with the criterion.
-- (BOOL)doesAnyOtherWebContents:(content::WebContents*)selected
-                 haveAlertState:(TabAlertState)state {
-  const int existingTabCount = tabStripModel_->count();
-  for (int i = 0; i < existingTabCount; ++i) {
-    content::WebContents* currentContents = tabStripModel_->GetWebContentsAt(i);
-    if (selected == currentContents)
-      continue;
-    TabAlertState currentAlertStateForContents =
-        [self alertStateForContents:currentContents];
-    if (currentAlertStateForContents == state)
-      return YES;
-  }
-  return NO;
-}
-
-- (TabAlertState)alertStateForContents:(content::WebContents*)contents {
-  return chrome::GetTabAlertStateForContents(contents);
-}
-
-- (void)themeDidChangeNotification:(NSNotification*)notification {
-  for (int i = 0; i < tabStripModel_->count(); i++) {
-    [self updateIconsForContents:tabStripModel_->GetWebContentsAt(i) atIndex:i];
-  }
-}
-
-- (void)setVisualEffectsDisabledForFullscreen:(BOOL)fullscreen {
-  [tabStripView_ setVisualEffectsDisabledForFullscreen:fullscreen];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h b/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h
deleted file mode 100644
index 3e7eaaa..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h
+++ /dev/null
@@ -1,72 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_DRAG_CONTROLLER_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_DRAG_CONTROLLER_H_
-
-#import <Cocoa/Cocoa.h>
-#include <map>
-
-@class TabControllerCocoa;
-@class TabStripControllerCocoa;
-@class TabWindowController;
-
-////////////////////////////////////////////////////////////////////////////////
-
-// This protocol is used to carry mouse events to the TabStripDragController,
-// which manages the logic for actually dragging tabs.
-@protocol TabDraggingEventTarget
-
-// Initiates a dragging session with a mouseDown event. The tab controller
-// passed here is the one used for the rest of the dragging session.
-- (void)maybeStartDrag:(NSEvent*)event forTab:(TabControllerCocoa*)tab;
-
-@end
-
-////////////////////////////////////////////////////////////////////////////////
-
-// This controller is owned by the TabStripControllerCocoa and is used to
-// delegate all the logic for tab dragging from the TabViewCocoa's events.
-@interface TabStripDragController : NSObject<TabDraggingEventTarget> {
- @private
-  TabStripControllerCocoa* tabStrip_;  // Weak; owns this.
-
-  // These are released on mouseUp:
-  BOOL moveWindowOnDrag_;  // Set if the only tab of a window is dragged.
-  BOOL tabWasDragged_;  // Has the tab been dragged?
-  BOOL outOfTabHorizDeadZone_;   // Moved out of its horizontal dead zone?
-  BOOL draggingWithinTabStrip_;  // Did drag stay in the current tab strip?
-  BOOL chromeIsVisible_;
-
-  NSTimeInterval tearTime_;  // Time since tear happened
-  NSPoint tearOrigin_;  // Origin of the tear rect
-  NSPoint dragOrigin_;  // Origin point of the drag
-
-  TabWindowController* sourceController_;  // weak. controller starting the drag
-  NSWindow* sourceWindow_;  // Weak. The window starting the drag.
-  NSRect sourceWindowFrame_;
-  NSRect sourceTabFrame_;
-
-  TabControllerCocoa* draggedTab_;  // Weak. The tab controller being dragged.
-
-  TabWindowController* draggedController_;  // Weak. Controller being dragged.
-  NSWindow* dragWindow_;  // Weak. The window being dragged
-  NSWindow* dragOverlay_;  // Weak. The overlay being dragged
-
-  TabWindowController* targetController_;  // weak. Controller being targeted
-
-  CGFloat horizDragOffset_;
-}
-
-// The tab being dragged, or nil if not dragging a tab.
-@property(readonly) TabControllerCocoa* draggedTab;
-
-// Designated initializer.
-- (id)initWithTabStripController:(TabStripControllerCocoa*)controller;
-
-// TabDraggingEventTarget methods are also implemented.
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_DRAG_CONTROLLER_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
deleted file mode 100644
index ed8f882..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.mm
+++ /dev/null
@@ -1,601 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_drag_controller.h"
-
-#include <Carbon/Carbon.h>
-
-#include "base/mac/scoped_cftyperef.h"
-#import "base/mac/sdk_forward_declarations.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller_target.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
-#include "ui/base/cocoa/cocoa_base_utils.h"
-#include "ui/gfx/mac/scoped_cocoa_disable_screen_updates.h"
-
-constexpr CGFloat kHorizTearDistance = 10.0;  // Using the same value as Views.
-constexpr CGFloat kVertTearDistance = 20.0;
-constexpr CGFloat kLargeVertTearDistance = 100.0;
-constexpr NSTimeInterval kTearDuration = 0.333;
-
-// Returns whether |screenPoint| is inside the bounds of |view|.
-static BOOL PointIsInsideView(NSPoint screenPoint, NSView* view) {
-  if ([view window] == nil)
-    return NO;
-  NSPoint windowPoint =
-      ui::ConvertPointFromScreenToWindow([view window], screenPoint);
-  NSPoint viewPoint = [view convertPoint:windowPoint fromView:nil];
-  return [view mouse:viewPoint inRect:[view bounds]];
-}
-
-@interface TabStripDragController (Private)
-- (NSArray*)selectedTabViews;
-- (BOOL)canDragSelectedTabs;
-- (void)resetDragControllers;
-- (NSArray*)dropTargetsForController:(TabWindowController*)dragController;
-- (void)setWindowBackgroundVisibility:(BOOL)shouldBeVisible;
-- (void)endDrag:(NSEvent*)event;
-- (void)continueDrag:(NSEvent*)event;
-@end
-
-////////////////////////////////////////////////////////////////////////////////
-
-@implementation TabStripDragController
-
-@synthesize draggedTab = draggedTab_;
-
-- (id)initWithTabStripController:(TabStripControllerCocoa*)controller {
-  if ((self = [super init])) {
-    tabStrip_ = controller;
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [NSObject cancelPreviousPerformRequestsWithTarget:self];
-  [super dealloc];
-}
-
-- (void)maybeStartDrag:(NSEvent*)theEvent forTab:(TabControllerCocoa*)tab {
-  [self resetDragControllers];
-
-  // Resolve overlay back to original window.
-  sourceWindow_ = [[tab view] window];
-  if ([sourceWindow_ isKindOfClass:[NSPanel class]]) {
-    sourceWindow_ = [sourceWindow_ parentWindow];
-  }
-
-  sourceWindowFrame_ = [sourceWindow_ frame];
-  sourceTabFrame_ = [[tab view] frame];
-  sourceController_ =
-      [TabWindowController tabWindowControllerForWindow:sourceWindow_];
-  draggedTab_ = tab;
-  tabWasDragged_ = NO;
-  tearTime_ = 0.0;
-  draggingWithinTabStrip_ = YES;
-  chromeIsVisible_ = NO;
-
-  moveWindowOnDrag_ = ![self canDragSelectedTabs] ||
-                      ![sourceController_ tabDraggingAllowed];
-  // If we are dragging a tab, a window with a single tab should immediately
-  // snap off and not drag within the tab strip.
-  if (!moveWindowOnDrag_)
-    draggingWithinTabStrip_ = [sourceController_ numberOfTabs] > 1;
-
-  dragOrigin_ = [NSEvent mouseLocation];
-
-  // When spinning the event loop, a tab can get detached, which could lead to
-  // our own destruction. Keep ourselves around while spinning the loop as well
-  // as the tab controller being dragged.
-  base::scoped_nsobject<TabStripDragController> keepAlive([self retain]);
-  base::scoped_nsobject<TabControllerCocoa> keepAliveTab([tab retain]);
-
-  // Because we move views between windows, we need to handle the event loop
-  // ourselves. Ideally we should use the standard event loop.
-  while (1) {
-    const NSUInteger mask =
-        NSLeftMouseUpMask | NSLeftMouseDraggedMask | NSKeyUpMask;
-    theEvent =
-        [NSApp nextEventMatchingMask:mask
-                           untilDate:[NSDate distantFuture]
-                              inMode:NSDefaultRunLoopMode
-                             dequeue:YES];
-
-    // Ensure that any window changes that happen while handling this event
-    // appear atomically.
-    gfx::ScopedCocoaDisableScreenUpdates disabler;
-
-    NSEventType type = [theEvent type];
-    if (type == NSKeyUp) {
-      if ([theEvent keyCode] == kVK_Escape) {
-        // Cancel the drag and restore the previous state.
-        if (draggingWithinTabStrip_) {
-          // Simply pretend the tab wasn't dragged (far enough).
-          tabWasDragged_ = NO;
-        } else {
-          [targetController_ removePlaceholder];
-          [[sourceController_ window] makeMainWindow];
-          if ([sourceController_ numberOfTabs] < 2) {
-            // Revert to a single-tab window.
-            targetController_ = nil;
-          } else {
-            // Change the target to the source controller.
-            targetController_ = sourceController_;
-            [targetController_ insertPlaceholderForTab:[tab tabView]
-                                                 frame:sourceTabFrame_];
-          }
-        }
-        // Simply end the drag at this point.
-        [self endDrag:theEvent];
-        break;
-      }
-    } else if (type == NSLeftMouseDragged) {
-      [self continueDrag:theEvent];
-    } else if (type == NSLeftMouseUp) {
-      [tab selectTab:self];
-      [self endDrag:theEvent];
-      break;
-    } else {
-      // TODO(viettrungluu): [crbug.com/23830] We can receive right-mouse-ups
-      // (and maybe even others?) for reasons I don't understand. So we
-      // explicitly check for both events we're expecting, and log others. We
-      // should figure out what's going on.
-      LOG(WARNING) << "Spurious event received of type " << type << ".";
-    }
-  }
-}
-
-- (void)continueDrag:(NSEvent*)theEvent {
-  CHECK(draggedTab_);
-
-  // Cancel any delayed -continueDrag: requests that may still be pending.
-  [NSObject cancelPreviousPerformRequestsWithTarget:self];
-
-  // Special-case this to keep the logic below simpler.
-  if (moveWindowOnDrag_) {
-    if ([sourceController_ windowMovementAllowed]) {
-      NSPoint thisPoint = [NSEvent mouseLocation];
-      NSPoint origin = sourceWindowFrame_.origin;
-      origin.x += (thisPoint.x - dragOrigin_.x);
-      origin.y += (thisPoint.y - dragOrigin_.y);
-      [sourceWindow_ setFrameOrigin:NSMakePoint(origin.x, origin.y)];
-    }  // else do nothing.
-    return;
-  }
-
-  if (draggingWithinTabStrip_) {
-    NSPoint thisPoint = [NSEvent mouseLocation];
-    CGFloat horizOffset = thisPoint.x - dragOrigin_.x;
-    CGFloat vertOffset = thisPoint.y - dragOrigin_.y;
-    BOOL stillVisible = YES;
-
-    // If the tab hasn't been torn out of the vertical dead zone, and has never
-    // been torn out of the horizontal dead zone, return. This prevents the tab
-    // from sticking if it's dragged back near its original position.
-    if (fabs(horizOffset) <= kHorizTearDistance && !outOfTabHorizDeadZone_ &&
-        fabs(vertOffset) <= kVertTearDistance)
-      return;
-    if (fabs(horizOffset) > kHorizTearDistance)
-      outOfTabHorizDeadZone_ = YES;
-
-    // If the tab is pulled out of either dead zone, set tabWasDragged_ to YES
-    // and call insertPlaceholderForTab:frame:.
-    if (outOfTabHorizDeadZone_ || fabs(vertOffset) > kVertTearDistance) {
-      tabWasDragged_ = YES;
-      TabViewCocoa* tabView = [draggedTab_ tabView];
-      [sourceController_
-          insertPlaceholderForTab:tabView
-                            frame:[tabView centerScanRect:NSOffsetRect(
-                                                              sourceTabFrame_,
-                                                              horizOffset, 0)]];
-    }
-
-    // Check if the tab has been pulled out of the tab strip. Emulate the
-    // behavior of native tab dragging, where the tab will:
-    //  - Be easy to tear off if it's still within the horizontal dead zone.
-    //  - Be harder to tear off if it's left the horizontal dead zone.
-    // Note the |tabTornOff| calculation assumes the following:
-    static_assert(
-        kLargeVertTearDistance >= kVertTearDistance,
-        "Check |outOfTabHorizDeadZone_|'s value if this is no longer true.");
-    BOOL tabTornOff =
-        (!outOfTabHorizDeadZone_ && fabs(vertOffset) > kVertTearDistance) ||
-        fabs(vertOffset) > kLargeVertTearDistance;
-    // Whether the tab remains inside the bounds of the window.
-    stillVisible = [sourceController_ isTabFullyVisible:[draggedTab_ tabView]];
-
-    if ([sourceController_ tabTearingAllowed] &&
-        (tabTornOff || !stillVisible)) {
-      draggingWithinTabStrip_ = NO;
-      // When you finally leave the strip, we treat that as the origin.
-      dragOrigin_.x = thisPoint.x;
-      // The above call to insertPlaceholderForTab:frame: updates
-      // |draggedTab_|'s frame, but does so using an animator, which means the
-      // new frame gets set only after the next turn of the run loop. As a
-      // result, at this point in the code the updated frame is only pending,
-      // which means that when the tab gets torn off into its own window, its
-      // location in that new window will be based on its current, un-updated
-      // location. As a result, the tab will appear at an unexpected location
-      // in the new window relative to the mouse. The difference between the
-      // expected and actual locations will be more-pronounced the faster you
-      // drag the mouse horizontally when tearing it off from its current
-      // window. To fix, explicitly set the tab's new location so that it's
-      // correct at tearoff time. See http://crbug.com/541674 .
-      NSRect newTabFrame = [[draggedTab_ tabView] frame];
-      newTabFrame.origin.x = trunc(sourceTabFrame_.origin.x + horizOffset);
-
-      // Ensure that the tab won't extend beyond the right edge of the tab area
-      // in the tab strip.
-      CGFloat tabWidthBeyondRightEdge =
-          MAX(NSMaxX(newTabFrame) - [tabStrip_ tabAreaRightEdge], 0.0);
-      if (tabWidthBeyondRightEdge) {
-        // Adjust the tab's x-origin so that it just touches the right edge of
-        // the tab area.
-        newTabFrame.origin.x -= tabWidthBeyondRightEdge;
-        // Offset the new window's drag location so that the tab will still be
-        // positioned correctly beneath the mouse (being careful to convert the
-        // view frame offset to screen coordinates).
-        NSWindow* tabViewWindow = [[draggedTab_ tabView] window];
-        horizDragOffset_ = [tabViewWindow convertRectToScreen:
-            NSMakeRect(0.0, 0.0, tabWidthBeyondRightEdge, 1.0)].size.width;
-      }
-
-      [[draggedTab_ tabView] setFrameOrigin:newTabFrame.origin];
-    }
-
-    // Else, still dragging within the tab strip, wait for the next drag
-    // event.
-    return;
-  }
-
-  NSPoint thisPoint = [NSEvent mouseLocation];
-
-  // Iterate over possible targets checking for the one the mouse is in.
-  // If the tab is just in the frame, bring the window forward to make it
-  // easier to drop something there. If it's in the tab strip, set the new
-  // target so that it pops into that window. We can't cache this because we
-  // need the z-order to be correct.
-  NSArray* targets = [self dropTargetsForController:draggedController_];
-  TabWindowController* newTarget = nil;
-  for (TabWindowController* target in targets) {
-    NSRect windowFrame = [[target window] frame];
-    if (NSPointInRect(thisPoint, windowFrame)) {
-      [[target window] orderFront:self];
-      if (PointIsInsideView(thisPoint, [target tabStripView])) {
-        newTarget = target;
-      }
-      break;
-    }
-  }
-
-  // If we're now targeting a new window, re-layout the tabs in the old
-  // target and reset how long we've been hovering over this new one.
-  if (targetController_ != newTarget) {
-    [targetController_ removePlaceholder];
-    targetController_ = newTarget;
-    if (!newTarget) {
-      tearTime_ = [NSDate timeIntervalSinceReferenceDate];
-      tearOrigin_ = [dragWindow_ frame].origin;
-    }
-  }
-
-  // Create or identify the dragged controller.
-  if (!draggedController_) {
-    // Detach from the current window and put it in a new window. If there are
-    // no more tabs remaining after detaching, the source window is about to
-    // go away (it's been autoreleased) so we need to ensure we don't reference
-    // it any more. In that case the new controller becomes our source
-    // controller.
-    NSArray* tabs = [self selectedTabViews];
-    draggedController_ =
-        [sourceController_ detachTabsToNewWindow:tabs
-                                      draggedTab:[draggedTab_ tabView]];
-
-    dragWindow_ = [draggedController_ window];
-    [dragWindow_ setAlphaValue:0.0];
-    if ([sourceController_ hasLiveTabs]) {
-      if (PointIsInsideView(thisPoint, [sourceController_ tabStripView])) {
-        // We don't want to remove the source window's placeholder here because
-        // the new tab button may briefly flash in and out if we remove and add
-        // back the placeholder.
-        // Instead, we will remove the placeholder later when the target window
-        // actually changes.
-        targetController_ = sourceController_;
-      } else {
-        [sourceController_ removePlaceholder];
-      }
-    } else {
-      [sourceController_ removePlaceholder];
-      sourceController_ = draggedController_;
-      sourceWindow_ = dragWindow_;
-    }
-
-    // Disable window animation before calling |orderFront:| when detaching
-    // to a new window.
-    NSWindowAnimationBehavior savedAnimationBehavior =
-        NSWindowAnimationBehaviorDefault;
-    bool didSaveAnimationBehavior = false;
-    if ([dragWindow_ respondsToSelector:@selector(animationBehavior)] &&
-        [dragWindow_ respondsToSelector:@selector(setAnimationBehavior:)]) {
-      didSaveAnimationBehavior = true;
-      savedAnimationBehavior = [dragWindow_ animationBehavior];
-      [dragWindow_ setAnimationBehavior:NSWindowAnimationBehaviorNone];
-    }
-
-    // If dragging the tab only moves the current window, do not show overlay
-    // so that sheets stay on top of the window.
-    // Bring the target window to the front and make sure it has a border.
-    [dragWindow_ setLevel:NSFloatingWindowLevel];
-    [dragWindow_ setHasShadow:YES];
-    [dragWindow_ orderFront:nil];
-    [dragWindow_ makeMainWindow];
-    [draggedController_ showOverlay];
-    dragOverlay_ = [draggedController_ overlayWindow];
-    [dragOverlay_ setHasShadow:YES];
-    // Force the new tab button to be hidden. We'll reset it on mouse up.
-    [draggedController_ showNewTabButton:NO];
-    tearTime_ = [NSDate timeIntervalSinceReferenceDate];
-    tearOrigin_ = sourceWindowFrame_.origin;
-
-    // Restore window animation behavior.
-    if (didSaveAnimationBehavior)
-      [dragWindow_ setAnimationBehavior:savedAnimationBehavior];
-  }
-
-  // TODO(pinkerton): http://crbug.com/25682 demonstrates a way to get here by
-  // some weird circumstance that doesn't first go through mouseDown:. We
-  // really shouldn't go any farther.
-  if (!draggedController_ || !sourceController_)
-    return;
-
-  // When the user first tears off the window, we want slide the window to
-  // the current mouse location (to reduce the jarring appearance). We do this
-  // by calling ourselves back with additional -continueDrag: calls (not actual
-  // events). |tearProgress| is a normalized measure of how far through this
-  // tear "animation" (of length kTearDuration) we are and has values [0..1].
-  // We use sqrt() so the animation is non-linear (slow down near the end
-  // point).
-  NSTimeInterval tearProgress =
-      [NSDate timeIntervalSinceReferenceDate] - tearTime_;
-  tearProgress /= kTearDuration;  // Normalize.
-  tearProgress = sqrtf(MAX(MIN(tearProgress, 1.0), 0.0));
-
-  // Move the dragged window to the right place on the screen.
-  // TODO(spqchan): Write a test to check if the window is at the right place.
-  // See http://crbug.com/687647.
-  NSPoint origin = sourceWindowFrame_.origin;
-  origin.x += (thisPoint.x - dragOrigin_.x);
-  origin.y += (thisPoint.y - dragOrigin_.y);
-  if ([sourceController_ isInAnyFullscreenMode]) {
-    origin.y +=
-        [sourceController_ menubarOffset] + [sourceController_ menubarHeight];
-  }
-
-  if (tearProgress < 1) {
-    // If the tear animation is not complete, call back to ourself with the
-    // same event to animate even if the mouse isn't moving. We need to make
-    // sure these get cancelled in -endDrag:.
-    [NSObject cancelPreviousPerformRequestsWithTarget:self];
-    [self performSelector:@selector(continueDrag:)
-               withObject:theEvent
-               afterDelay:1.0f/30.0f];
-
-    // Set the current window origin based on how far we've progressed through
-    // the tear animation.
-    origin.x = (1 - tearProgress) * tearOrigin_.x + tearProgress * origin.x;
-    origin.y = (1 - tearProgress) * tearOrigin_.y + tearProgress * origin.y;
-  }
-
-  if (targetController_) {
-    // In order to "snap" two windows of different sizes together at their
-    // toolbar, we can't just use the origin of the target frame. We also have
-    // to take into consideration the difference in height.
-    NSRect targetFrame = [[targetController_ window] frame];
-    NSRect sourceFrame = [dragWindow_ frame];
-    origin.y = NSMinY(targetFrame) + [targetController_ menubarOffset] +
-               (NSHeight(targetFrame) - NSHeight(sourceFrame));
-  }
-  [dragWindow_ setFrameOrigin:
-      NSMakePoint(origin.x + horizDragOffset_, origin.y)];
-
-  // If we're not hovering over any window, make the window fully
-  // opaque. Otherwise, find where the tab might be dropped and insert
-  // a placeholder so it appears like it's part of that window.
-  if (targetController_) {
-    if (![[targetController_ window] isKeyWindow])
-      [[targetController_ window] orderFront:nil];
-
-    // Compute where placeholder should go and insert it into the
-    // destination tab strip.
-    // The placeholder frame is the rect that contains all dragged tabs.
-    NSRect tabFrame = NSZeroRect;
-    for (NSView* tabView in [draggedController_ tabViews]) {
-      tabFrame = NSUnionRect(tabFrame, [tabView frame]);
-    }
-    tabFrame = [dragWindow_ convertRectToScreen:tabFrame];
-    tabFrame = [[targetController_ window] convertRectFromScreen:tabFrame];
-    tabFrame = [[targetController_ tabStripView]
-                convertRect:tabFrame fromView:nil];
-    [targetController_ insertPlaceholderForTab:[draggedTab_ tabView]
-                                         frame:tabFrame];
-    [targetController_ layoutTabs];
-  } else {
-    [dragWindow_ makeKeyAndOrderFront:nil];
-  }
-
-  // Adjust the visibility of the window background. If there is a drop target,
-  // we want to hide the window background so the tab stands out for
-  // positioning. If not, we want to show it so it looks like a new window will
-  // be realized.
-  BOOL chromeShouldBeVisible = targetController_ == nil;
-  [self setWindowBackgroundVisibility:chromeShouldBeVisible];
-}
-
-- (void)endDrag:(NSEvent*)event {
-  // Cancel any delayed -continueDrag: requests that may still be pending.
-  [NSObject cancelPreviousPerformRequestsWithTarget:self];
-  outOfTabHorizDeadZone_ = NO;
-
-  // Special-case this to keep the logic below simpler.
-  if (moveWindowOnDrag_) {
-    [self resetDragControllers];
-    return;
-  }
-
-  // TODO(pinkerton): http://crbug.com/25682 demonstrates a way to get here by
-  // some weird circumstance that doesn't first go through mouseDown:. We
-  // really shouldn't go any farther.
-  if (!sourceController_)
-    return;
-
-  // We are now free to re-display the new tab button in the window we're
-  // dragging. It will show when the next call to -layoutTabs (which happens
-  // indirectly by several of the calls below, such as removing the
-  // placeholder).
-  [draggedController_ showNewTabButton:YES];
-
-  if (draggingWithinTabStrip_) {
-    if (tabWasDragged_) {
-      // Move tab to new location.
-      DCHECK([sourceController_ numberOfTabs]);
-      TabWindowController* dropController = sourceController_;
-      [dropController moveTabViews:@[ [dropController activeTabView] ]
-                    fromController:nil];
-    }
-  } else if (targetController_) {
-    // Move between windows. If |targetController_| is nil, we're not dropping
-    // into any existing window.
-    [targetController_ moveTabViews:[draggedController_ tabViews]
-                     fromController:draggedController_];
-    // Force redraw to avoid flashes of old content before returning to event
-    // loop.
-    [[targetController_ window] display];
-    [[targetController_ nsWindowController] showWindow:nil];
-    [draggedController_ removeOverlay];
-  } else {
-    // Only move the window around on screen. Make sure it's set back to
-    // normal state (fully opaque, has shadow, has key, in fullscreen if
-    // appropriate, etc).
-    [draggedController_
-        detachedWindowEnterFullscreenIfNeeded:sourceController_];
-
-    [draggedController_ removeOverlay];
-    // Don't want to re-show the window if it was closed during the drag.
-    if ([dragWindow_ isVisible]) {
-      [dragWindow_ setAlphaValue:1.0];
-      [dragOverlay_ setHasShadow:NO];
-      [dragWindow_ setHasShadow:YES];
-      [dragWindow_ makeKeyAndOrderFront:nil];
-    }
-    [[draggedController_ window] setLevel:NSNormalWindowLevel];
-    [draggedController_ removePlaceholder];
-  }
-  [sourceController_ removePlaceholder];
-  chromeIsVisible_ = YES;
-
-  [self resetDragControllers];
-}
-
-// Private /////////////////////////////////////////////////////////////////////
-
-- (NSArray*)selectedTabViews {
-  return [draggedTab_ selected] ? [tabStrip_ selectedViews]
-                                : @[ [draggedTab_ tabView] ];
-}
-
-- (BOOL)canDragSelectedTabs {
-  NSArray* tabs = [self selectedTabViews];
-
-  // If there's more than one potential window to be a drop target, we want to
-  // treat a drag of a tab just like dragging around a tab that's already
-  // detached. Note that unit tests might have |-numberOfTabs| reporting zero
-  // since the model won't be fully hooked up. We need to be prepared for that
-  // and not send them into the "magnetic" codepath.
-  NSArray* targets = [self dropTargetsForController:sourceController_];
-  if (![targets count] && [sourceController_ numberOfTabs] - [tabs count] == 0)
-    return NO;  // I.e. ignore dragging *all* tabs in the last Browser window.
-
-  for (TabViewCocoa* tabView in tabs) {
-    if ([tabView isClosing])
-      return NO;
-  }
-
-  TabWindowController* controller =
-      [TabWindowController tabWindowControllerForWindow:sourceWindow_];
-  if (controller) {
-    for (TabViewCocoa* tabView in tabs) {
-      if (![controller isTabDraggable:tabView])
-        return NO;
-    }
-  }
-  return YES;
-}
-
-// Call to clear out transient weak references we hold during drags.
-- (void)resetDragControllers {
-  draggedTab_ = nil;
-  draggedController_ = nil;
-  dragWindow_ = nil;
-  dragOverlay_ = nil;
-  sourceController_ = nil;
-  sourceWindow_ = nil;
-  targetController_ = nil;
-  horizDragOffset_ = 0.0;
-}
-
-// Returns an array of controllers that could be a drop target, ordered front to
-// back. It has to be of the appropriate class, and visible (obviously). Note
-// that the window cannot be a target for itself.
-- (NSArray*)dropTargetsForController:(TabWindowController*)dragController {
-  NSMutableArray* targets = [NSMutableArray array];
-  NSWindow* dragWindow = [dragController window];
-  for (NSWindow* window in [NSApp orderedWindows]) {
-    if (window == dragWindow) continue;
-    if (![window isVisible]) continue;
-    // Skip windows on the wrong space.
-    if (![window isOnActiveSpace])
-      continue;
-    TabWindowController* controller =
-        [TabWindowController tabWindowControllerForWindow:window];
-    // +tabWindowControllerForWindow: moves from a window to its parent
-    // looking for a TabWindowController. This means in some cases
-    // window != dragWindow but the returned controller == dragController.
-    if (dragController == controller)
-      continue;
-    if ([controller canReceiveFrom:dragController])
-      [targets addObject:controller];
-  }
-  return targets;
-}
-
-// Sets whether the window background should be visible or invisible when
-// dragging a tab. The background should be invisible when the mouse is over a
-// potential drop target for the tab (the tab strip). It should be visible when
-// there's no drop target so the window looks more fully realized and ready to
-// become a stand-alone window.
-- (void)setWindowBackgroundVisibility:(BOOL)shouldBeVisible {
-  if (chromeIsVisible_ == shouldBeVisible)
-    return;
-
-  // There appears to be a race-condition in CoreAnimation where if we use
-  // animators to set the alpha values, we can't guarantee that we cancel them.
-  // This has the side effect of sometimes leaving the dragged window
-  // translucent or invisible. As a result, don't animate the alpha change.
-  [[draggedController_ overlayWindow] setAlphaValue:1.0];
-  if (targetController_) {
-    [dragWindow_ setAlphaValue:0.0];
-    [[draggedController_ overlayWindow] setHasShadow:YES];
-    [[targetController_ window] makeMainWindow];
-  } else {
-    [dragWindow_ setAlphaValue:0.5];
-    [[draggedController_ overlayWindow] setHasShadow:NO];
-    [[draggedController_ window] makeMainWindow];
-  }
-  chromeIsVisible_ = shouldBeVisible;
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h b/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h
deleted file mode 100644
index 2fc76c6..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h
+++ /dev/null
@@ -1,104 +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 CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_MODEL_OBSERVER_BRIDGE_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_MODEL_OBSERVER_BRIDGE_H_
-
-#import <Foundation/Foundation.h>
-
-#include "base/compiler_specific.h"
-#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
-
-class TabStripModel;
-
-namespace content {
-class WebContents;
-}
-
-// A C++ bridge class to handle receiving notifications from the C++ tab strip
-// model. When the caller allocates a bridge, it automatically registers for
-// notifications from |model| and passes messages to |controller| via the
-// informal protocol below. The owner of this object is responsible for deleting
-// it (and thus unhooking notifications) before |controller| is destroyed.
-class TabStripModelObserverBridge : public TabStripModelObserver {
- public:
-  TabStripModelObserverBridge(TabStripModel* model, id controller);
-  ~TabStripModelObserverBridge() override;
-
-  // Overridden from TabStripModelObserver
-  void TabInsertedAt(TabStripModel* tab_strip_model,
-                     content::WebContents* contents,
-                     int index,
-                     bool foreground) override;
-  void TabClosingAt(TabStripModel* tab_strip_model,
-                    content::WebContents* contents,
-                    int index) override;
-  void TabDetachedAt(content::WebContents* contents,
-                     int index,
-                     bool was_active) override;
-  void TabDeactivated(content::WebContents* contents) override;
-  void ActiveTabChanged(content::WebContents* old_contents,
-                        content::WebContents* new_contents,
-                        int index,
-                        int reason) override;
-  void TabSelectionChanged(TabStripModel* tab_strip_model,
-                           const ui::ListSelectionModel& old_model) override;
-  void TabMoved(content::WebContents* contents,
-                int from_index,
-                int to_index) override;
-  void TabChangedAt(content::WebContents* contents,
-                    int index,
-                    TabChangeType change_type) override;
-  void TabReplacedAt(TabStripModel* tab_strip_model,
-                     content::WebContents* old_contents,
-                     content::WebContents* new_contents,
-                     int index) override;
-  void TabPinnedStateChanged(TabStripModel* tab_strip_model,
-                             content::WebContents* contents,
-                             int index) override;
-  void TabBlockedStateChanged(content::WebContents* contents,
-                              int index) override;
-  void TabStripEmpty() override;
-  void SetTabNeedsAttentionAt(int index, bool attention) override;
-
- private:
-  id controller_;  // weak, owns me
-  TabStripModel* model_;  // weak, owned by Browser
-};
-
-// A protocol which can be selectively implemented by any Cocoa object to
-// receive updates about changes to a tab strip model. All methods are optional.
-@protocol TabStripModelBridge
-@optional
-- (void)insertTabWithContents:(content::WebContents*)contents
-                      atIndex:(NSInteger)index
-                 inForeground:(bool)inForeground;
-- (void)tabClosingWithContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)index;
-- (void)tabDetachedWithContents:(content::WebContents*)contents
-                        atIndex:(NSInteger)index;
-- (void)tabDeactivatedWithContents:(content::WebContents*)contents;
-- (void)activateTabWithContents:(content::WebContents*)newContents
-               previousContents:(content::WebContents*)oldContents
-                        atIndex:(NSInteger)index
-                         reason:(int)reason;
-- (void)tabMovedWithContents:(content::WebContents*)contents
-                   fromIndex:(NSInteger)from
-                     toIndex:(NSInteger)to;
-- (void)tabChangedWithContents:(content::WebContents*)contents
-                       atIndex:(NSInteger)index
-                    changeType:(TabChangeType)change;
-- (void)tabReplacedWithContents:(content::WebContents*)newContents
-               previousContents:(content::WebContents*)oldContents
-                        atIndex:(NSInteger)index;
-- (void)tabPinnedStateChangedWithContents:(content::WebContents*)contents
-                                  atIndex:(NSInteger)index;
-- (void)tabBlockedStateChangedWithContents:(content::WebContents*)contents
-                                   atIndex:(NSInteger)index;
-- (void)tabStripEmpty;
-- (void)tabSelectionChanged;
-- (void)tabAtIndex:(NSInteger)index needsAttention:(bool)attention;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_MODEL_OBSERVER_BRIDGE_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.mm
deleted file mode 100644
index 2b1a9db..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.mm
+++ /dev/null
@@ -1,145 +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 "chrome/browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h"
-
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-
-using content::WebContents;
-
-TabStripModelObserverBridge::TabStripModelObserverBridge(TabStripModel* model,
-                                                         id controller)
-    : controller_(controller), model_(model) {
-  DCHECK(model && controller);
-  // Register to be a listener on the model so we can get updates and tell
-  // |controller_| about them in the future.
-  model_->AddObserver(this);
-}
-
-TabStripModelObserverBridge::~TabStripModelObserverBridge() {
-  // Remove ourselves from receiving notifications.
-  model_->RemoveObserver(this);
-}
-
-void TabStripModelObserverBridge::TabInsertedAt(TabStripModel* tab_strip_model,
-                                                WebContents* contents,
-                                                int index,
-                                                bool foreground) {
-  if ([controller_ respondsToSelector:
-          @selector(insertTabWithContents:atIndex:inForeground:)]) {
-    [controller_ insertTabWithContents:contents
-                               atIndex:index
-                          inForeground:foreground];
-  }
-}
-
-void TabStripModelObserverBridge::TabClosingAt(TabStripModel* tab_strip_model,
-                                               WebContents* contents,
-                                               int index) {
-  if ([controller_ respondsToSelector:
-          @selector(tabClosingWithContents:atIndex:)]) {
-    [controller_ tabClosingWithContents:contents atIndex:index];
-  }
-}
-
-void TabStripModelObserverBridge::TabDetachedAt(WebContents* contents,
-                                                int index,
-                                                bool was_active) {
-  if ([controller_ respondsToSelector:
-          @selector(tabDetachedWithContents:atIndex:)]) {
-    [controller_ tabDetachedWithContents:contents atIndex:index];
-  }
-}
-
-void TabStripModelObserverBridge::TabDeactivated(WebContents* contents) {
-  if ([controller_ respondsToSelector:@selector(tabDeactivatedWithContents:)])
-    [controller_ tabDeactivatedWithContents:contents];
-}
-
-void TabStripModelObserverBridge::ActiveTabChanged(WebContents* old_contents,
-                                                   WebContents* new_contents,
-                                                   int index,
-                                                   int reason) {
-  if ([controller_ respondsToSelector:@selector(
-          activateTabWithContents:previousContents:atIndex:reason:)]) {
-    [controller_ activateTabWithContents:new_contents
-                        previousContents:old_contents
-                                 atIndex:index
-                                  reason:reason];
-  }
-}
-
-void TabStripModelObserverBridge::TabSelectionChanged(
-    TabStripModel* tab_strip_model,
-    const ui::ListSelectionModel& old_model) {
-  if ([controller_ respondsToSelector:@selector(tabSelectionChanged)]) {
-    [controller_ tabSelectionChanged];
-  }
-}
-
-void TabStripModelObserverBridge::TabMoved(WebContents* contents,
-                                           int from_index,
-                                           int to_index) {
-  if ([controller_ respondsToSelector:
-       @selector(tabMovedWithContents:fromIndex:toIndex:)]) {
-    [controller_ tabMovedWithContents:contents
-                            fromIndex:from_index
-                              toIndex:to_index];
-  }
-}
-
-void TabStripModelObserverBridge::TabChangedAt(WebContents* contents,
-                                               int index,
-                                               TabChangeType change_type) {
-  if ([controller_ respondsToSelector:
-          @selector(tabChangedWithContents:atIndex:changeType:)]) {
-    [controller_ tabChangedWithContents:contents
-                                atIndex:index
-                             changeType:change_type];
-  }
-}
-
-void TabStripModelObserverBridge::TabReplacedAt(TabStripModel* tab_strip_model,
-                                                WebContents* old_contents,
-                                                WebContents* new_contents,
-                                                int index) {
-  if ([controller_ respondsToSelector:
-          @selector(tabReplacedWithContents:previousContents:atIndex:)]) {
-    [controller_ tabReplacedWithContents:new_contents
-                        previousContents:old_contents
-                                 atIndex:index];
-  } else {
-    TabChangedAt(new_contents, index, TabChangeType::kAll);
-  }
-}
-
-void TabStripModelObserverBridge::TabPinnedStateChanged(
-    TabStripModel* tab_strip_model,
-    WebContents* contents,
-    int index) {
-  if ([controller_ respondsToSelector:
-          @selector(tabPinnedStateChangedWithContents:atIndex:)]) {
-    [controller_ tabPinnedStateChangedWithContents:contents
-                                           atIndex:index];
-  }
-}
-
-void TabStripModelObserverBridge::TabBlockedStateChanged(WebContents* contents,
-                                                         int index) {
-  if ([controller_ respondsToSelector:@selector
-                   (tabBlockedStateChangedWithContents:atIndex:)]) {
-    [controller_ tabBlockedStateChangedWithContents:contents atIndex:index];
-  }
-}
-
-void TabStripModelObserverBridge::TabStripEmpty() {
-  if ([controller_ respondsToSelector:@selector(tabStripEmpty)])
-    [controller_ tabStripEmpty];
-}
-
-void TabStripModelObserverBridge::SetTabNeedsAttentionAt(int index,
-                                                         bool attention) {
-  if ([controller_ respondsToSelector:@selector(tabAtIndex:needsAttention:)])
-    [controller_ tabAtIndex:index needsAttention:attention];
-}
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view.h b/chrome/browser/ui/cocoa/tabs/tab_strip_view.h
deleted file mode 100644
index d18acca..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_view.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 CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_VIEW_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/background_gradient_view.h"
-#import "chrome/browser/ui/cocoa/url_drop_target.h"
-
-@class TabStripControllerCocoa;
-
-// A view class that handles rendering the tab strip and drops of URLS with
-// a positioning locator for drop feedback.
-
-@interface TabStripView : BackgroundGradientView<URLDropTarget> {
- @private
-  TabStripControllerCocoa* controller_;  // Weak; owns us.
-
-  NSTimeInterval lastMouseUp_;
-
-  // Handles being a drag-and-drop target.
-  base::scoped_nsobject<URLDropTargetHandler> dropHandler_;
-
-  // Whether the drop-indicator arrow is shown, and if it is, the coordinate of
-  // its tip.
-  BOOL dropArrowShown_;
-  NSPoint dropArrowPosition_;
-  BOOL inATabDraggingOverlayWindow_;
-  BOOL visualEffectsDisabledForFullscreen_;
-}
-
-@property(assign, nonatomic) BOOL dropArrowShown;
-@property(assign, nonatomic) NSPoint dropArrowPosition;
-@property(assign, nonatomic) BOOL inATabDraggingOverlayWindow;
-
-// Leaving visual effects enabled when fullscreen results in higher power
-// consumption. This is used to disable effects when fullscreen.
-- (void)setVisualEffectsDisabledForFullscreen:(BOOL)fullscreen;
-@end
-
-// Interface for the controller to set and clear the weak reference to itself.
-@interface TabStripView (TabStripControllerInterface)
-- (void)setController:(TabStripControllerCocoa*)controller;
-@end
-
-// Protected methods subclasses can override to alter behavior. Clients should
-// not call these directly.
-@interface TabStripView (Protected)
-- (void)drawBottomBorder:(NSRect)bounds;
-- (BOOL)doubleClickMinimizesWindow;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_STRIP_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
deleted file mode 100644
index 42f4b76..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm
+++ /dev/null
@@ -1,416 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-
-#include <cmath>  // floor
-
-#include "base/logging.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mac_util.h"
-#include "base/mac/sdk_forward_declarations.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/themes/theme_service.h"
-#import "chrome/browser/ui/cocoa/browser_window_controller.h"
-#import "chrome/browser/ui/cocoa/browser_window_layout.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#import "chrome/browser/ui/cocoa/view_id_util.h"
-#include "chrome/grit/generated_resources.h"
-#include "chrome/grit/theme_resources.h"
-#import "ui/base/cocoa/appkit_utils.h"
-#import "ui/base/cocoa/nsgraphics_context_additions.h"
-#import "ui/base/cocoa/nsview_additions.h"
-#include "ui/base/l10n/l10n_util_mac.h"
-#include "ui/base/material_design/material_design_controller.h"
-#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
-
-@implementation TabStripView
-
-@synthesize dropArrowShown = dropArrowShown_;
-@synthesize dropArrowPosition = dropArrowPosition_;
-@synthesize inATabDraggingOverlayWindow = inATabDraggingOverlayWindow_;
-
-- (id)initWithFrame:(NSRect)frame {
-  self = [super initWithFrame:frame];
-  if (self) {
-    // Set lastMouseUp_ = -1000.0 so that timestamp-lastMouseUp_ is big unless
-    // lastMouseUp_ has been reset.
-    lastMouseUp_ = -1000.0;
-
-    // Register to be an URL drop target.
-    dropHandler_.reset([[URLDropTargetHandler alloc] initWithView:self]);
-
-    [self setShowsDivider:NO];
-
-    [self setWantsLayer:YES];
-  }
-  return self;
-}
-
-// Draw the bottom edge of the tab strip. Each tab is responsible for mimicking
-// this bottom border, unless it's the selected tab.
-- (void)drawBottomEdge:(NSRect)dirtyRect {
-  NSWindow* window = [self window];
-  const ui::ThemeProvider* themeProvider = [window themeProvider];
-  if (!themeProvider)
-    return;
-
-  NSColor* strokeColor;
-  if (themeProvider->HasCustomImage(IDR_THEME_TOOLBAR) ||
-      themeProvider->HasCustomColor(ThemeProperties::COLOR_TOOLBAR)) {
-    // First draw the toolbar bitmap, so that theme colors can shine through.
-    NSRect backgroundRect = [self bounds];
-    backgroundRect.size.height = [self cr_lineWidth];
-    if (NSIntersectsRect(backgroundRect, dirtyRect)) {
-      [self drawBackground:backgroundRect];
-    }
-
-    // Pre-MD the IDR_TOOLBAR_SHADE_TOP image would lay down a light highlight
-    // which helped dark toolbars stand out from dark frames. Lay down a thin
-    // highlight in MD also.
-    if ([window isMainWindow]) {
-      strokeColor = themeProvider->GetNSColor(
-          ThemeProperties::COLOR_TOOLBAR_STROKE_THEME);
-    } else {
-      strokeColor = themeProvider->GetNSColor(
-          ThemeProperties::COLOR_TOOLBAR_STROKE_THEME_INACTIVE);
-    }
-  } else {
-    strokeColor =
-        themeProvider->GetNSColor(ThemeProperties::COLOR_TOOLBAR_STROKE);
-
-    // If the current theme is the system theme, and the system is in "increase
-    // contrast" mode, and this is an incognito window, force the toolbar stroke
-    // to be drawn in white instead of black, to make it show up better.
-    if ([[self window] hasDarkTheme] && themeProvider->ShouldIncreaseContrast())
-      strokeColor = [NSColor whiteColor];
-  }
-
-  if (themeProvider->ShouldIncreaseContrast())
-    strokeColor = [strokeColor colorWithAlphaComponent:100];
-  [strokeColor set];
-
-  NSRect borderRect = NSMakeRect(0.0, 0.0, self.bounds.size.width,
-      [self cr_lineWidth]);
-  NSRectFillUsingOperation(NSIntersectionRect(dirtyRect, borderRect),
-                           NSCompositeSourceOver);
-}
-
-- (void)drawRect:(NSRect)dirtyRect {
-  const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-  bool hasCustomThemeImage = themeProvider &&
-      themeProvider->HasCustomImage(IDR_THEME_FRAME);
-  BOOL supportsVibrancy = false;
-  if (@available(macOS 10.10, *))
-    supportsVibrancy = [self visualEffectView] != nil;
-  BOOL isMainWindow = [[self window] isMainWindow];
-
-  // If in Material Design mode, decrease the tabstrip background's translucency
-  // by overlaying it with a partially-transparent gray (but only if not themed,
-  // and not being used to drag tabs between browser windows). The gray is
-  // somewhat opaque for Incognito mode, very opaque for non-Incognito mode, and
-  // completely opaque when the window is not active.
-  if (themeProvider && !hasCustomThemeImage && !inATabDraggingOverlayWindow_) {
-    NSColor* theColor = nil;
-    if (isMainWindow) {
-      if (supportsVibrancy &&
-          !themeProvider->HasCustomColor(ThemeProperties::COLOR_FRAME)) {
-        theColor = themeProvider->GetNSColor(
-            ThemeProperties::COLOR_FRAME_VIBRANCY_OVERLAY);
-      } else if (!supportsVibrancy && themeProvider->InIncognitoMode()) {
-        theColor = [NSColor colorWithSRGBRed:20 / 255.
-                                       green:22 / 255.
-                                        blue:24 / 255.
-                                       alpha:1];
-      } else {
-        theColor = themeProvider->GetNSColor(ThemeProperties::COLOR_FRAME);
-      }
-    } else {
-      theColor = themeProvider->GetNSColor(
-          ThemeProperties::COLOR_FRAME_INACTIVE);
-    }
-
-    if (theColor) {
-      [theColor set];
-      NSRectFillUsingOperation(dirtyRect, NSCompositeSourceOver);
-    }
-  }
-
-  [self drawBottomEdge:dirtyRect];
-
-  // Draw drop-indicator arrow (if appropriate).
-  // TODO(viettrungluu): this is all a stop-gap measure.
-  if ([self dropArrowShown]) {
-    // Programmer art: an arrow parametrized by many knobs. Note that the arrow
-    // points downwards (so understand "width" and "height" accordingly).
-
-    // How many (pixels) to inset on the top/bottom.
-    const CGFloat kArrowTopInset = 1.5;
-    const CGFloat kArrowBottomInset = 1;
-
-    // What proportion of the vertical space is dedicated to the arrow tip,
-    // i.e., (arrow tip height)/(amount of vertical space).
-    const CGFloat kArrowTipProportion = 0.55;
-
-    // This is a slope, i.e., (arrow tip height)/(0.5 * arrow tip width).
-    const CGFloat kArrowTipSlope = 1.2;
-
-    // What proportion of the arrow tip width is the stem, i.e., (stem
-    // width)/(arrow tip width).
-    const CGFloat kArrowStemProportion = 0.33;
-
-    NSPoint arrowTipPos = [self dropArrowPosition];
-    arrowTipPos.x = std::floor(arrowTipPos.x);  // Draw on the pixel.
-    arrowTipPos.y += kArrowBottomInset;  // Inset on the bottom.
-
-    // Height we have to work with (insetting on the top).
-    CGFloat availableHeight =
-        NSMaxY([self bounds]) - arrowTipPos.y - kArrowTopInset;
-    DCHECK(availableHeight >= 5);
-
-    // Based on the knobs above, calculate actual dimensions which we'll need
-    // for drawing.
-    CGFloat arrowTipHeight = kArrowTipProportion * availableHeight;
-    CGFloat arrowTipWidth = 2 * arrowTipHeight / kArrowTipSlope;
-    CGFloat arrowStemHeight = availableHeight - arrowTipHeight;
-    CGFloat arrowStemWidth = kArrowStemProportion * arrowTipWidth;
-    CGFloat arrowStemInset = (arrowTipWidth - arrowStemWidth) / 2;
-
-    // The line width is arbitrary, but our path really should be mitered.
-    NSBezierPath* arrow = [NSBezierPath bezierPath];
-    [arrow setLineJoinStyle:NSMiterLineJoinStyle];
-    [arrow setLineWidth:1];
-
-    // Define the arrow's shape! We start from the tip and go clockwise.
-    [arrow moveToPoint:arrowTipPos];
-    [arrow relativeLineToPoint:NSMakePoint(-arrowTipWidth / 2, arrowTipHeight)];
-    [arrow relativeLineToPoint:NSMakePoint(arrowStemInset, 0)];
-    [arrow relativeLineToPoint:NSMakePoint(0, arrowStemHeight)];
-    [arrow relativeLineToPoint:NSMakePoint(arrowStemWidth, 0)];
-    [arrow relativeLineToPoint:NSMakePoint(0, -arrowStemHeight)];
-    [arrow relativeLineToPoint:NSMakePoint(arrowStemInset, 0)];
-    [arrow closePath];
-
-    // Draw and fill the arrow.
-    [[NSColor colorWithCalibratedWhite:0 alpha:0.67] set];
-    [arrow stroke];
-    [[NSColor colorWithCalibratedWhite:1 alpha:0.67] setFill];
-    [arrow fill];
-  }
-}
-
-// YES if a double-click in the background of the tab strip minimizes the
-// window.
-- (BOOL)doubleClickMinimizesWindow {
-  return YES;
-}
-
-// We accept first mouse so clicks onto close/zoom/miniaturize buttons and
-// title bar double-clicks are properly detected even when the window is in the
-// background.
-- (BOOL)acceptsFirstMouse:(NSEvent*)event {
-  return YES;
-}
-
-// When displaying a modal sheet, interaction with the tabs (e.g. middle-click
-// to close a tab) should be blocked. -[NSWindow sendEvent] blocks left-click,
-// but not others. To prevent clicks going to subviews, absorb them here. This
-// is also done in FastResizeView, but TabStripView is in the title bar, so is
-// not contained in a FastResizeView.
-- (NSView*)hitTest:(NSPoint)aPoint {
-  if ([[self window] attachedSheet])
-    return self;
-  return [super hitTest:aPoint];
-}
-
-// Trap double-clicks and make them miniaturize the browser window.
-- (void)mouseUp:(NSEvent*)event {
-  // Bail early if double-clicks are disabled.
-  if (![self doubleClickMinimizesWindow]) {
-    [super mouseUp:event];
-    return;
-  }
-
-  NSInteger clickCount = [event clickCount];
-  NSTimeInterval timestamp = [event timestamp];
-
-  // Double-clicks on Zoom/Close/Mininiaturize buttons shouldn't cause
-  // miniaturization. For those, we miss the first click but get the second
-  // (with clickCount == 2!). We thus check that we got a first click shortly
-  // before (measured up-to-up) a double-click. Cocoa doesn't have a documented
-  // way of getting the proper interval (= (double-click-threshold) +
-  // (drag-threshold); the former is Carbon GetDblTime()/60.0 or
-  // com.apple.mouse.doubleClickThreshold [undocumented]). So we hard-code
-  // "short" as 0.8 seconds. (Measuring up-to-up isn't enough to properly
-  // detect double-clicks, but we're actually using Cocoa for that.)
-  if (clickCount == 2 && (timestamp - lastMouseUp_) < 0.8) {
-    ui::WindowTitlebarReceivedDoubleClick([self window], self);
-  } else {
-    [super mouseUp:event];
-  }
-
-  // If clickCount is 0, the drag threshold was passed.
-  lastMouseUp_ = (clickCount == 1) ? timestamp : -1000.0;
-}
-
-// (URLDropTarget protocol)
-- (id<URLDropTargetController>)urlDropController {
-  return controller_;
-}
-
-// (URLDropTarget protocol)
-- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
-  return [dropHandler_ draggingEntered:sender];
-}
-
-// (URLDropTarget protocol)
-- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
-  return [dropHandler_ draggingUpdated:sender];
-}
-
-// (URLDropTarget protocol)
-- (void)draggingExited:(id<NSDraggingInfo>)sender {
-  return [dropHandler_ draggingExited:sender];
-}
-
-// (URLDropTarget protocol)
-- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
-  return [dropHandler_ performDragOperation:sender];
-}
-
-- (BOOL)accessibilityIsIgnored {
-  return NO;
-}
-
-// Returns AX children (tabs and new tab button), sorted from left to right.
-- (NSArray*)tabStripViewAccessibilityChildren {
-  NSArray* children =
-      [super accessibilityAttributeValue:NSAccessibilityChildrenAttribute];
-  return [children sortedArrayUsingComparator:
-      ^NSComparisonResult(id first, id second) {
-          NSPoint firstPosition =
-              [[first accessibilityAttributeValue:
-                          NSAccessibilityPositionAttribute] pointValue];
-          NSPoint secondPosition =
-              [[second accessibilityAttributeValue:
-                           NSAccessibilityPositionAttribute] pointValue];
-          if (firstPosition.x < secondPosition.x)
-            return NSOrderedAscending;
-          else if (firstPosition.x > secondPosition.x)
-            return NSOrderedDescending;
-          else
-            return NSOrderedSame;
-      }];
-}
-
-- (id)accessibilityAttributeValue:(NSString*)attribute {
-  if ([attribute isEqual:NSAccessibilityRoleAttribute]) {
-    return NSAccessibilityTabGroupRole;
-  } else if ([attribute isEqual:NSAccessibilityChildrenAttribute]) {
-    return [self tabStripViewAccessibilityChildren];
-  } else if ([attribute isEqual:NSAccessibilityTabsAttribute]) {
-    NSArray* children = [self tabStripViewAccessibilityChildren];
-    NSIndexSet* indexes = [children indexesOfObjectsPassingTest:
-        ^BOOL(id child, NSUInteger idx, BOOL* stop) {
-            NSString* role = [child
-                accessibilityAttributeValue:NSAccessibilityRoleAttribute];
-            return [role isEqualToString:NSAccessibilityRadioButtonRole];
-        }];
-    return [children objectsAtIndexes:indexes];
-  } else if ([attribute isEqual:NSAccessibilityContentsAttribute]) {
-    return [self tabStripViewAccessibilityChildren];
-  } else if ([attribute isEqual:NSAccessibilityValueAttribute]) {
-    return [controller_ activeTabView];
-  }
-
-  return [super accessibilityAttributeValue:attribute];
-}
-
-- (NSArray*)accessibilityAttributeNames {
-  NSMutableArray* attributes =
-      [[super accessibilityAttributeNames] mutableCopy];
-  [attributes addObject:NSAccessibilityTabsAttribute];
-  [attributes addObject:NSAccessibilityContentsAttribute];
-  [attributes addObject:NSAccessibilityValueAttribute];
-
-  return [attributes autorelease];
-}
-
-- (ViewID)viewID {
-  return VIEW_ID_TAB_STRIP;
-}
-
-- (NSVisualEffectView*)visualEffectView API_AVAILABLE(macos(10.10)) {
-  return [[BrowserWindowController
-      browserWindowControllerForWindow:[self window]] visualEffectView];
-}
-
-- (void)setController:(TabStripControllerCocoa*)controller {
-  controller_ = controller;
-  // If tearing down the browser window, there's nothing more to do.
-  if (!controller_) {
-    return;
-  }
-
-  // Finish configuring the NSVisualEffectView so that it matches the window's
-  // theme.
-  if (@available(macOS 10.10, *)) {
-    NSVisualEffectView* visualEffectView = [self visualEffectView];
-    const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-    if (!visualEffectView || !themeProvider) {
-      return;
-    }
-
-    // Themes with custom frame images don't use vibrancy. Otherwise, if
-    // Incognito use Material Dark.
-    if (themeProvider->HasCustomImage(IDR_THEME_FRAME) ||
-        themeProvider->HasCustomColor(ThemeProperties::COLOR_FRAME)) {
-      [visualEffectView setState:NSVisualEffectStateInactive];
-    } else if (themeProvider->InIncognitoMode()) {
-      [visualEffectView setMaterial:NSVisualEffectMaterialDark];
-      [visualEffectView
-          setAppearance:[NSAppearance
-                            appearanceNamed:NSAppearanceNameVibrantDark]];
-    }
-  }
-}
-
-// ThemedWindowDrawing implementation.
-
-- (void)windowDidChangeTheme {
-  [self setNeedsDisplay:YES];
-  [self updateVisualEffectState];
-}
-
-- (void)windowDidChangeActive {
-  [self setNeedsDisplay:YES];
-}
-
-- (void)setVisualEffectsDisabledForFullscreen:(BOOL)disabled {
-  visualEffectsDisabledForFullscreen_ = disabled;
-  [self updateVisualEffectState];
-}
-
-- (void)updateVisualEffectState {
-  if (@available(macOS 10.10, *)) {
-    // Configure the NSVisualEffectView so that it does nothing if the user has
-    // switched to a custom theme, or uses vibrancy if the user has switched
-    // back to the default theme.
-    NSVisualEffectView* visualEffectView = [self visualEffectView];
-    const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-    if (!visualEffectView || !themeProvider) {
-      return;
-    }
-    if (visualEffectsDisabledForFullscreen_ ||
-        themeProvider->HasCustomImage(IDR_THEME_FRAME) ||
-        themeProvider->HasCustomColor(ThemeProperties::COLOR_FRAME)) {
-      [visualEffectView setState:NSVisualEffectStateInactive];
-    } else {
-      [visualEffectView setState:NSVisualEffectStateFollowsWindowActiveState];
-    }
-  }
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view_unittest.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_view_unittest.mm
deleted file mode 100644
index 7bbb143..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_view_unittest.mm
+++ /dev/null
@@ -1,30 +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.
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
-#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace {
-
-class TabStripViewTest : public CocoaTest {
- public:
-  TabStripViewTest() {
-    NSRect frame = NSMakeRect(0, 0, 100, 30);
-    base::scoped_nsobject<TabStripView> view(
-        [[TabStripView alloc] initWithFrame:frame]);
-    view_ = view.get();
-    [[test_window() contentView] addSubview:view_];
-  }
-
-  TabStripView* view_;
-};
-
-TEST_VIEW(TabStripViewTest, view_)
-
-}  // namespace
diff --git a/chrome/browser/ui/cocoa/tabs/tab_view.h b/chrome/browser/ui/cocoa/tabs/tab_view.h
deleted file mode 100644
index 73b7704..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_view.h
+++ /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.
-
-#ifndef CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_
-#define CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_
-
-#include <ApplicationServices/ApplicationServices.h>
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_cftyperef.h"
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/hover_close_button.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-#include "chrome/browser/ui/tabs/tab_utils.h"
-
-namespace tabs {
-
-// When the window doesn't have focus then we want to draw the button with a
-// slightly lighter color. We do this by just reducing the alpha.
-const CGFloat kImageNoFocusAlpha = 0.65;
-
-// The default COLOR_TAB_TEXT color.
-const SkColor kDefaultTabTextColor = SkColorSetARGB(0xA0, 0x00, 0x00, 0x00);
-
-}  // namespace tabs
-
-@class TabControllerCocoa, TabWindowController, GTMFadeTruncatingTextFieldCell;
-
-// A view that handles the event tracking (clicking and dragging) for a tab
-// on the tab strip. Relies on an associated TabControllerCocoa to provide a
-// target/action for selecting the tab.
-
-@interface TabViewCocoa : NSControl<ThemedWindowDrawing> {
- @private
-  TabControllerCocoa* controller_;
-  base::scoped_nsobject<NSTextField> titleView_;
-  GTMFadeTruncatingTextFieldCell* titleViewCell_;  // weak
-
-  // TODO(rohitrao): Add this button to a CoreAnimation layer so we can fade it
-  // in and out on mouseovers.
-  HoverCloseButton* closeButton_;  // Weak.
-
-  BOOL closing_;
-
-  BOOL isMouseInside_;  // Is the mouse hovering over?
-
-  CGFloat hoverAlpha_;  // How strong the hover glow is.
-  NSTimeInterval hoverHoldEndTime_;  // When the hover glow will begin dimming.
-
-  NSTimeInterval lastGlowUpdate_;  // Time the glow was last updated.
-
-  NSPoint hoverPoint_;  // Current location of hover in view coords.
-
-  // The location of the current mouseDown event in window coordinates.
-  NSPoint mouseDownPoint_;
-
-  NSCellStateValue state_;
-
-  // The tool tip text for this tab view.
-  base::scoped_nsobject<NSString> toolTipText_;
-}
-
-@property(readonly, nonatomic) BOOL isActiveTab;
-@property(retain, nonatomic) NSString* title;
-@property(assign, nonatomic) NSRect titleFrame;
-@property(retain, nonatomic) NSColor* titleColor;
-@property(assign, nonatomic) BOOL titleHidden;
-
-// The state affects how the tab will be drawn.
-// NSOnState    -> active
-// NSMixedState -> selected
-// NSOffState   -> none
-@property(assign, nonatomic) NSCellStateValue state;
-
-@property(assign, nonatomic) CGFloat hoverAlpha;
-
-// Determines if the tab is in the process of animating closed. It may still
-// be visible on-screen, but should not respond to/initiate any events. Upon
-// setting to NO, clears the target/action of the close button to prevent
-// clicks inside it from sending messages.
-@property(assign, nonatomic, getter=isClosing) BOOL closing;
-
-// The tool tip text for this tab view.
-@property(copy, nonatomic) NSString* toolTipText;
-
-// Designated initializer.
-- (id)initWithFrame:(NSRect)frame
-         controller:(TabControllerCocoa*)controller
-        closeButton:(HoverCloseButton*)closeButton;
-
-// Enables/Disables tracking regions for the tab.
-- (void)setTrackingEnabled:(BOOL)enabled;
-
-// Returns the width of the largest part of the tab that is available for the
-// user to click to select/activate the tab.
-- (int)widthOfLargestSelectableRegion;
-
-// Returns the Material Design color of the icons. Used by the "x" and the
-// default favicon.
-- (SkColor)iconColor;
-
-// Returns the Material Design color of the alert indicator.
-- (SkColor)alertIndicatorColorForState:(TabAlertState)state;
-
-// Called when systemwide accessibility options change.
-- (void)accessibilityOptionsDidChange:(id)ignored;
-
-@end
-
-// The TabControllerCocoa |controller_| is not the only owner of this view. If
-// the controller is released before this view, then we could be hanging onto a
-// garbage pointer. To prevent this, the TabControllerCocoa uses this interface
-// to clear the |controller_| pointer when it is dying.
-@interface TabViewCocoa (TabControllerInterface)
-- (void)setController:(TabControllerCocoa*)controller;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_TABS_TAB_VIEW_H_
diff --git a/chrome/browser/ui/cocoa/tabs/tab_view.mm b/chrome/browser/ui/cocoa/tabs/tab_view.mm
deleted file mode 100644
index 99330e01..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_view.mm
+++ /dev/null
@@ -1,1057 +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.
-
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-
-#include "base/command_line.h"
-#include "base/i18n/rtl.h"
-#include "base/logging.h"
-#include "base/mac/sdk_forward_declarations.h"
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/browser/themes/theme_properties.h"
-#include "chrome/browser/themes/theme_service.h"
-#include "chrome/browser/ui/cocoa/cocoa_util.h"
-#include "chrome/browser/ui/cocoa/l10n_util.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_window_controller.h"
-#import "chrome/browser/ui/cocoa/themed_window.h"
-#import "chrome/browser/ui/cocoa/view_id_util.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/grit/theme_resources.h"
-#include "skia/ext/skia_utils_mac.h"
-#import "third_party/google_toolbox_for_mac/src/AppKit/GTMFadeTruncatingTextFieldCell.h"
-#import "ui/base/cocoa/nsgraphics_context_additions.h"
-#import "ui/base/cocoa/nsview_additions.h"
-#include "ui/base/cocoa/three_part_image.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/material_design/material_design_controller.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
-#include "ui/strings/grit/ui_strings.h"
-
-namespace {
-
-// The color of the icons in dark mode theme.
-const SkColor kDarkModeIconColor = SkColorSetARGB(0xFF, 0xC4, 0xC4, 0xC4);
-
-bool IsTabStripKeyboardFocusEnabled() {
-  return base::FeatureList::IsEnabled(features::kTabStripKeyboardFocus) &&
-         [NSApp isFullKeyboardAccessEnabled];
-}
-
-}  // namespace
-
-// The amount of time in seconds during which each type of glow increases, holds
-// steady, and decreases, respectively.
-const NSTimeInterval kHoverShowDuration = 0.2;
-const NSTimeInterval kHoverHoldDuration = 0.02;
-const NSTimeInterval kHoverHideDuration = 0.4;
-
-// The default time interval in seconds between glow updates (when
-// increasing/decreasing).
-const NSTimeInterval kGlowUpdateInterval = 0.025;
-
-// The intensity of the white overlay when hovering the mouse over a tab.
-const CGFloat kMouseHoverWhiteValue = 1.0;
-const CGFloat kMouseHoverWhiteValueIncongito = 0.3;
-
-// This is used to judge whether the mouse has moved during rapid closure; if it
-// has moved less than the threshold, we want to close the tab.
-const CGFloat kRapidCloseDist = 2.5;
-
-@interface NSView (PrivateTabViewAPI)
-// Called by AppKit to check if dragging this view should move the window.
-// NSButton overrides this method in the same way so dragging window buttons
-// has no effect. NSView implementation returns NSZeroRect so the whole view
-// area can be dragged.
-- (NSRect)_opaqueRectForWindowMoveWhenInTitlebar;
-@end
-
-// This class contains the logic for drawing Material Design tab images. The
-// |setTabEdgeStrokeColor| method is overridden by |TabHeavyImageMaker| to draw
-// high-contrast tabs.
-@interface TabImageMaker : NSObject
-+ (void)drawTabLeftMaskImage;
-+ (void)drawTabRightMaskImage;
-+ (void)drawTabLeftEdgeImage;
-+ (void)drawTabMiddleEdgeImage;
-+ (void)drawTabRightEdgeImage;
-+ (void)setTabEdgeStrokeColor;
-@end
-
-@interface TabHeavyImageMaker : TabImageMaker
-+ (void)setTabEdgeStrokeColor;
-@end
-
-@interface TabHeavyInvertedImageMaker : TabImageMaker
-+ (void)setTabEdgeStrokeColor;
-@end
-
-extern NSString* const
-    NSWorkspaceAccessibilityDisplayOptionsDidChangeNotification;
-
-namespace {
-
-enum StrokeType {
-  STROKE_NORMAL,
-  STROKE_HEAVY,
-  STROKE_HEAVY_INVERTED,
-};
-
-Class drawingClassForStrokeType(StrokeType stroke_type) {
-  switch (stroke_type) {
-    case STROKE_NORMAL:
-      return [TabImageMaker class];
-    case STROKE_HEAVY:
-      return [TabHeavyImageMaker class];
-    case STROKE_HEAVY_INVERTED:
-      return [TabHeavyInvertedImageMaker class];
-  }
-}
-
-NSImage* imageForResourceID(int resource_id, StrokeType stroke_type) {
-  CGFloat imageWidth = resource_id == IDR_TAB_ACTIVE_CENTER ? 1 : 18;
-  SEL theSelector = 0;
-  switch (resource_id) {
-    case IDR_TAB_ACTIVE_LEFT:
-      theSelector = @selector(drawTabLeftEdgeImage);
-      break;
-
-    case IDR_TAB_ACTIVE_CENTER:
-      theSelector = @selector(drawTabMiddleEdgeImage);
-      break;
-
-    case IDR_TAB_ACTIVE_RIGHT:
-      theSelector = @selector(drawTabRightEdgeImage);
-      break;
-
-    case IDR_TAB_ALPHA_LEFT:
-      theSelector = @selector(drawTabLeftMaskImage);
-      break;
-
-    case IDR_TAB_ALPHA_RIGHT:
-      theSelector = @selector(drawTabRightMaskImage);
-      break;
-  }
-  DCHECK(theSelector);
-
-  Class makerClass = drawingClassForStrokeType(stroke_type);
-  base::scoped_nsobject<NSCustomImageRep> imageRep([[NSCustomImageRep alloc]
-      initWithDrawSelector:theSelector
-                  delegate:makerClass]);
-
-  NSImage* newTabButtonImage =
-      [[[NSImage alloc] initWithSize:NSMakeSize(imageWidth, 29)] autorelease];
-  [newTabButtonImage setCacheMode:NSImageCacheAlways];
-  [newTabButtonImage addRepresentation:imageRep];
-
-  return newTabButtonImage;
-}
-
-ui::ThreePartImage& GetMaskImage() {
-  CR_DEFINE_STATIC_LOCAL(
-      ui::ThreePartImage, mask,
-      (imageForResourceID(IDR_TAB_ALPHA_LEFT, STROKE_NORMAL), nullptr,
-       imageForResourceID(IDR_TAB_ALPHA_RIGHT, STROKE_NORMAL)));
-
-  return mask;
-}
-
-ui::ThreePartImage& GetStrokeImage(bool active, StrokeType stroke_type) {
-  CR_DEFINE_STATIC_LOCAL(
-      ui::ThreePartImage, stroke,
-      (imageForResourceID(IDR_TAB_ACTIVE_LEFT, STROKE_NORMAL),
-       imageForResourceID(IDR_TAB_ACTIVE_CENTER, STROKE_NORMAL),
-       imageForResourceID(IDR_TAB_ACTIVE_RIGHT, STROKE_NORMAL)));
-  CR_DEFINE_STATIC_LOCAL(
-      ui::ThreePartImage, heavyStroke,
-      (imageForResourceID(IDR_TAB_ACTIVE_LEFT, STROKE_HEAVY),
-       imageForResourceID(IDR_TAB_ACTIVE_CENTER, STROKE_HEAVY),
-       imageForResourceID(IDR_TAB_ACTIVE_RIGHT, STROKE_HEAVY)));
-  CR_DEFINE_STATIC_LOCAL(
-      ui::ThreePartImage, heavyInvertedStroke,
-      (imageForResourceID(IDR_TAB_ACTIVE_LEFT, STROKE_HEAVY_INVERTED),
-       imageForResourceID(IDR_TAB_ACTIVE_CENTER, STROKE_HEAVY_INVERTED),
-       imageForResourceID(IDR_TAB_ACTIVE_RIGHT, STROKE_HEAVY_INVERTED)));
-
-  switch (stroke_type) {
-    case STROKE_NORMAL:
-      return stroke;
-    case STROKE_HEAVY:
-      return heavyStroke;
-    case STROKE_HEAVY_INVERTED:
-      return heavyInvertedStroke;
-  }
-}
-
-}  // namespace
-
-@interface TabViewCocoa (Private)
-
-- (void)resetLastGlowUpdateTime;
-- (NSTimeInterval)timeElapsedSinceLastGlowUpdate;
-- (void)adjustGlowValue;
-
-@end  // TabViewCocoa(Private)
-
-@implementation TabViewCocoa
-
-@synthesize state = state_;
-@synthesize hoverAlpha = hoverAlpha_;
-@synthesize closing = closing_;
-
-+ (CGFloat)maskImageFillHeight {
-  // Return the height of the "mask on" part of the mask bitmap.
-  return [TabControllerCocoa defaultTabHeight] - 1;
-}
-
-- (id)initWithFrame:(NSRect)frame
-         controller:(TabControllerCocoa*)controller
-        closeButton:(HoverCloseButton*)closeButton {
-  self = [super initWithFrame:frame];
-  if (self) {
-    controller_ = controller;
-    closeButton_ = closeButton;
-    [self addSubview:closeButton_];
-
-    // Make a text field for the title, but don't add it as a subview.
-    // We will use the cell to draw the text directly into our layer,
-    // so that we can get font smoothing enabled.
-    titleView_.reset([[NSTextField alloc] init]);
-    [titleView_ setAutoresizingMask:NSViewWidthSizable];
-    base::scoped_nsobject<GTMFadeTruncatingTextFieldCell> labelCell(
-        [[GTMFadeTruncatingTextFieldCell alloc] initTextCell:@"Label"]);
-    [labelCell setControlSize:NSSmallControlSize];
-    if (cocoa_l10n_util::ShouldDoExperimentalRTLLayout())
-      [labelCell setAlignment:NSRightTextAlignment];
-    [titleView_ setCell:labelCell];
-    titleViewCell_ = labelCell;
-
-    [self setWantsLayer:YES];  // -drawFill: needs a layer.
-
-    if (@available(macOS 10.10, *)) {
-      NSNotificationCenter* center =
-          [[NSWorkspace sharedWorkspace] notificationCenter];
-      [center
-          addObserver:self
-             selector:@selector(accessibilityOptionsDidChange:)
-                 name:
-                     NSWorkspaceAccessibilityDisplayOptionsDidChangeNotification
-               object:nil];
-    }
-  }
-  return self;
-}
-
-- (void)dealloc {
-  // Cancel any delayed requests that may still be pending (drags or hover).
-  [NSObject cancelPreviousPerformRequestsWithTarget:self];
-  if (@available(macOS 10.10, *)) {
-    NSNotificationCenter* center =
-        [[NSWorkspace sharedWorkspace] notificationCenter];
-    [center removeObserver:self];
-  }
-  [super dealloc];
-}
-
-// Called by AppKit to check if dragging this view should move the window.
-// NSButton overrides this method in the same way so dragging window buttons
-// has no effect.
-- (NSRect)_opaqueRectForWindowMoveWhenInTitlebar {
-  return [self bounds];
-}
-
-// Called to obtain the context menu for when the user hits the right mouse
-// button (or control-clicks). (Note that -rightMouseDown: is *not* called for
-// control-click.)
-- (NSMenu*)menu {
-  if ([self isClosing])
-    return nil;
-
-  return [controller_ menu];
-}
-
-- (void)resizeSubviewsWithOldSize:(NSSize)oldBoundsSize {
-  [super resizeSubviewsWithOldSize:oldBoundsSize];
-  // Called when our view is resized. If it gets too small, start by hiding
-  // the close button and only show it if tab is selected. Eventually, hide the
-  // icon as well.
-  [controller_ updateVisibility];
-}
-
-// Overridden so that mouse clicks come to this view (the parent of the
-// hierarchy) first. We want to handle clicks and drags in this class and
-// leave the background button for display purposes only.
-- (BOOL)acceptsFirstMouse:(NSEvent*)theEvent {
-  return YES;
-}
-
-- (void)mouseEntered:(NSEvent*)theEvent {
-  isMouseInside_ = YES;
-  [self resetLastGlowUpdateTime];
-  [self adjustGlowValue];
-}
-
-- (void)mouseMoved:(NSEvent*)theEvent {
-  if (state_ == NSOffState) {
-    hoverPoint_ = [self convertPoint:[theEvent locationInWindow] fromView:nil];
-    [self setNeedsDisplay:YES];
-  }
-}
-
-- (void)mouseExited:(NSEvent*)theEvent {
-  isMouseInside_ = NO;
-  hoverHoldEndTime_ =
-      [NSDate timeIntervalSinceReferenceDate] + kHoverHoldDuration;
-  [self resetLastGlowUpdateTime];
-  [self adjustGlowValue];
-}
-
-- (void)setTrackingEnabled:(BOOL)enabled {
-  if (![closeButton_ isHidden]) {
-    [closeButton_ setTrackingEnabled:enabled];
-  }
-}
-
-// Determines which view a click in our frame actually hit. It's either this
-// view or one of the child buttons.
-- (NSView*)hitTest:(NSPoint)aPoint {
-  NSView* const defaultHitTestResult = [super hitTest:aPoint];
-  if ([defaultHitTestResult isKindOfClass:[NSButton class]])
-    return defaultHitTestResult;
-
-  NSPoint viewPoint = [self convertPoint:aPoint fromView:[self superview]];
-  NSRect maskRect = [self bounds];
-  maskRect.size.height = [TabViewCocoa maskImageFillHeight];
-  return GetMaskImage().HitTest(viewPoint, maskRect) ? self : nil;
-}
-
-// Handle clicks and drags in this button. We get here because we have
-// overridden acceptsFirstMouse: and the click is within our bounds.
-- (void)mouseDown:(NSEvent*)theEvent {
-  if ([self isClosing])
-    return;
-
-  // Record the point at which this event happened. This is used by other mouse
-  // events that are dispatched from |-maybeStartDrag::|.
-  mouseDownPoint_ = [theEvent locationInWindow];
-
-  // Record the state of the close button here, because selecting the tab will
-  // unhide it.
-  BOOL closeButtonActive = ![closeButton_ isHidden];
-
-  // During the tab closure animation (in particular, during rapid tab closure),
-  // we may get incorrectly hit with a mouse down. If it should have gone to the
-  // close button, we send it there -- it should then track the mouse, so we
-  // don't have to worry about mouse ups.
-  if (closeButtonActive && [controller_ inRapidClosureMode]) {
-    NSPoint hitLocation = [[self superview] convertPoint:mouseDownPoint_
-                                                fromView:nil];
-    if ([self hitTest:hitLocation] == closeButton_) {
-      [closeButton_ mouseDown:theEvent];
-      return;
-    }
-  }
-
-  // If the tab gets torn off, the tab controller will be removed from the tab
-  // strip and then deallocated. This will also result in *us* being
-  // deallocated. Both these are bad, so we prevent this by retaining the
-  // controller.
-  base::scoped_nsobject<TabControllerCocoa> controller([controller_ retain]);
-
-  // Try to initiate a drag. This will spin a custom event loop and may
-  // dispatch other mouse events.
-  [controller_ maybeStartDrag:theEvent forTab:controller];
-
-  // The custom loop has ended, so clear the point.
-  mouseDownPoint_ = NSZeroPoint;
-}
-
-- (void)mouseUp:(NSEvent*)theEvent {
-  // Check for rapid tab closure.
-  if ([theEvent type] == NSLeftMouseUp) {
-    NSPoint upLocation = [theEvent locationInWindow];
-    CGFloat dx = upLocation.x - mouseDownPoint_.x;
-    CGFloat dy = upLocation.y - mouseDownPoint_.y;
-
-    // During rapid tab closure (mashing tab close buttons), we may get hit
-    // with a mouse down. As long as the mouse up is over the close button,
-    // and the mouse hasn't moved too much, we close the tab.
-    if (![closeButton_ isHidden] &&
-        (dx*dx + dy*dy) <= kRapidCloseDist*kRapidCloseDist &&
-        [controller_ inRapidClosureMode]) {
-      NSPoint hitLocation =
-          [[self superview] convertPoint:[theEvent locationInWindow]
-                                fromView:nil];
-      if ([self hitTest:hitLocation] == closeButton_) {
-        [controller_ closeTab:self];
-        return;
-      }
-    }
-  }
-
-  // Except in the rapid tab closure case, mouseDown: triggers a nested run loop
-  // that swallows the mouseUp: event. There's a bug in AppKit that sends
-  // mouseUp: callbacks to inappropriate views, so it's doubly important that
-  // this method doesn't do anything. https://crbug.com/511095.
-  [super mouseUp:theEvent];
-}
-
-- (void)otherMouseUp:(NSEvent*)theEvent {
-  if ([self isClosing])
-    return;
-
-  // Support middle-click-to-close.
-  if ([theEvent buttonNumber] == 2) {
-    // |-hitTest:| takes a location in the superview's coordinates.
-    NSPoint upLocation =
-        [[self superview] convertPoint:[theEvent locationInWindow]
-                              fromView:nil];
-    // If the mouse up occurred in our view or over the close button, then
-    // close.
-    if ([self hitTest:upLocation])
-      [controller_ closeTab:self];
-  }
-}
-
-// Returns the color used to draw the background of a tab. |selected| selects
-// between the foreground and background tabs.
-- (NSColor*)backgroundColorForSelected:(bool)selected {
-  const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-  if (!themeProvider)
-    return [[self window] backgroundColor];
-
-  int bitmapResources[2][2] = {
-    // Background window.
-    {
-      IDR_THEME_TAB_BACKGROUND_INACTIVE,  // Background tab.
-      IDR_THEME_TOOLBAR_INACTIVE,         // Active tab.
-    },
-    // Currently focused window.
-    {
-      IDR_THEME_TAB_BACKGROUND,  // Background tab.
-      IDR_THEME_TOOLBAR,         // Active tab.
-    },
-  };
-
-  // Themes don't have an inactive image so only look for one if there's no
-  // theme.
-  bool active =
-      [[self window] isMainWindow] || !themeProvider->UsingSystemTheme();
-  return themeProvider->GetNSImageColorNamed(bitmapResources[active][selected]);
-}
-
-// Draws the tab background.
-- (void)drawFill:(NSRect)dirtyRect {
-  gfx::ScopedNSGraphicsContextSaveGState scopedGState;
-  NSRect bounds = [self bounds];
-
-  NSRect clippingRect = bounds;
-  clippingRect.size.height = [TabViewCocoa maskImageFillHeight];
-  if (state_ != NSOnState) {
-    // Background tabs should not paint over the tab strip separator, which is
-    // two pixels high in both lodpi and hidpi, and one pixel high in MD.
-    CGFloat tabStripSeparatorLineWidth = [self cr_lineWidth];
-    clippingRect.origin.y = tabStripSeparatorLineWidth;
-    clippingRect.size.height -= tabStripSeparatorLineWidth;
-  }
-  NSRectClip(clippingRect);
-
-  NSPoint position = [[self window]
-      themeImagePositionForAlignment:THEME_IMAGE_ALIGN_WITH_TAB_STRIP];
-  [[NSGraphicsContext currentContext] cr_setPatternPhase:position forView:self];
-
-  [[self backgroundColorForSelected:(state_ != NSOffState)] set];
-  NSRectFill(dirtyRect);
-
-  if (state_ == NSOffState)
-    [self drawGlow:dirtyRect];
-
-  // If we filled outside the middle rect, we need to erase what we filled
-  // outside the tab's shape.
-  // This only works if we are drawing to our own backing layer.
-  if (!NSContainsRect(GetMaskImage().GetMiddleRect(bounds), dirtyRect)) {
-    DCHECK([self layer]);
-    GetMaskImage().DrawInRect(bounds, NSCompositeDestinationIn, 1.0);
-  }
-}
-
-// Draw the glow for hover and the overlay for alerts.
-- (void)drawGlow:(NSRect)dirtyRect {
-  NSGraphicsContext* context = [NSGraphicsContext currentContext];
-  CGContextRef cgContext = static_cast<CGContextRef>([context graphicsPort]);
-
-  CGFloat hoverAlpha = [self hoverAlpha];
-  if (hoverAlpha > 0) {
-    CGContextBeginTransparencyLayer(cgContext, 0);
-
-    // The hover glow brings up the overlay's opacity at most 50%.
-    CGFloat backgroundAlpha = 0.5 * hoverAlpha;
-    CGContextSetAlpha(cgContext, backgroundAlpha);
-
-    [[self backgroundColorForSelected:YES] set];
-    NSRectFill(dirtyRect);
-
-    // ui::ThemeProvider::HasCustomImage is true only if the theme provides the
-    // image. However, even if the theme doesn't provide a tab background, the
-    // theme machinery will make one if given a frame image. See
-    // BrowserThemePack::GenerateTabBackgroundImages for details.
-    const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-    BOOL hasCustomTheme = themeProvider &&
-        (themeProvider->HasCustomImage(IDR_THEME_TAB_BACKGROUND) ||
-         themeProvider->HasCustomImage(IDR_THEME_FRAME));
-    // Draw a mouse hover gradient for the default themes.
-    if (hoverAlpha > 0) {
-      if (themeProvider && !hasCustomTheme) {
-        CGFloat whiteValue = kMouseHoverWhiteValue;
-        if (themeProvider && themeProvider->InIncognitoMode()) {
-          whiteValue = kMouseHoverWhiteValueIncongito;
-        }
-        base::scoped_nsobject<NSGradient> glow([NSGradient alloc]);
-        [glow initWithStartingColor:[NSColor colorWithCalibratedWhite:whiteValue
-                                        alpha:1.0 * hoverAlpha]
-                        endingColor:[NSColor colorWithCalibratedWhite:whiteValue
-                                                                alpha:0.0]];
-        NSRect rect = [self bounds];
-        NSPoint point = hoverPoint_;
-        point.y = NSHeight(rect);
-        [glow drawFromCenter:point
-                      radius:0.0
-                    toCenter:point
-                      radius:NSWidth(rect) / 3.0
-                     options:NSGradientDrawsBeforeStartingLocation];
-      }
-    }
-
-    CGContextEndTransparencyLayer(cgContext);
-  }
-}
-
-// Draws the tab outline.
-- (void)drawStroke:(NSRect)dirtyRect {
-  // In MD, the tab stroke is always opaque.
-  CGFloat alpha = 1;
-  NSRect bounds = [self bounds];
-  // In Material Design the tab strip separator is always 1 pixel high -
-  // add a clip rect to avoid drawing the tab edge over it.
-  NSRect clipRect = bounds;
-  clipRect.origin.y += [self cr_lineWidth];
-  NSRectClip(clipRect);
-  const ui::ThemeProvider* provider = [[self window] themeProvider];
-  StrokeType stroke_type = STROKE_NORMAL;
-  if (provider && provider->ShouldIncreaseContrast()) {
-    stroke_type =
-        [[self window] hasDarkTheme] ? STROKE_HEAVY_INVERTED : STROKE_HEAVY;
-  }
-  GetStrokeImage(state_ == NSOnState, stroke_type)
-      .DrawInRect(bounds, NSCompositeSourceOver, alpha);
-}
-
-- (void)drawRect:(NSRect)dirtyRect {
-  [self drawFill:dirtyRect];
-  [self drawStroke:dirtyRect];
-
-  // We draw the title string directly instead of using a NSTextField subview.
-  // This is so that we can get font smoothing to work on earlier OS, and even
-  // when the tab background is a pattern image (when using themes).
-  if (![titleView_ isHidden]) {
-    gfx::ScopedNSGraphicsContextSaveGState scopedGState;
-    NSGraphicsContext* context = [NSGraphicsContext currentContext];
-    CGContextRef cgContext = static_cast<CGContextRef>([context graphicsPort]);
-    CGContextSetShouldSmoothFonts(cgContext, true);
-    [[titleView_ cell] drawWithFrame:[titleView_ frame] inView:self];
-  }
-}
-
-- (void)setFrameOrigin:(NSPoint)origin {
-  // The background color depends on the view's vertical position.
-  if (NSMinY([self frame]) != origin.y)
-    [self setNeedsDisplay:YES];
-  [super setFrameOrigin:origin];
-}
-
-- (void)setToolTipText:(NSString*)string {
-  toolTipText_.reset([string copy]);
-}
-
-- (NSString*)toolTipText {
-  return toolTipText_;
-}
-
-- (void)viewDidMoveToWindow {
-  [super viewDidMoveToWindow];
-  if ([self window]) {
-    [controller_ updateTitleColor];
-
-    // The new window may have different main window status.
-    // This happens when the view is moved into a TabWindowOverlayWindow for
-    // tab dragging.
-    [self windowDidChangeActive];
-  }
-}
-
-- (BOOL)isActiveTab {
-  return [controller_ active];
-}
-
-- (NSString*)title {
-  return [titleView_ stringValue];
-}
-
-- (void)setTitle:(NSString*)title {
-  if ([title isEqualToString:[titleView_ stringValue]])
-    return;
-
-  [titleView_ setStringValue:title];
-  [closeButton_ setAccessibilityTitle:title];
-
-  base::string16 title16 = base::SysNSStringToUTF16(title);
-  bool isRTL = base::i18n::GetFirstStrongCharacterDirection(title16) ==
-               base::i18n::RIGHT_TO_LEFT;
-  titleViewCell_.truncateMode = isRTL ? GTMFadeTruncatingHead
-                                      : GTMFadeTruncatingTail;
-
-  [self setNeedsDisplayInRect:[titleView_ frame]];
-}
-
-- (NSRect)titleFrame {
-  return [titleView_ frame];
-}
-
-- (void)setTitleFrame:(NSRect)titleFrame {
-  NSRect oldTitleFrame = [titleView_ frame];
-  if (NSEqualRects(titleFrame, oldTitleFrame))
-    return;
-  [titleView_ setFrame:titleFrame];
-  [self setNeedsDisplayInRect:NSUnionRect(titleFrame, oldTitleFrame)];
-}
-
-- (NSColor*)titleColor {
-  return [titleView_ textColor];
-}
-
-- (void)setTitleColor:(NSColor*)titleColor {
-  if ([titleColor isEqual:[titleView_ textColor]])
-    return;
-  [titleView_ setTextColor:titleColor];
-  [self setNeedsDisplayInRect:[titleView_ frame]];
-  [self updateAppearance];
-}
-
-- (BOOL)titleHidden {
-  return [titleView_ isHidden];
-}
-
-- (void)setTitleHidden:(BOOL)titleHidden {
-  if (titleHidden == [titleView_ isHidden])
-    return;
-  [titleView_ setHidden:titleHidden];
-  [self setNeedsDisplayInRect:[titleView_ frame]];
-}
-
-- (SkColor)iconColor {
-  if ([[self window] hasDarkTheme])
-    return kDarkModeIconColor;
-
-  const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-  if (themeProvider) {
-    bool useActiveTabTextColor = [self isActiveTab];
-
-    const SkColor titleColor =
-        useActiveTabTextColor
-            ? themeProvider->GetColor(ThemeProperties::COLOR_TAB_TEXT)
-            : themeProvider->GetColor(
-                  ThemeProperties::COLOR_BACKGROUND_TAB_TEXT);
-    return SkColorSetA(titleColor, 0xA0);
-  }
-
-  return tabs::kDefaultTabTextColor;
-}
-
-- (SkColor)alertIndicatorColorForState:(TabAlertState)state {
-  // If theme provider is not yet available, return the default button
-  // color.
-  const ui::ThemeProvider* themeProvider = [[self window] themeProvider];
-  if (!themeProvider)
-    return [self iconColor];
-
-  switch (state) {
-    case TabAlertState::MEDIA_RECORDING:
-      return themeProvider->GetColor(
-          ThemeProperties::COLOR_TAB_ALERT_RECORDING);
-    case TabAlertState::PIP_PLAYING:
-      return themeProvider->GetColor(ThemeProperties::COLOR_TAB_PIP_PLAYING);
-    case TabAlertState::AUDIO_PLAYING:
-    case TabAlertState::AUDIO_MUTING:
-    case TabAlertState::TAB_CAPTURING:
-    case TabAlertState::BLUETOOTH_CONNECTED:
-    case TabAlertState::USB_CONNECTED:
-    case TabAlertState::NONE:
-      return [self iconColor];
-    default:
-      NOTREACHED();
-      return [self iconColor];
-  }
-}
-
-- (void)accessibilityOptionsDidChange:(id)ignored {
-  [self updateAppearance];
-  [self setNeedsDisplay:YES];
-}
-
-- (void)updateAppearance {
-  CGFloat fontSize = [titleViewCell_ font].pointSize;
-  const ui::ThemeProvider* provider = [[self window] themeProvider];
-  if (provider && provider->ShouldIncreaseContrast() && state_ == NSOnState) {
-    [titleViewCell_ setFont:[NSFont boldSystemFontOfSize:fontSize]];
-  } else {
-    [titleViewCell_ setFont:[NSFont systemFontOfSize:fontSize]];
-  }
-
-  [closeButton_ setIconColor:[self iconColor]];
-}
-
-- (void)setState:(NSCellStateValue)state {
-  if (state_ == state)
-    return;
-  state_ = state;
-  [self updateAppearance];
-  [self setNeedsDisplay:YES];
-}
-
-- (void)setClosing:(BOOL)closing {
-  closing_ = closing;  // Safe because the property is nonatomic.
-  // When closing, ensure clicks to the close button go nowhere.
-  if (closing) {
-    [closeButton_ setTarget:nil];
-    [closeButton_ setAction:nil];
-  }
-}
-
-- (int)widthOfLargestSelectableRegion {
-  // Assume the entire region to the left of the alert indicator and/or close
-  // buttons is available for click-to-select.  If neither are visible, the
-  // entire tab region is available.
-  const int indicatorLeft = NSWidth([self frame]);
-  const int closeButtonLeft = (!closeButton_ || [closeButton_ isHidden])
-                                  ? NSWidth([self frame])
-                                  : NSMinX([closeButton_ frame]);
-  return std::min(indicatorLeft, closeButtonLeft);
-}
-
-- (BOOL)accessibilityIsIgnored {
-  return NO;
-}
-
-- (NSArray*)accessibilityActionNames {
-  NSArray* parentActions = [super accessibilityActionNames];
-
-  return [parentActions arrayByAddingObject:NSAccessibilityPressAction];
-}
-
-- (NSArray*)accessibilityAttributeNames {
-  NSMutableArray* attributes =
-      [[super accessibilityAttributeNames] mutableCopy];
-  [attributes addObject:NSAccessibilityTitleAttribute];
-  [attributes addObject:NSAccessibilityEnabledAttribute];
-  [attributes addObject:NSAccessibilityValueAttribute];
-
-  return [attributes autorelease];
-}
-
-- (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute {
-  if ([attribute isEqual:NSAccessibilityTitleAttribute])
-    return NO;
-
-  if ([attribute isEqual:NSAccessibilityEnabledAttribute])
-    return NO;
-
-  if ([attribute isEqual:NSAccessibilityValueAttribute])
-    return YES;
-
-  return [super accessibilityIsAttributeSettable:attribute];
-}
-
-- (void)accessibilityPerformAction:(NSString*)action {
-  if ([action isEqual:NSAccessibilityPressAction] &&
-      [[controller_ target] respondsToSelector:[controller_ action]]) {
-    [[controller_ target] performSelector:[controller_ action]
-        withObject:self];
-    NSAccessibilityPostNotification(self,
-                                    NSAccessibilityValueChangedNotification);
-  } else {
-    [super accessibilityPerformAction:action];
-  }
-}
-
-- (id)accessibilityAttributeValue:(NSString*)attribute {
-  if ([attribute isEqual:NSAccessibilityRoleAttribute])
-    return NSAccessibilityRadioButtonRole;
-  if ([attribute isEqual:NSAccessibilityRoleDescriptionAttribute])
-    return l10n_util::GetNSStringWithFixup(IDS_ACCNAME_TAB_ROLE_DESCRIPTION);
-  if ([attribute isEqual:NSAccessibilityTitleAttribute])
-    return [controller_ accessibilityTitle];
-  if ([attribute isEqual:NSAccessibilityValueAttribute])
-    return [NSNumber numberWithInt:[controller_ selected]];
-  if ([attribute isEqual:NSAccessibilityEnabledAttribute])
-    return [NSNumber numberWithBool:YES];
-
-  return [super accessibilityAttributeValue:attribute];
-}
-
-- (ViewID)viewID {
-  return VIEW_ID_TAB;
-}
-
-// ThemedWindowDrawing implementation.
-
-- (void)windowDidChangeTheme {
-  [self setNeedsDisplay:YES];
-}
-
-- (void)windowDidChangeActive {
-  [self setNeedsDisplay:YES];
-}
-
-- (BOOL)acceptsFirstResponder {
-  return IsTabStripKeyboardFocusEnabled() ? YES : NO;
-}
-
-- (BOOL)becomeFirstResponder {
-  return IsTabStripKeyboardFocusEnabled() ? YES : NO;
-}
-
-- (void)drawFocusRingMask {
-  if (!IsTabStripKeyboardFocusEnabled())
-    return;
-  if ([titleView_ isHidden])
-    NSRectFill([self bounds]);
-  else
-    NSRectFill([titleView_ frame]);
-}
-
-- (NSRect)focusRingMaskBounds {
-  return [self bounds];
-}
-
-@end  // @implementation TabViewCocoa
-
-@implementation TabViewCocoa (TabControllerInterface)
-
-- (void)setController:(TabControllerCocoa*)controller {
-  controller_ = controller;
-}
-
-@end  // @implementation TabViewCocoa (TabControllerInterface)
-
-@implementation TabViewCocoa (Private)
-
-- (void)resetLastGlowUpdateTime {
-  lastGlowUpdate_ = [NSDate timeIntervalSinceReferenceDate];
-}
-
-- (NSTimeInterval)timeElapsedSinceLastGlowUpdate {
-  return [NSDate timeIntervalSinceReferenceDate] - lastGlowUpdate_;
-}
-
-- (void)adjustGlowValue {
-  // A time interval long enough to represent no update.
-  const NSTimeInterval kNoUpdate = 1000000;
-
-  // Time until next update for either glow.
-  NSTimeInterval nextUpdate = kNoUpdate;
-
-  NSTimeInterval elapsed = [self timeElapsedSinceLastGlowUpdate];
-  NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate];
-
-  // TODO(viettrungluu): <http://crbug.com/30617> -- split off the stuff below
-  // into a pure function and add a unit test.
-
-  CGFloat hoverAlpha = [self hoverAlpha];
-  if (isMouseInside_) {
-    // Increase hover glow until it's 1.
-    if (hoverAlpha < 1) {
-      hoverAlpha = MIN(hoverAlpha + elapsed / kHoverShowDuration, 1);
-      [self setHoverAlpha:hoverAlpha];
-      nextUpdate = MIN(kGlowUpdateInterval, nextUpdate);
-    }  // Else already 1 (no update needed).
-  } else {
-    if (currentTime >= hoverHoldEndTime_) {
-      // No longer holding, so decrease hover glow until it's 0.
-      if (hoverAlpha > 0) {
-        hoverAlpha = MAX(hoverAlpha - elapsed / kHoverHideDuration, 0);
-        [self setHoverAlpha:hoverAlpha];
-        nextUpdate = MIN(kGlowUpdateInterval, nextUpdate);
-      }  // Else already 0 (no update needed).
-    } else {
-      // Schedule update for end of hold time.
-      nextUpdate = MIN(hoverHoldEndTime_ - currentTime, nextUpdate);
-    }
-  }
-
-  if (nextUpdate < kNoUpdate)
-    [self performSelector:_cmd withObject:nil afterDelay:nextUpdate];
-
-  [self resetLastGlowUpdateTime];
-  [self setNeedsDisplay:YES];
-}
-
-@end  // @implementation TabViewCocoa(Private)
-
-@implementation TabImageMaker
-
-+ (NSBezierPath*)tabLeftEdgeBezierPathForContext:(CGContextRef)context {
-  NSBezierPath* bezierPath = [NSBezierPath bezierPath];
-
-  [bezierPath moveToPoint:NSMakePoint(-2, 0)];
-  [bezierPath curveToPoint:NSMakePoint(2.5, 2)
-             controlPoint1:NSMakePoint(1.805, -0.38)
-             controlPoint2:NSMakePoint(2.17, 1.415)];
-
-  [bezierPath lineToPoint:NSMakePoint(14, 27)];
-  [bezierPath curveToPoint:NSMakePoint(16, 29)
-             controlPoint1:NSMakePoint(14.25, 27.25)
-             controlPoint2:NSMakePoint(14.747467, 29.118899)];
-
-  [bezierPath lineToPoint:NSMakePoint(18, 29)];
-
-  if (!context) {
-    return bezierPath;
-  }
-
-  // The line width is always 1px.
-  CGFloat lineWidth = cocoa_util::LineWidthFromContext(context);
-  [bezierPath setLineWidth:lineWidth];
-
-  // Screen pixels lay between integral coordinates in user space. If you draw
-  // a line from (16, 29) to (18, 29), Core Graphics maps that line to the
-  // pixels that lay along y=28.5. In order to achieve a line that appears to
-  // along y=29, CG will perform dithering. To get a crisp line, you have to
-  // specify y=28.5. Translating the bezier path by the 1-pixel line width
-  // creates the crisp line we want.
-  // On a Retina display, there are pixels at y=28.25 and y=28.75, so
-  // translating the path down by one line width lights up the pixels at 28.75
-  // and leaves a gap along y=28.25. To fix this for the general case we'll
-  // translate up from 28 by one line width.
-  NSAffineTransform* translationTransform = [NSAffineTransform transform];
-  [translationTransform translateXBy:0 yBy:-1 + lineWidth / 2.];
-  [bezierPath transformUsingAffineTransform:translationTransform];
-
-  return bezierPath;
-}
-
-+ (void)setTabEdgeStrokeColor {
-  static NSColor* strokeColor =
-      [skia::SkColorToSRGBNSColor(SkColorSetARGB(76, 0, 0, 0)) retain];
-  [strokeColor set];
-}
-
-+ (void)drawTabLeftEdgeImage {
-  CGContextRef context = static_cast<CGContextRef>(
-      [[NSGraphicsContext currentContext] graphicsPort]);
-
-  [self setTabEdgeStrokeColor];
-  [[self tabLeftEdgeBezierPathForContext:context] stroke];
-}
-
-+ (void)drawTabMiddleEdgeImage {
-  NSBezierPath* middleEdgePath = [NSBezierPath bezierPath];
-  [middleEdgePath moveToPoint:NSMakePoint(0, 29)];
-  [middleEdgePath lineToPoint:NSMakePoint(1, 29)];
-  [middleEdgePath setLineCapStyle:NSSquareLineCapStyle];
-
-  CGContextRef context = static_cast<CGContextRef>(
-      [[NSGraphicsContext currentContext] graphicsPort]);
-  CGFloat lineWidth = cocoa_util::LineWidthFromContext(context);
-
-  // Line width is always 1px.
-  [middleEdgePath setLineWidth:lineWidth];
-
-  // Align to device pixels.
-  NSAffineTransform* translationTransform = [NSAffineTransform transform];
-  [translationTransform translateXBy:0 yBy:-1 + lineWidth / 2.];
-  [middleEdgePath transformUsingAffineTransform:translationTransform];
-
-  [self setTabEdgeStrokeColor];
-  [middleEdgePath stroke];
-}
-
-+ (void)drawTabRightEdgeImage {
-  CGContextRef context = static_cast<CGContextRef>(
-      [[NSGraphicsContext currentContext] graphicsPort]);
-
-  NSBezierPath* leftEdgePath = [self tabLeftEdgeBezierPathForContext:context];
-
-  // Draw the right edge path by flipping the left edge path vertically.
-  NSAffineTransform* transform = [NSAffineTransform transform];
-  [transform scaleXBy:-1 yBy:1];
-  [transform translateXBy:-18 yBy:0];
-  [leftEdgePath transformUsingAffineTransform:transform];
-
-  [self setTabEdgeStrokeColor];
-  [leftEdgePath stroke];
-}
-
-+ (NSBezierPath*)tabLeftMaskBezierPath {
-  NSBezierPath* bezierPath = [self tabLeftEdgeBezierPathForContext:nullptr];
-
-  // Box in the open edges.
-  [bezierPath lineToPoint:NSMakePoint(18, 0)];
-  [bezierPath lineToPoint:NSMakePoint(0, 0)];
-
-  [bezierPath closePath];
-
-  return bezierPath;
-}
-
-+ (void)drawTabLeftMaskImage {
-  NSBezierPath* bezierPath = [self tabLeftMaskBezierPath];
-  NSAffineTransform* translationTransform = [NSAffineTransform transform];
-  [translationTransform translateXBy:0.5 yBy:-0.25];
-  [bezierPath transformUsingAffineTransform:translationTransform];
-
-  [[NSColor whiteColor] set];
-  [bezierPath fill];
-}
-
-+ (void)drawTabRightMaskImage {
-  // Create the right mask image by flipping the left mask path along the
-  // vettical axis.
-  NSBezierPath* bezierPath = [self tabLeftMaskBezierPath];
-  NSAffineTransform* transform = [NSAffineTransform transform];
-  [transform scaleXBy:-1 yBy:1];
-  [transform translateXBy:-17.5 yBy:-0.25];
-  [bezierPath transformUsingAffineTransform:transform];
-
-  [[NSColor whiteColor] set];
-  [bezierPath fill];
-}
-
-@end
-
-@implementation TabHeavyImageMaker
-
-// For "Increase Contrast" mode, use flat black instead of semitransparent black
-// for the tab edge stroke.
-+ (void)setTabEdgeStrokeColor {
-  static NSColor* heavyStrokeColor =
-      [skia::SkColorToSRGBNSColor(SK_ColorBLACK) retain];
-  [heavyStrokeColor set];
-}
-
-@end
-
-@implementation TabHeavyInvertedImageMaker
-
-// For "Increase Contrast" mode, when using a dark theme, the stroke should be
-// drawn in flat white instead of flat black. There is normally no need to
-// special-case this since the lower-contrast border is equally visible in light
-// or dark themes.
-+ (void)setTabEdgeStrokeColor {
-  static NSColor* heavyStrokeColor =
-      [skia::SkColorToSRGBNSColor(SK_ColorWHITE) retain];
-  [heavyStrokeColor set];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/tabs/tab_view_unittest.mm b/chrome/browser/ui/cocoa/tabs/tab_view_unittest.mm
deleted file mode 100644
index 1e2b4503..0000000
--- a/chrome/browser/ui/cocoa/tabs/tab_view_unittest.mm
+++ /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.
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_view.h"
-#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace {
-
-const float kTabWidth = 50;
-const float kTabHeight = 30;
-
-class TabViewTest : public CocoaTest {
- public:
-  TabViewTest() {
-    NSRect frame = NSMakeRect(0, 0, kTabWidth, kTabHeight);
-    base::scoped_nsobject<TabViewCocoa> view([[TabViewCocoa alloc]
-        initWithFrame:frame
-           controller:nil
-          closeButton:nil]);
-    view_ = view.get();
-    [[test_window() contentView] addSubview:view_];
-  }
-
-  TabViewCocoa* view_;
-};
-
-TEST_VIEW(TabViewTest, view_)
-
-// Test drawing, mostly to ensure nothing leaks or crashes.
-TEST_F(TabViewTest, Display) {
-  for (int i = 0; i < 5; i++) {
-    [view_ setHoverAlpha:i * 0.2];
-    [view_ display];
-  }
-}
-
-// Test it doesn't crash when asked for its menu with no TabControllerCocoa set.
-TEST_F(TabViewTest, Menu) {
-  EXPECT_FALSE([view_ menu]);
-}
-
-// Test that clicks outside of the visible boundaries are ignored.
-TEST_F(TabViewTest, ClickOnlyInVisibleBounds) {
-  NSPoint bottomLeftCorner = NSMakePoint(5, 0);
-  EXPECT_TRUE([view_ hitTest:bottomLeftCorner]);
-
-  NSPoint topLeftCorner = NSMakePoint(0, kTabHeight);
-  EXPECT_FALSE([view_ hitTest:topLeftCorner]);
-
-  NSPoint middle = NSMakePoint(kTabWidth / 2, kTabHeight / 2);
-  EXPECT_TRUE([view_ hitTest:middle]);
-}
-
-}  // namespace
diff --git a/chrome/browser/ui/cocoa/tabs/tab_window_controller.h b/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
index 4068f37..2299924 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
+++ b/chrome/browser/ui/cocoa/tabs/tab_window_controller.h
@@ -24,22 +24,12 @@
 @class FastResizeView;
 @class FocusTracker;
 @class NSVisualEffectView;
-@class TabStripView;
 @class TabViewCocoa;
 
 @interface TabWindowController : NSResponder<NSWindowDelegate> {
  @private
   // Wrapper view around web content, and the developer tools view.
   base::scoped_nsobject<FastResizeView> tabContentArea_;
-  base::scoped_nsobject<NSView> tabStripBackgroundView_;
-
-  // Used to blur the titlebar. nil if window does not have titlebar.
-  API_AVAILABLE(macos(10.10))
-  base::scoped_nsobject<NSVisualEffectView> visualEffectView_;
-
-  // The tab strip overlaps the titlebar of the window.
-  base::scoped_nsobject<TabStripView> tabStripView_;
-
   // No views should be added directly to the root view. Views that overlap
   // the title bar should be added to the window's contentView. All other views
   // should be added to chromeContentView_. This allows tab dragging and
@@ -47,13 +37,6 @@
   // treatment.
   base::scoped_nsobject<NSView> chromeContentView_;
 
-  // The child window used during dragging to achieve the opacity tricks.
-  NSWindow* overlayWindow_;
-
-  // The contentView of the original window that is moved (for the duration
-  // of the drag) to the |overlayWindow_|.
-  NSView* originalContentView_;  // weak
-
   base::scoped_nsobject<FocusTracker> focusBeforeOverlay_;
   BOOL closeDeferred_;  // If YES, call performClose: in removeOverlay:.
 }
@@ -68,8 +51,6 @@
 @property(retain, nonatomic) NSWindow* window;
 @property(readonly, nonatomic) API_AVAILABLE(macos(10.10))
     NSVisualEffectView* visualEffectView;
-@property(readonly, nonatomic) NSView* tabStripBackgroundView;
-@property(readonly, nonatomic) TabStripView* tabStripView;
 @property(readonly, nonatomic) FastResizeView* tabContentArea;
 @property(readonly, nonatomic) NSView* chromeContentView;
 
diff --git a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
index 6959f84..a96af4a 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm
@@ -13,8 +13,6 @@
 #import "chrome/browser/ui/cocoa/fast_resize_view.h"
 #import "chrome/browser/ui/cocoa/framed_browser_window.h"
 #import "chrome/browser/ui/cocoa/tabbed_browser_window.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h"
 #import "chrome/browser/ui/cocoa/themed_window.h"
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
 #import "ui/base/cocoa/focus_tracker.h"
@@ -196,26 +194,8 @@
         setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
     [chromeContentView_ addSubview:tabContentArea_];
 
-    // tabStripBackgroundView_ draws the theme image behind the tab strip area.
-    // When making a tab dragging window (setUseOverlay:), this view stays in
-    // the parent window so that it can be translucent, while the tab strip view
-    // moves to the child window and stays opaque.
-    NSView* windowView = [window contentView];
-    CGFloat paintHeight = [FramedBrowserWindow browserFrameViewPaintHeight];
-    tabStripBackgroundView_.reset([[TabStripBackgroundView alloc]
-        initWithFrame:NSMakeRect(0, NSMaxY([windowView bounds]) - paintHeight,
-                                 NSWidth([windowView bounds]), paintHeight)]);
-    [tabStripBackgroundView_
-        setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin];
     [self insertTabStripBackgroundViewIntoWindow:window titleBar:hasTitleBar];
 
-    tabStripView_.reset([[TabStripView alloc]
-        initWithFrame:NSMakeRect(0, 0, kDefaultWidth,
-                                 chrome::kTabStripHeight)]);
-    [tabStripView_ setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin];
-    if (hasTabStrip)
-      [windowView addSubview:tabStripView_];
-
     // |windowWillEnterFullScreen:| and |windowWillExitFullScreen:| are
     // already called because self is a delegate for the window. However this
     // class is designed for subclassing and can not implement
@@ -247,7 +227,6 @@
   [nextResponderToCheck setNextResponder:[self nextResponder]];
 
   [[NSNotificationCenter defaultCenter] removeObserver:self];
-  [overlayWindow_ setDelegate:nil];
   [[self window] setDelegate:nil];
   [nsWindowController_ setTabWindowController:nil];
   [nsWindowController_ setWindow:nil];
@@ -267,15 +246,7 @@
 }
 
 - (NSVisualEffectView*)visualEffectView {
-  return visualEffectView_;
-}
-
-- (NSView*)tabStripBackgroundView {
-  return tabStripBackgroundView_;
-}
-
-- (TabStripView*)tabStripView {
-  return tabStripView_;
+  return nil;
 }
 
 - (FastResizeView*)tabContentArea {
@@ -305,81 +276,16 @@
 // destroys the overlay window until it's needed again. The tab strip and window
 // contents are returned to the original window.
 - (void)setUseOverlay:(BOOL)useOverlay {
-  [NSObject cancelPreviousPerformRequestsWithTarget:self
-                                           selector:@selector(removeOverlay)
-                                             object:nil];
-  NSWindow* window = [self window];
-  if (useOverlay && !overlayWindow_) {
-    DCHECK(!originalContentView_);
-
-    overlayWindow_ = [[TabWindowOverlayWindow alloc]
-                         initWithContentRect:[window frame]
-                                   styleMask:NSBorderlessWindowMask
-                                     backing:NSBackingStoreBuffered
-                                       defer:NO];
-    [overlayWindow_ setTitle:@"overlay"];
-    [overlayWindow_ setBackgroundColor:[NSColor clearColor]];
-    [overlayWindow_ setOpaque:NO];
-    [overlayWindow_ setDelegate:self];
-    [[overlayWindow_ contentView] setWantsLayer:YES];
-
-    originalContentView_ = self.chromeContentView;
-    [window addChildWindow:overlayWindow_ ordered:NSWindowAbove];
-
-    // Explicitly set the responder to be nil here (for restoring later).
-    // If the first responder were to be left non-nil here then
-    // [RenderWidgethostViewCocoa resignFirstResponder] would be called,
-    // followed by RenderWidgetHost::Blur(), which would result in an unexpected
-    // loss of focus.
-    focusBeforeOverlay_.reset([[FocusTracker alloc] initWithWindow:window]);
-    [window makeFirstResponder:nil];
-
-    // Move the original window's tab strip view and content view to the overlay
-    // window. The content view is added as a subview of the overlay window's
-    // content view (rather than using setContentView:) because the overlay
-    // window has a different content size (due to it being borderless).
-    [[overlayWindow_ contentView] addSubview:[self tabStripView]];
-    [[self tabStripView] setInATabDraggingOverlayWindow:YES];
-    [[overlayWindow_ contentView] addSubview:originalContentView_];
-
-    [overlayWindow_ orderFront:nil];
-  } else if (!useOverlay && overlayWindow_) {
-    DCHECK(originalContentView_);
-
-    // Return the original window's tab strip view and content view to their
-    // places. The TabStripView should be in front of the content view, and the
-    // avatar button, if present, should be in front of the TabStripView.
-    [[window contentView] addSubview:originalContentView_];
-    originalContentView_.frame = [[window contentView] bounds];
-    [[window contentView] addSubview:[self tabStripView]];
-    [[window contentView] addSubview:[self avatarView]];
-    [[self tabStripView] setInATabDraggingOverlayWindow:NO];
-    [[window contentView] updateTrackingAreas];
-
-    [focusBeforeOverlay_ restoreFocusInWindow:window];
-    focusBeforeOverlay_.reset();
-
-    [window display];
-    [window removeChildWindow:overlayWindow_];
-
-    [overlayWindow_ setDelegate:nil];
-    [overlayWindow_ orderOut:nil];
-    [overlayWindow_ release];
-    overlayWindow_ = nil;
-    originalContentView_ = nil;
-  } else {
-    NOTREACHED();
-  }
 }
 
 - (NSWindow*)overlayWindow {
-  return overlayWindow_;
+  return nil;
 }
 
 - (BOOL)shouldConstrainFrameRect {
   // If we currently have an overlay window, do not attempt to change the
   // window's size, as our overlay window doesn't know how to resize properly.
-  return overlayWindow_ == nil;
+  return NO;
 }
 
 - (BOOL)canReceiveFrom:(TabWindowController*)source {
@@ -522,59 +428,6 @@
 
 - (void)insertTabStripBackgroundViewIntoWindow:(NSWindow*)window
                                       titleBar:(BOOL)hasTitleBar {
-  DCHECK(tabStripBackgroundView_);
-
-  // In Material Design on 10.10 and higher, the top portion of the window is
-  // blurred using an NSVisualEffectView.
-  if (@available(macOS 10.10, *)) {
-    [window setTitlebarAppearsTransparent:YES];
-
-    // If the window has a normal titlebar, then do not add NSVisualEffectView.
-    if (hasTitleBar)
-      return;
-
-    // NSVisualEffectView provides hints about text anti-aliasing that are wrong
-    // when anything is drawn over it (like a tint or theme image). Wrapping it
-    // stops it from being used for hints. See https://crbug.com/593835.
-    NSView* visualEffectWrapperView = [[[NSView alloc]
-        initWithFrame:[tabStripBackgroundView_ frame]] autorelease];
-
-    visualEffectView_.reset([[NSVisualEffectView alloc]
-        initWithFrame:visualEffectWrapperView.bounds]);
-    DCHECK(visualEffectView_);
-
-    [visualEffectWrapperView
-        setAutoresizingMask:[tabStripBackgroundView_ autoresizingMask]];
-    [visualEffectView_
-        setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
-    [tabStripBackgroundView_
-        setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
-
-    // Set to a default appearance and material. If this is an Incognito window
-    // the material and vibrancy should be dark but this method gets called at
-    // the start of -[BrowserWindowController initWithBrowser:takeOwnership:],
-    // before the |browser_| ivar has been set. Without a browser object we
-    // can't check the window's theme. The final setup happens in
-    // -[TabStripView setController:], at which point we have access to the
-    // theme.
-    [visualEffectView_
-        setAppearance:[NSAppearance
-                          appearanceNamed:NSAppearanceNameVibrantLight]];
-    [visualEffectView_ setMaterial:NSVisualEffectMaterialLight];
-    [visualEffectView_ setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
-    [visualEffectView_ setState:NSVisualEffectStateFollowsWindowActiveState];
-
-    [visualEffectWrapperView addSubview:visualEffectView_];
-
-    [[window contentView] addSubview:visualEffectWrapperView];
-
-    // Make the |tabStripBackgroundView_| a child of the NSVisualEffectView.
-    [tabStripBackgroundView_ setFrame:[visualEffectView_ bounds]];
-    [visualEffectView_ addSubview:tabStripBackgroundView_];
-  } else {
-    DCHECK(!chrome::ShouldUseFullSizeContentView());
-    [[window contentView] addSubview:tabStripBackgroundView_];
-  }
 }
 
 // Called when the size of the window content area has changed. Override to
@@ -584,13 +437,9 @@
 }
 
 - (void)windowWillEnterFullScreenNotification:(NSNotification*)notification {
-  [(visualEffectView_ ? visualEffectView_.get()
-                      : tabStripBackgroundView_.get()) setHidden:YES];
 }
 
 - (void)windowWillExitFullScreenNotification:(NSNotification*)notification {
-  [(visualEffectView_ ? visualEffectView_.get()
-                      : tabStripBackgroundView_.get()) setHidden:NO];
 }
 
 @end
diff --git a/chrome/browser/ui/cocoa/view_id_util.mm b/chrome/browser/ui/cocoa/view_id_util.mm
index d5ad1f4..7837dc9 100644
--- a/chrome/browser/ui/cocoa/view_id_util.mm
+++ b/chrome/browser/ui/cocoa/view_id_util.mm
@@ -11,7 +11,6 @@
 
 #include "base/logging.h"
 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
-#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h"
 
 namespace {
 
@@ -60,22 +59,6 @@
   DCHECK(viewID != VIEW_ID_NONE);
   DCHECK(window);
 
-  // As tabs can be created, destroyed or rearranged dynamically, we handle them
-  // here specially.
-  if (viewID >= VIEW_ID_TAB_0 && viewID <= VIEW_ID_TAB_LAST) {
-    BrowserWindowController* windowController =
-        [BrowserWindowController browserWindowControllerForWindow:window];
-    DCHECK([windowController isKindOfClass:[BrowserWindowController class]]);
-    TabStripControllerCocoa* tabStripController =
-        [windowController tabStripController];
-    DCHECK(tabStripController);
-    NSUInteger count = [tabStripController viewsCount];
-    DCHECK(count);
-    NSUInteger index =
-        (viewID == VIEW_ID_TAB_LAST ? count - 1 : viewID - VIEW_ID_TAB_0);
-    return index < count ? [tabStripController viewAtIndex:index] : nil;
-  }
-
   return FindViewWithID([[window contentView] superview], viewID);
 }
 
diff --git a/chrome/browser/ui/cocoa/view_id_util_browsertest.mm b/chrome/browser/ui/cocoa/view_id_util_browsertest.mm
deleted file mode 100644
index 3526a8a..0000000
--- a/chrome/browser/ui/cocoa/view_id_util_browsertest.mm
+++ /dev/null
@@ -1,135 +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/command_line.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/bookmarks/bookmark_model_factory.h"
-#include "chrome/browser/devtools/devtools_window_testing.h"
-#include "chrome/browser/download/download_shelf.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/cocoa/view_id_util.h"
-#include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
-#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
-#include "components/bookmarks/browser/bookmark_model.h"
-#include "components/bookmarks/browser/bookmark_utils.h"
-#include "components/bookmarks/test/bookmark_test_helpers.h"
-#include "components/prefs/pref_service.h"
-#include "extensions/common/switches.h"
-
-using bookmarks::BookmarkModel;
-using content::OpenURLParams;
-using content::Referrer;
-
-// Basic sanity check of ViewID use on the Mac.
-class ViewIDTest : public InProcessBrowserTest {
- public:
-  ViewIDTest() : root_window_(nil) {
-    base::CommandLine::ForCurrentProcess()->AppendSwitch(
-        extensions::switches::kEnableExperimentalExtensionApis);
-  }
-
-  void CheckViewID(ViewID view_id, bool should_have) {
-    if (!root_window_)
-      root_window_ = browser()->window()->GetNativeWindow();
-
-    ASSERT_TRUE(root_window_);
-    NSView* view = view_id_util::GetView(root_window_, view_id);
-    EXPECT_EQ(should_have, !!view) << " Failed id=" << view_id;
-  }
-
-  void DoTest() {
-    // Make sure FindBar is created to test VIEW_ID_FIND_IN_PAGE_TEXT_FIELD.
-    chrome::ShowFindBar(browser());
-
-    // Make sure docked devtools is created to test VIEW_ID_DEV_TOOLS_DOCKED
-    DevToolsWindow* devtools_window =
-        DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), true);
-
-    // Make sure download shelf is created to test VIEW_ID_DOWNLOAD_SHELF
-    browser()->window()->GetDownloadShelf()->Open();
-
-    // Create a bookmark to test VIEW_ID_BOOKMARK_BAR_ELEMENT
-    BookmarkModel* bookmark_model =
-        BookmarkModelFactory::GetForBrowserContext(browser()->profile());
-    if (bookmark_model) {
-      if (!bookmark_model->loaded())
-        bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model);
-
-      bookmarks::AddIfNotBookmarked(bookmark_model,
-                                    GURL(url::kAboutBlankURL),
-                                    base::ASCIIToUTF16("about"));
-    }
-
-    for (int i = VIEW_ID_TOOLBAR; i < VIEW_ID_PREDEFINED_COUNT; ++i) {
-      // Mac implementation does not support following ids yet.
-      // TODO(palmer): crbug.com/536257: Enable VIEW_ID_LOCATION_ICON.
-      if (i == VIEW_ID_STAR_BUTTON ||
-          i == VIEW_ID_CONTENTS_SPLIT ||
-          i == VIEW_ID_BROWSER_ACTION ||
-          i == VIEW_ID_FEEDBACK_BUTTON ||
-          i == VIEW_ID_SCRIPT_BUBBLE ||
-          i == VIEW_ID_SAVE_CREDIT_CARD_BUTTON ||
-          i == VIEW_ID_TRANSLATE_BUTTON ||
-          i == VIEW_ID_LOCATION_ICON ||
-          i == VIEW_ID_FIND_IN_PAGE_PREVIOUS_BUTTON ||
-          i == VIEW_ID_FIND_IN_PAGE_NEXT_BUTTON ||
-          i == VIEW_ID_FIND_IN_PAGE_CLOSE_BUTTON) {
-        continue;
-      }
-
-      CheckViewID(static_cast<ViewID>(i), true);
-    }
-
-    CheckViewID(VIEW_ID_TAB, true);
-    CheckViewID(VIEW_ID_TAB_STRIP, true);
-    CheckViewID(VIEW_ID_PREDEFINED_COUNT, false);
-
-    DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window);
-  }
-
- private:
-  NSWindow* root_window_;
-
-  test::ScopedMacViewsBrowserMode cocoa_browser_mode_{false};
-};
-
-// https://crbug.com/862945
-IN_PROC_BROWSER_TEST_F(ViewIDTest, DISABLED_Basic) {
-  ASSERT_NO_FATAL_FAILURE(DoTest());
-}
-
-// Flaky on Mac: http://crbug.com/90557.
-IN_PROC_BROWSER_TEST_F(ViewIDTest, DISABLED_Fullscreen) {
-  browser()->exclusive_access_manager()->context()->EnterFullscreen(
-      GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION);
-  ASSERT_NO_FATAL_FAILURE(DoTest());
-}
-
-IN_PROC_BROWSER_TEST_F(ViewIDTest, Tab) {
-  CheckViewID(VIEW_ID_TAB_0, true);
-  CheckViewID(VIEW_ID_TAB_LAST, true);
-
-  // Open 9 new tabs.
-  for (int i = 1; i <= 9; ++i) {
-    CheckViewID(static_cast<ViewID>(VIEW_ID_TAB_0 + i), false);
-    browser()->OpenURL(OpenURLParams(GURL(url::kAboutBlankURL), Referrer(),
-                                     WindowOpenDisposition::NEW_BACKGROUND_TAB,
-                                     ui::PAGE_TRANSITION_TYPED, false));
-    CheckViewID(static_cast<ViewID>(VIEW_ID_TAB_0 + i), true);
-    // VIEW_ID_TAB_LAST should always be available.
-    CheckViewID(VIEW_ID_TAB_LAST, true);
-  }
-
-  // Open the 11th tab.
-  browser()->OpenURL(OpenURLParams(GURL(url::kAboutBlankURL), Referrer(),
-                                   WindowOpenDisposition::NEW_BACKGROUND_TAB,
-                                   ui::PAGE_TRANSITION_TYPED, false));
-  CheckViewID(VIEW_ID_TAB_LAST, true);
-}
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
index 4f9cc738..5134694 100644
--- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
+++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -33,7 +33,6 @@
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.cc"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/bookmarks/test/bookmark_test_helpers.h"
@@ -394,8 +393,6 @@
  private:
   policy::MockConfigurationPolicyProvider policy_provider_;
 
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   // Non-owning pointer.
   TestToolbarModel* test_toolbar_model_ = nullptr;
 
diff --git a/chrome/browser/ui/sad_tab.h b/chrome/browser/ui/sad_tab.h
index 651fd117..bc5df33b9 100644
--- a/chrome/browser/ui/sad_tab.h
+++ b/chrome/browser/ui/sad_tab.h
@@ -25,12 +25,6 @@
 
   // Factory function to create the platform specific implementations.
   static SadTab* Create(content::WebContents* web_contents, SadTabKind kind);
-#if defined(OS_MACOSX)
-  // Temporary shim for Polychrome. See bottom of first comment in
-  // https://crbug.com/80495 for details.
-  static SadTab* CreateCocoa(content::WebContents* web_contents,
-                             SadTabKind kind);
-#endif
 
   // Returns true if the sad tab should be shown.
   static bool ShouldShow(base::TerminationStatus status);
diff --git a/chrome/browser/ui/signin_view_controller_delegate.h b/chrome/browser/ui/signin_view_controller_delegate.h
index 5b434db..967dc4eb 100644
--- a/chrome/browser/ui/signin_view_controller_delegate.h
+++ b/chrome/browser/ui/signin_view_controller_delegate.h
@@ -51,23 +51,6 @@
       SigninViewController* signin_view_controller,
       Browser* browser);
 
-#if defined(OS_MACOSX)
-  // Temporary shim for Polychrome. See bottom of first comment in
-  // https://crbug.com/80495 for details.
-  static SigninViewControllerDelegate* CreateModalSigninDelegateCocoa(
-      SigninViewController* signin_view_controller,
-      profiles::BubbleViewMode mode,
-      Browser* browser,
-      signin_metrics::AccessPoint access_point);
-  static SigninViewControllerDelegate* CreateSyncConfirmationDelegateCocoa(
-      SigninViewController* signin_view_controller,
-      Browser* browser,
-      bool is_consent_bump = false);
-  static SigninViewControllerDelegate* CreateSigninErrorDelegateCocoa(
-      SigninViewController* signin_view_controller,
-      Browser* browser);
-#endif
-
   // Attaches a dialog manager to this sign-in view controller dialog.
   // Should be called by subclasses when a different dialog may need to be
   // presented on top of the sign-in dialog.
diff --git a/chrome/browser/ui/tabs/window_activity_watcher_interactive_uitest.cc b/chrome/browser/ui/tabs/window_activity_watcher_interactive_uitest.cc
index 7a52ffc..082053a 100644
--- a/chrome/browser/ui/tabs/window_activity_watcher_interactive_uitest.cc
+++ b/chrome/browser/ui/tabs/window_activity_watcher_interactive_uitest.cc
@@ -14,7 +14,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -74,8 +73,6 @@
   std::unique_ptr<UkmEntryChecker> ukm_entry_checker_;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(WindowActivityWatcherTest);
 };
 
diff --git a/chrome/browser/ui/user_manager.h b/chrome/browser/ui/user_manager.h
index f14c353..4e854986 100644
--- a/chrome/browser/ui/user_manager.h
+++ b/chrome/browser/ui/user_manager.h
@@ -49,18 +49,6 @@
 
   // Get the path of profile that is being signed in.
   static base::FilePath GetSigninProfilePath();
-#if defined(OS_MACOSX)
-  // Temporary shim for Polychrome. See bottom of first comment in
-  // https://crbug.com/80495 for details.
-  static void ShowCocoa(const base::FilePath& profile_path_to_focus,
-                        profiles::UserManagerAction user_manager_action);
-  static void HideCocoa();
-  static bool IsShowingCocoa();
-  static void OnUserManagerShownCocoa();
-  static void AddOnUserManagerShownCallbackForTestingCocoa(
-      const base::Closure& callback);
-  static base::FilePath GetSigninProfilePathCocoa();
-#endif
 
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(UserManager);
@@ -113,25 +101,6 @@
   // Hides the dialog if it is showing.
   static void HideDialog();
 
-#if defined(OS_MACOSX)
-  // Temporary shim for Polychrome. See bottom of first comment in
-  // https://crbug.com/80495 for details.
-  static void ShowReauthDialogCocoa(content::BrowserContext* browser_context,
-                                    const std::string& email,
-                                    signin_metrics::Reason reason);
-  static void ShowReauthDialogWithProfilePathCocoa(
-      content::BrowserContext* browser_context,
-      const std::string& email,
-      const base::FilePath& profile_path,
-      signin_metrics::Reason reason);
-  static void ShowSigninDialogCocoa(content::BrowserContext* browser_context,
-                                    const base::FilePath& profile_path,
-                                    signin_metrics::Reason reason);
-  static void ShowDialogAndDisplayErrorMessageCocoa(
-      content::BrowserContext* browser_context);
-  static void DisplayErrorMessageCocoa();
-  static void HideDialogCocoa();
-#endif
   // Abstract base class for performing online reauthentication of profiles in
   // the User Manager. It is concretely implemented in UserManagerMac and
   // UserManagerView to specialize the closing of the UI's dialog widgets.
diff --git a/chrome/browser/ui/views/accelerator_table_unittest_mac.mm b/chrome/browser/ui/views/accelerator_table_unittest_mac.mm
index 61c36305..20260ad 100644
--- a/chrome/browser/ui/views/accelerator_table_unittest_mac.mm
+++ b/chrome/browser/ui/views/accelerator_table_unittest_mac.mm
@@ -11,7 +11,6 @@
 #include "chrome/app/chrome_command_ids.h"
 #import "chrome/browser/global_keyboard_shortcuts_mac.h"
 #include "chrome/browser/ui/views/accelerator_table.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/event_constants.h"
 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
@@ -66,7 +65,6 @@
 // accelerators are defined in MainMenu.xib. We do not check that there is no
 // overlap with that.
 TEST(AcceleratorTableTest, CheckNoDuplicatesGlobalKeyboardShortcutsMac) {
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   VerifyTableDoesntHaveDuplicates(GetShortcutsNotPresentInMainMenu(),
                                   "ShortcutsNotPresentInMainMenu");
 }
diff --git a/chrome/browser/ui/views/apps/chrome_app_window_client_views_mac.mm b/chrome/browser/ui/views/apps/chrome_app_window_client_views_mac.mm
index 400ba4d..01b5229 100644
--- a/chrome/browser/ui/views/apps/chrome_app_window_client_views_mac.mm
+++ b/chrome/browser/ui/views/apps/chrome_app_window_client_views_mac.mm
@@ -5,14 +5,11 @@
 #include "chrome/browser/ui/apps/chrome_app_window_client.h"
 
 #include "chrome/browser/ui/views/apps/chrome_native_app_window_views_mac.h"
-#include "chrome/browser/ui/views_mode_controller.h"
 
 // static
 extensions::NativeAppWindow* ChromeAppWindowClient::CreateNativeAppWindowImpl(
     extensions::AppWindow* app_window,
     const extensions::AppWindow::CreateParams& params) {
-  if (views_mode_controller::IsViewsBrowserCocoa())
-    return CreateNativeAppWindowImplCocoa(app_window, params);
   ChromeNativeAppWindowViewsMac* window = new ChromeNativeAppWindowViewsMac;
   window->Init(app_window, params);
   return window;
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc b/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
index 39c51af4..f71bc33 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/autofill/core/browser/suggestion.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -86,7 +85,6 @@
   }
 
  protected:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   testing::NiceMock<MockAutofillPopupViewDelegate> mock_delegate_;
   AutofillPopupBaseView* view_;
 
diff --git a/chrome/browser/ui/views/constrained_window_views_browsertest.cc b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
index dc78dbe..42c3a36 100644
--- a/chrome/browser/ui/views/constrained_window_views_browsertest.cc
+++ b/chrome/browser/ui/views/constrained_window_views_browsertest.cc
@@ -13,7 +13,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/constrained_window/constrained_window_views.h"
 #include "components/web_modal/web_contents_modal_dialog_host.h"
 #include "components/web_modal/web_contents_modal_dialog_manager.h"
@@ -59,8 +58,6 @@
   ~ConstrainedWindowViewTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ConstrainedWindowViewTest);
 };
 
diff --git a/chrome/browser/ui/views/exclusive_access_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/exclusive_access_bubble_views_interactive_uitest.cc
index 30f8edc..e42f0c7 100644
--- a/chrome/browser/ui/views/exclusive_access_bubble_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/exclusive_access_bubble_views_interactive_uitest.cc
@@ -6,7 +6,6 @@
 #include "chrome/browser/ui/exclusive_access/fullscreen_controller_test.h"
 #include "chrome/browser/ui/views/exclusive_access_bubble_views.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
@@ -33,8 +32,6 @@
   bool was_observing_in_destroying_ = false;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ExclusiveAccessBubbleViewsTest);
 };
 
diff --git a/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc b/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
index 54347001..919f9b6 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
+++ b/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_view_host.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "ui/base/test/ui_controls.h"
@@ -21,8 +20,6 @@
   ~ExtensionDialogUiTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ExtensionDialogUiTest);
 };
 
diff --git a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
index 25569ba9..915f5190 100644
--- a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
@@ -19,7 +19,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/web_contents.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -96,8 +95,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(FindInPageTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
index 6049e41..c7b0df9 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
@@ -14,7 +14,6 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/theme_provider.h"
@@ -63,10 +62,6 @@
 
   base::test::ScopedFeatureList scoped_feature_list_;
 
-  // Test doesn't work (or make sense) in non-Views Mac. Force it to run in the
-  // Views browser.
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserNonClientFrameViewBrowserTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
index 8571efe41..1446241 100644
--- a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
@@ -7,7 +7,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/dragdrop/drop_target_event.h"
 #include "ui/base/dragdrop/os_exchange_data.h"
@@ -23,8 +22,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserRootViewBrowserTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
index b6e7fbb3..1de8503 100644
--- a/chrome/browser/ui/views/frame/browser_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
@@ -20,7 +20,6 @@
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/bookmarks/common/bookmark_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/invalidate_type.h"
@@ -65,8 +64,6 @@
   DevToolsWindow* devtools_;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserViewTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_view_focus_uitest.cc b/chrome/browser/ui/views/frame/browser_view_focus_uitest.cc
index 742d5d9..9bdce1cb 100644
--- a/chrome/browser/ui/views/frame/browser_view_focus_uitest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_focus_uitest.cc
@@ -14,7 +14,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/views/controls/webview/webview.h"
@@ -34,8 +33,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserViewFocusTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
index a5d8d38d..2a2b7a5 100644
--- a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/web_contents.h"
 
 #if defined(OS_MACOSX)
@@ -38,8 +37,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(BrowserViewTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
index eed9443c..ddab231 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view_browsertest.cc
@@ -13,7 +13,6 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/web_application_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 
 // Tests hosted app windows that use the OpaqueBrowserFrameView implementation
 // for their non client frames.
@@ -65,8 +64,6 @@
   HostedAppButtonContainer* hosted_app_button_container_ = nullptr;
 
  private:
-  test::ScopedMacViewsBrowserMode force_mac_views_{true};
-
   DISALLOW_COPY_AND_ASSIGN(HostedAppOpaqueBrowserFrameViewTest);
 };
 
diff --git a/chrome/browser/ui/views/frame/test_with_browser_view.h b/chrome/browser/ui/views/frame/test_with_browser_view.h
index eebad3b5..f1263761 100644
--- a/chrome/browser/ui/views/frame/test_with_browser_view.h
+++ b/chrome/browser/ui/views/frame/test_with_browser_view.h
@@ -9,7 +9,6 @@
 
 #include "base/macros.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 
 class BrowserView;
 
@@ -33,7 +32,6 @@
 
  private:
   BrowserView* browser_view_;  // Not owned.
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 
   DISALLOW_COPY_AND_ASSIGN(TestWithBrowserView);
 };
diff --git a/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc b/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
index d0c965f..82a32ede 100644
--- a/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/fullscreen_control/fullscreen_control_view_interactive_uitest.cc
@@ -21,7 +21,6 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
@@ -159,7 +158,6 @@
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 
 #if defined(USE_AURA)
   std::unique_ptr<aura::test::TestCursorClient> cursor_client_;
diff --git a/chrome/browser/ui/views/keyboard_access_browsertest.cc b/chrome/browser/ui/views/keyboard_access_browsertest.cc
index d6366e5..b3573a7b 100644
--- a/chrome/browser/ui/views/keyboard_access_browsertest.cc
+++ b/chrome/browser/ui/views/keyboard_access_browsertest.cc
@@ -26,7 +26,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "ui/base/test/ui_controls.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/keycodes/keyboard_codes.h"
@@ -183,8 +182,6 @@
   void TestMenuKeyboardAccessAndDismiss();
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(KeyboardAccessTest);
 };
 
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc b/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc
index 3384a538..77a2be5 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view_browsertest.cc
@@ -21,7 +21,6 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/security_state/core/security_state.h"
 #include "components/toolbar/toolbar_field_trial.h"
 #include "components/toolbar/toolbar_model_impl.h"
@@ -54,7 +53,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   DISALLOW_COPY_AND_ASSIGN(LocationBarViewBrowserTest);
 };
 
@@ -243,7 +241,6 @@
 
  private:
   scoped_refptr<net::X509Certificate> cert_;
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 
   std::unique_ptr<content::URLLoaderInterceptor> url_loader_interceptor_;
 
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view_browsertest.cc b/chrome/browser/ui/views/location_bar/location_icon_view_browsertest.cc
index b04a7e4..47e5db45 100644
--- a/chrome/browser/ui/views/location_bar/location_icon_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/location_icon_view_browsertest.cc
@@ -7,7 +7,6 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "ui/views/animation/test/ink_drop_host_view_test_api.h"
 
@@ -31,7 +30,6 @@
   LocationIconView* icon_view() const { return icon_view_.get(); }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   LocationBarView* location_bar_;
 
   std::unique_ptr<LocationIconView> icon_view_;
diff --git a/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
index 61deb85e..05abb12 100644
--- a/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/views/translate/translate_icon_view.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 
 namespace {
 
@@ -22,8 +21,6 @@
   ~LocationIconViewTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(LocationIconViewTest);
 };
 
diff --git a/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
index 6331dc4..81cecc4 100644
--- a/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/location_bar/selected_keyword_view_interactive_uitest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/ui/views/location_bar/selected_keyword_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 
 namespace {
 
@@ -28,8 +27,6 @@
   ~SelectedKeywordViewTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(SelectedKeywordViewTest);
 };
 
diff --git a/chrome/browser/ui/views/location_bar/star_view_browsertest.cc b/chrome/browser/ui/views/location_bar/star_view_browsertest.cc
index e1f2ea1..cfd96fcf 100644
--- a/chrome/browser/ui/views/location_bar/star_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/star_view_browsertest.cc
@@ -18,7 +18,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test_utils.h"
@@ -40,8 +39,6 @@
   ~StarViewTest() override = default;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(StarViewTest);
 };
 
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
index 9e8d887..4b60650f 100644
--- a/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_container_view.h"
 #include "chrome/browser/ui/views/page_action/zoom_view.h"
-#include "chrome/browser/ui/views_mode_controller.h"
 #include "chrome/common/extensions/api/extension_action/action_info.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
@@ -35,7 +34,6 @@
 #include "extensions/common/manifest_handlers/icons_handler.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "ui/base/ui_features.h"
 #include "ui/gfx/favicon_size.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/text_utils.h"
@@ -122,11 +120,6 @@
 
 PageActionIconContainerView* GetAnchorViewForBrowser(Browser* browser,
                                                      bool is_fullscreen) {
-#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
-#if BUILDFLAG(MAC_VIEWS_BROWSER)
-  if (views_mode_controller::IsViewsBrowserCocoa())
-    return nullptr;  // Cocoa browsers always use anchor rects instead of views.
-#endif
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
   if (!is_fullscreen ||
       browser_view->immersive_mode_controller()->IsRevealed()) {
@@ -134,9 +127,6 @@
         ->GetPageActionIconContainerView();
   }
   return nullptr;
-#else  // OS_MACOSX && !MAC_VIEWS_BROWSER
-  return nullptr;
-#endif
 }
 
 PageActionIconContainerView* GetAnchorViewForBrowser(Browser* browser) {
@@ -146,19 +136,10 @@
 
 ImmersiveModeController* GetImmersiveModeControllerForBrowser(
     Browser* browser) {
-#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
-#if BUILDFLAG(MAC_VIEWS_BROWSER)
-  if (views_mode_controller::IsViewsBrowserCocoa())
-    return nullptr;
-#endif
   BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser);
   return browser_view->immersive_mode_controller();
-#else
-  return nullptr;
-#endif
 }
 
-#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
 void ParentToViewsBrowser(Browser* browser,
                           ZoomBubbleView* zoom_bubble,
                           views::View* anchor_view,
@@ -177,33 +158,12 @@
 
   views::BubbleDialogDelegateView::CreateBubble(zoom_bubble);
 }
-#endif
-
-#if defined(OS_MACOSX)
-void ParentToCocoaBrowser(Browser* browser, ZoomBubbleView* zoom_bubble) {
-  gfx::NativeView parent =
-      platform_util::GetViewForWindow(browser->window()->GetNativeWindow());
-  DCHECK(parent);
-  zoom_bubble->SetArrow(views::BubbleBorder::TOP_RIGHT);
-  zoom_bubble->set_parent_window(parent);
-  views::BubbleDialogDelegateView::CreateBubble(zoom_bubble);
-}
-#endif
 
 void ParentToBrowser(Browser* browser,
                      ZoomBubbleView* zoom_bubble,
                      views::View* anchor_view,
                      content::WebContents* web_contents) {
-#if defined(OS_MACOSX) && BUILDFLAG(MAC_VIEWS_BROWSER)
-  if (views_mode_controller::IsViewsBrowserCocoa())
-    ParentToCocoaBrowser(browser, zoom_bubble);
-  else
-    ParentToViewsBrowser(browser, zoom_bubble, anchor_view, web_contents);
-#elif defined(OS_MACOSX)
-  ParentToCocoaBrowser(browser, zoom_bubble);
-#else
   ParentToViewsBrowser(browser, zoom_bubble, anchor_view, web_contents);
-#endif
 }
 
 // Find the extension that initiated the zoom change, if any.
diff --git a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
index 78312a4..62113e1 100644
--- a/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc
@@ -12,7 +12,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/zoom/zoom_controller.h"
 #include "extensions/browser/extension_zoom_request_client.h"
 #include "extensions/common/extension_builder.h"
@@ -44,22 +43,15 @@
 
 }  // namespace
 
-class ZoomBubbleViewsBrowserTest : public ZoomBubbleBrowserTest {
- private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-};
-
 // TODO(linux_aura) http://crbug.com/163931
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
 #define MAYBE_NonImmersiveFullscreen DISABLED_NonImmersiveFullscreen
 #else
 #define MAYBE_NonImmersiveFullscreen NonImmersiveFullscreen
 #endif
-#if !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
 // Test whether the zoom bubble is anchored and whether it is visible when in
 // non-immersive fullscreen.
-IN_PROC_BROWSER_TEST_F(ZoomBubbleViewsBrowserTest,
-                       MAYBE_NonImmersiveFullscreen) {
+IN_PROC_BROWSER_TEST_F(ZoomBubbleBrowserTest, MAYBE_NonImmersiveFullscreen) {
   BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
   content::WebContents* web_contents = browser_view->GetActiveWebContents();
 
@@ -102,7 +94,6 @@
     waiter->Wait();
   }
 }
-#endif  // !defined(OS_MACOSX) || BUILDFLAG(MAC_VIEWS_BROWSER)
 
 #if defined(OS_CHROMEOS)
 // Test whether the zoom bubble is anchored and whether it is visible when in
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
index 0d12a623..c83b305 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/omnibox/browser/omnibox_popup_model.h"
@@ -144,7 +143,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   base::test::ScopedFeatureList feature_list_;
 
   DISALLOW_COPY_AND_ASSIGN(OmniboxPopupContentsViewTest);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index 5645a1c..5e02ce1 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -22,7 +22,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/omnibox/browser/omnibox_popup_model.h"
 #include "components/omnibox/browser/test_scheme_classifier.h"
 #include "content/public/browser/web_contents.h"
@@ -117,8 +116,6 @@
     ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
   }
 
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(OmniboxViewViewsTest);
 };
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
index 12c7c44..c6d8c32a 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/ui/omnibox/query_in_omnibox_factory.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/views/chrome_views_test_base.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/omnibox/browser/omnibox_field_trial.h"
 #include "components/toolbar/test_toolbar_model.h"
@@ -578,7 +577,6 @@
   base::SimpleTestTickClock* clock() { return &clock_; }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
   base::SimpleTestTickClock clock_;
 };
 
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc b/chrome/browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc
index f1974c3..a57fd4b2 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/ui/views/passwords/manage_passwords_icon_views.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/grit/generated_resources.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/password_manager/core/common/password_manager_ui.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -43,8 +42,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ManagePasswordsIconViewTest);
 };
 
diff --git a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
index c8b6f30..2031e19 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
+++ b/chrome/browser/ui/views/passwords/password_bubble_interactive_uitest.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/notification_types.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/common/content_features.h"
@@ -82,8 +81,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(PasswordBubbleInteractiveUiTest);
 };
 
diff --git a/chrome/browser/ui/views/permission_bubble/permission_bubble_views_interactive_uitest_mac.mm b/chrome/browser/ui/views/permission_bubble/permission_bubble_views_interactive_uitest_mac.mm
index 86c9dc9..3bc7c4b 100644
--- a/chrome/browser/ui/views/permission_bubble/permission_bubble_views_interactive_uitest_mac.mm
+++ b/chrome/browser/ui/views/permission_bubble/permission_bubble_views_interactive_uitest_mac.mm
@@ -15,7 +15,6 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "ui/base/test/ui_controls.h"
 #import "ui/base/test/windowed_nsnotification_observer.h"
 #include "ui/base/ui_base_features.h"
@@ -78,7 +77,6 @@
 
  private:
   std::unique_ptr<test::PermissionRequestManagerTestApi> test_api_;
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 
   DISALLOW_COPY_AND_ASSIGN(PermissionBubbleViewsInteractiveUITest);
 };
diff --git a/chrome/browser/ui/views/sad_tab_view_interactive_uitest.cc b/chrome/browser/ui/views/sad_tab_view_interactive_uitest.cc
index 1cbd0e6c..1026fc19 100644
--- a/chrome/browser/ui/views/sad_tab_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/sad_tab_view_interactive_uitest.cc
@@ -14,7 +14,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/result_codes.h"
@@ -124,8 +123,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(SadTabViewInteractiveUITest);
 };
 
diff --git a/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc b/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc
index 8de81df..06de9a6 100644
--- a/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc
+++ b/chrome/browser/ui/views/ssl_client_certificate_selector_browsertest.cc
@@ -16,7 +16,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/client_certificate_delegate.h"
@@ -308,8 +307,6 @@
   SSLClientCertificateSelector* selector_1_;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(SSLClientCertificateSelectorMultiProfileTest);
 };
 
diff --git a/chrome/browser/ui/views/status_bubble_views_browsertest.cc b/chrome/browser/ui/views/status_bubble_views_browsertest.cc
index 30eb1ac..52babd1 100644
--- a/chrome/browser/ui/views/status_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/status_bubble_views_browsertest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/ui/views/status_bubble_views_browsertest_mac.h"
 #include "chrome/browser/ui/views_mode_controller.h"
 #include "chrome/test/base/in_process_browser_test.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "ui/views/widget/widget.h"
 
 class StatusBubbleViewsTest : public InProcessBrowserTest {
@@ -20,9 +19,6 @@
   views::Widget* GetWidget() {
     return static_cast<StatusBubbleViews*>(GetBubble())->popup();
   }
-
- private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
 };
 
 // Ensure the status bubble does not hide itself on Mac. Doing so can trigger
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
index 4aa89028..7b44b08 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -38,7 +38,6 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_service.h"
@@ -661,8 +660,6 @@
   Browser* browser() const { return InProcessBrowserTest::browser(); }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
 #if defined(OS_CHROMEOS)
   // The root window for the event generator.
   aura::Window* root_ = nullptr;
diff --git a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
index 95d9b23c..2f8e2f60 100644
--- a/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
+++ b/chrome/browser/ui/views/toolbar/browser_actions_container_browsertest.cc
@@ -1,4 +1,4 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -28,8 +28,6 @@
 #include "ui/views/test/test_views.h"
 #include "ui/views/view.h"
 
-namespace {
-
 // TODO(devlin): Continue moving any tests that should be platform independent
 // from this file to the crossplatform tests in
 // chrome/browser/ui/toolbar/browser_actions_bar_browsertest.cc.
@@ -38,15 +36,7 @@
 // from the overflow menu results in it "popping" out (growing the container
 // size by 1), rather than just reordering the extensions.
 
-// The two drag & drop tests are currently restricted to Views browsers in the
-// absence of a good way to abstract drag & drop actions.
-class BrowserActionsBarViewsBrowserTest : public BrowserActionsBarBrowserTest {
- private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-};
-}  // namespace
-
-IN_PROC_BROWSER_TEST_F(BrowserActionsBarViewsBrowserTest, DragBrowserActions) {
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, DragBrowserActions) {
   LoadExtensions();
 
   // Sanity check: All extensions showing; order is A B C.
@@ -159,7 +149,7 @@
 
 // Test that changes performed in one container affect containers in other
 // windows so that it is consistent.
-IN_PROC_BROWSER_TEST_F(BrowserActionsBarViewsBrowserTest, MultipleWindows) {
+IN_PROC_BROWSER_TEST_F(BrowserActionsBarBrowserTest, MultipleWindows) {
   LoadExtensions();
   BrowserActionsContainer* first =
       BrowserView::GetBrowserViewForBrowser(browser())->toolbar()->
diff --git a/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc b/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc
index b122299..8e25e28 100644
--- a/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/toolbar/outdated_upgrade_bubble_view_browsertest.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 
 class OutdatedUpgradeBubbleTest : public DialogBrowserTest {
  public:
@@ -29,8 +28,6 @@
   }
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(OutdatedUpgradeBubbleTest);
 };
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc
index 1dba9cd27..3497911 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/ui/views/toolbar/extension_toolbar_menu_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "extensions/browser/notification_types.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/feature_switch.h"
@@ -145,8 +144,6 @@
   void TearDownOnMainThread() override;
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ToolbarActionViewInteractiveUITest);
 };
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
index 6f92356..261f7be3 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "ui/views/focus/focus_manager.h"
@@ -66,8 +65,6 @@
   void SetUpOnMainThread() override;
   void TearDownOnMainThread() override;
 
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   ToolbarView* toolbar_view_;
 
   BrowserActionsContainer* browser_actions_;
@@ -194,8 +191,6 @@
   void RunToolbarCycleFocusTest(Browser* browser);
 
  private:
-  test::ScopedMacViewsBrowserMode views_mode_{true};
-
   DISALLOW_COPY_AND_ASSIGN(ToolbarViewTest);
 };
 
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 418c1e7..af430d79 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -15,7 +15,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "build/buildflag.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
@@ -26,7 +25,6 @@
 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
 #include "chrome/browser/ui/translate/translate_bubble_view_state_transition.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
-#include "chrome/browser/ui/views_mode_controller.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
@@ -41,7 +39,6 @@
 #include "ui/base/models/combobox_model.h"
 #include "ui/base/models/simple_combobox_model.h"
 #include "ui/base/resource/resource_bundle.h"
-#include "ui/base/ui_features.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/blue_button.h"
@@ -72,16 +69,6 @@
   DISALLOW_COPY_AND_ASSIGN(AdvancedViewContainer);
 };
 
-#if defined(OS_MACOSX)
-bool IsViewsBrowserCocoa() {
-#if BUILDFLAG(MAC_VIEWS_BROWSER)
-  return views_mode_controller::IsViewsBrowserCocoa();
-#else
-  return true;
-#endif
-}
-#endif  // defined(OS_MACOSX)
-
 }  // namespace
 
 // static
@@ -142,20 +129,6 @@
   TranslateBubbleView* view = new TranslateBubbleView(
       anchor_view, anchor_point, std::move(model), error_type, web_contents);
 
-#if defined(OS_MACOSX)
-  if (IsViewsBrowserCocoa()) {
-    // On Cocoa, there's no anchor view (|anchor_point| is used to position).
-    // However, the bubble will be set up with no parent and no anchor. That
-    // needs to be set up before showing the bubble.
-    DCHECK(!anchor_view);
-    view->SetArrow(views::BubbleBorder::TOP_RIGHT);
-    view->set_parent_window(platform_util::GetViewForWindow(
-        web_contents->GetTopLevelNativeWindow()));
-  } else {
-    DCHECK(anchor_view);
-  }
-#endif
-
   if (highlighted_button)
     view->SetHighlightedButton(highlighted_button);
 
diff --git a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
index 50ea95b..e2defdd 100644
--- a/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/enrollment_screen_handler.cc
@@ -562,28 +562,34 @@
   builder->Add("oauthEnrollWorking", IDS_ENTERPRISE_ENROLLMENT_WORKING_MESSAGE);
   // Do not use AddF for this string as it will be rendered by the JS code.
   builder->Add("oauthEnrollAbeSuccess", IDS_ENTERPRISE_ENROLLMENT_ABE_SUCCESS);
+
+  /* Active Directory strings */
   builder->Add("oauthEnrollAdMachineNameInput", IDS_AD_DEVICE_NAME_INPUT_LABEL);
   builder->Add("oauthEnrollAdMachineNameInputRegex",
                IDS_AD_DEVICE_NAME_REGEX_INPUT_LABEL);
   builder->Add("oauthEnrollAdDomainJoinWelcomeMessage",
                IDS_AD_DOMAIN_JOIN_WELCOME_MESSAGE);
-  builder->Add("adEnrollmentLoginUsername", IDS_AD_ENROLLMENT_LOGIN_USER);
+  builder->Add("adAuthLoginUsername", IDS_AD_AUTH_LOGIN_USER);
   builder->Add("adLoginInvalidUsername", IDS_AD_INVALID_USERNAME);
   builder->Add("adLoginPassword", IDS_AD_LOGIN_PASSWORD);
   builder->Add("adLoginInvalidPassword", IDS_AD_INVALID_PASSWORD);
   builder->Add("adJoinErrorMachineNameInvalid", IDS_AD_DEVICE_NAME_INVALID);
   builder->Add("adJoinErrorMachineNameTooLong", IDS_AD_DEVICE_NAME_TOO_LONG);
-  builder->Add("adJoinErrorMachineNameDoesntMatchRegex",
-               IDS_AD_DEVICE_NAME_DOESNT_MATCH_REGEX);
+  builder->Add("adJoinErrorMachineNameInvalidFormat",
+               IDS_AD_DEVICE_NAME_INVALID_FORMAT);
   builder->Add("adJoinMoreOptions", IDS_AD_MORE_OPTIONS_BUTTON);
-  builder->Add("adUnlockConfig", IDS_AD_UNLOCK_CONFIG);
-  builder->Add("adUnlockButton", IDS_AD_UNLOCK_CONFIG_UNLOCK_BUTTON);
+  builder->Add("adUnlockTitle", IDS_AD_UNLOCK_TITLE_MESSAGE);
+  builder->Add("adUnlockSubtitle", IDS_AD_UNLOCK_SUBTITLE_MESSAGE);
   builder->Add("adUnlockPassword", IDS_AD_UNLOCK_CONFIG_PASSWORD);
   builder->Add("adUnlockIncorrectPassword", IDS_AD_UNLOCK_INCORRECT_PASSWORD);
   builder->Add("adUnlockPasswordSkip", IDS_AD_UNLOCK_PASSWORD_SKIP);
   builder->Add("adJoinOrgUnit", IDS_AD_ORG_UNIT_HINT);
   builder->Add("adJoinCancel", IDS_AD_CANCEL_BUTTON);
-  builder->Add("adJoinConfirm", IDS_AD_CONFIRM_BUTTON);
+  builder->Add("adJoinSave", IDS_AD_SAVE_BUTTON);
+  builder->Add("selectEncryption", IDS_AD_ENCRYPTION_SELECTION_SELECT);
+  builder->Add("selectConfiguration", IDS_AD_CONFIG_SELECTION_SELECT);
+  /* End of Active Directory strings */
+
   builder->Add("licenseSelectionCardTitle",
                IDS_ENTERPRISE_ENROLLMENT_LICENSE_SELECTION);
   builder->Add("licenseSelectionCardExplanation",
@@ -596,8 +602,6 @@
                IDS_ENTERPRISE_ENROLLMENT_KIOSK_LICENSE_TYPE);
   builder->Add("licenseCountTemplate",
                IDS_ENTERPRISE_ENROLLMENT_LICENSES_REMAINING_TEMPLATE);
-  builder->Add("selectEncryption", IDS_AD_ENCRYPTION_SELECTION_SELECT);
-  builder->Add("selectConfiguration", IDS_AD_CONFIG_SELECTION_SELECT);
 }
 
 void EnrollmentScreenHandler::GetAdditionalParameters(
diff --git a/chrome/browser/ui/webui/policy_ui.cc b/chrome/browser/ui/webui/policy_ui.cc
index 4eadc72..a3bb09c8 100644
--- a/chrome/browser/ui/webui/policy_ui.cc
+++ b/chrome/browser/ui/webui/policy_ui.cc
@@ -27,10 +27,19 @@
   source->AddLocalizedString("status", IDS_POLICY_STATUS);
   source->AddLocalizedString("statusDevice", IDS_POLICY_STATUS_DEVICE);
   source->AddLocalizedString("statusUser", IDS_POLICY_STATUS_USER);
+  source->AddLocalizedString("statusMachine", IDS_POLICY_STATUS_MACHINE);
   source->AddLocalizedString("labelEnterpriseEnrollmentDomain",
                              IDS_POLICY_LABEL_ENTERPRISE_ENROLLMENT_DOMAIN);
   source->AddLocalizedString("labelEnterpriseDisplayDomain",
                              IDS_POLICY_LABEL_ENTERPRISE_DISPLAY_DOMAIN);
+  source->AddLocalizedString("labelMachineEnrollmentDomain",
+                             IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DOMAIN);
+  source->AddLocalizedString("labelMachineEnrollmentToken",
+                             IDS_POLICY_LABEL_MACHINE_ENROLLMENT_TOKEN);
+  source->AddLocalizedString("labelMachineEntrollmentDeviceId",
+                             IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DEVICE_ID);
+  source->AddLocalizedString("labelMachineEnrollmentMachineName",
+                             IDS_POLICY_LABEL_MACHINE_ENROLLMENT_MACHINE_NAME);
   source->AddLocalizedString("labelUsername", IDS_POLICY_LABEL_USERNAME);
   source->AddLocalizedString("labelGaiaId", IDS_POLICY_LABEL_GAIA_ID);
   source->AddLocalizedString("labelClientId", IDS_POLICY_LABEL_CLIENT_ID);
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc
index db5f1afe..1e70ce1 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -25,6 +25,8 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/download_prefs.h"
+#include "chrome/browser/policy/browser_dm_token_storage.h"
+#include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/policy_conversions.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
@@ -40,7 +42,10 @@
 #include "components/policy/core/common/cloud/cloud_policy_manager.h"
 #include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h"
 #include "components/policy/core/common/cloud/cloud_policy_store.h"
+#include "components/policy/core/common/cloud/cloud_policy_util.h"
 #include "components/policy/core/common/cloud/cloud_policy_validator.h"
+#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
+#include "components/policy/core/common/cloud/machine_level_user_cloud_policy_store.h"
 #include "components/policy/core/common/policy_details.h"
 #include "components/policy/core/common/policy_scheduler.h"
 #include "components/policy/core/common/policy_types.h"
@@ -239,6 +244,28 @@
   DISALLOW_COPY_AND_ASSIGN(UserCloudPolicyStatusProvider);
 };
 
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+class MachineLevelUserCloudPolicyStatusProvider
+    : public PolicyStatusProvider,
+      public policy::CloudPolicyStore::Observer {
+ public:
+  explicit MachineLevelUserCloudPolicyStatusProvider(
+      policy::MachineLevelUserCloudPolicyStore* store);
+  ~MachineLevelUserCloudPolicyStatusProvider() override;
+
+  void GetStatus(base::DictionaryValue* dict) override;
+
+  // policy::CloudPolicyStore::Observer implementation.
+  void OnStoreLoaded(policy::CloudPolicyStore* store) override;
+  void OnStoreError(policy::CloudPolicyStore* store) override;
+
+ private:
+  policy::MachineLevelUserCloudPolicyStore* store_;
+
+  DISALLOW_COPY_AND_ASSIGN(MachineLevelUserCloudPolicyStatusProvider);
+};
+#endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
 #if defined(OS_CHROMEOS)
 // A cloud policy status provider for device policy.
 class DeviceCloudPolicyStatusProvider : public CloudPolicyCoreStatusProvider {
@@ -382,6 +409,72 @@
   ExtractDomainFromUsername(dict);
 }
 
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
+MachineLevelUserCloudPolicyStatusProvider::
+    MachineLevelUserCloudPolicyStatusProvider(
+        policy::MachineLevelUserCloudPolicyStore* store) {
+  store_ = store;
+  if (store_)
+    store_->AddObserver(this);
+}
+
+MachineLevelUserCloudPolicyStatusProvider::
+    ~MachineLevelUserCloudPolicyStatusProvider() {
+  if (store_)
+    store_->RemoveObserver(this);
+}
+
+void MachineLevelUserCloudPolicyStatusProvider::GetStatus(
+    base::DictionaryValue* dict) {
+  policy::BrowserDMTokenStorage* dmTokenStorage =
+      policy::BrowserDMTokenStorage::Get();
+
+  dict->SetString(
+      "refreshInterval",
+      ui::TimeFormat::Simple(
+          ui::TimeFormat::FORMAT_DURATION, ui::TimeFormat::LENGTH_SHORT,
+          base::TimeDelta::FromMilliseconds(
+              policy::CloudPolicyRefreshScheduler::kDefaultRefreshDelayMs)));
+
+  if (dmTokenStorage) {
+    dict->SetString("enrollmentToken",
+                    dmTokenStorage->RetrieveEnrollmentToken());
+
+    dict->SetString("deviceId", dmTokenStorage->RetrieveClientId());
+  }
+  if (store_) {
+    base::string16 status = policy::FormatStoreStatus(
+        store_->status(), store_->validation_status());
+
+    dict->SetString("status", status);
+    const em::PolicyData* policy = store_->policy();
+    if (policy) {
+      dict->SetString(
+          "timeSinceLastRefresh",
+          ui::TimeFormat::Simple(
+              ui::TimeFormat::FORMAT_ELAPSED, ui::TimeFormat::LENGTH_SHORT,
+              base::Time::NowFromSystemTime() -
+                  base::Time::FromJavaTime(policy->timestamp())));
+      std::string username = policy->username();
+      dict->SetString("domain", gaia::ExtractDomainName(username));
+    }
+  }
+  dict->SetString("machine", policy::GetMachineName());
+}
+
+void MachineLevelUserCloudPolicyStatusProvider::OnStoreLoaded(
+    policy::CloudPolicyStore* store) {
+  NotifyStatusChange();
+}
+
+void MachineLevelUserCloudPolicyStatusProvider::OnStoreError(
+    policy::CloudPolicyStore* store) {
+  NotifyStatusChange();
+}
+
+#endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
 #if defined(OS_CHROMEOS)
 DeviceCloudPolicyStatusProvider::DeviceCloudPolicyStatusProvider(
     policy::BrowserPolicyConnectorChromeOS* connector)
@@ -610,17 +703,32 @@
     user_status_provider_ = std::make_unique<UserCloudPolicyStatusProvider>(
         user_cloud_policy_manager->core());
   }
-#endif
+
+#if !defined(OS_ANDROID)
+  policy::MachineLevelUserCloudPolicyManager* manager =
+      g_browser_process->browser_policy_connector()
+          ->machine_level_user_cloud_policy_manager();
+
+  if (manager) {
+    machine_status_provider_ =
+        std::make_unique<MachineLevelUserCloudPolicyStatusProvider>(
+            manager->store());
+  }
+#endif  // !defined(OS_ANDROID)
+#endif  // defined(OS_CHROMEOS)
 
   if (!user_status_provider_.get())
     user_status_provider_ = std::make_unique<PolicyStatusProvider>();
   if (!device_status_provider_.get())
     device_status_provider_ = std::make_unique<PolicyStatusProvider>();
+  if (!machine_status_provider_.get())
+    machine_status_provider_ = std::make_unique<PolicyStatusProvider>();
 
   base::Closure update_callback(base::Bind(&PolicyUIHandler::SendStatus,
                                            base::Unretained(this)));
   user_status_provider_->SetStatusChangeCallback(update_callback);
   device_status_provider_->SetStatusChangeCallback(update_callback);
+  machine_status_provider_->SetStatusChangeCallback(update_callback);
   GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_CHROME, this);
   GetPolicyService()->AddObserver(policy::POLICY_DOMAIN_EXTENSIONS, this);
 
@@ -748,6 +856,7 @@
   device_status_provider_->GetStatus(device_status.get());
   if (!device_domain_.empty())
     device_status->SetString("domain", device_domain_);
+  std::string domain = device_domain_;
   std::unique_ptr<base::DictionaryValue> user_status(new base::DictionaryValue);
   user_status_provider_->GetStatus(user_status.get());
   std::string username;
@@ -755,9 +864,15 @@
   if (!username.empty())
     user_status->SetString("domain", gaia::ExtractDomainName(username));
 
+  std::unique_ptr<base::DictionaryValue> machine_status(
+      new base::DictionaryValue);
+  machine_status_provider_->GetStatus(machine_status.get());
+
   base::DictionaryValue status;
   if (!device_status->empty())
     status.Set("device", std::move(device_status));
+  if (!machine_status->empty())
+    status.Set("machine", std::move(machine_status));
   if (!user_status->empty())
     status.Set("user", std::move(user_status));
 
diff --git a/chrome/browser/ui/webui/policy_ui_handler.h b/chrome/browser/ui/webui/policy_ui_handler.h
index 025f7704..4a3d8dc 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.h
+++ b/chrome/browser/ui/webui/policy_ui_handler.h
@@ -117,6 +117,7 @@
   // the platform (Chrome OS / desktop) and type of policy that is in effect.
   std::unique_ptr<PolicyStatusProvider> user_status_provider_;
   std::unique_ptr<PolicyStatusProvider> device_status_provider_;
+  std::unique_ptr<PolicyStatusProvider> machine_status_provider_;
 
   base::WeakPtrFactory<PolicyUIHandler> weak_factory_;
 
diff --git a/chrome/browser/usb/usb_chooser_context.cc b/chrome/browser/usb/usb_chooser_context.cc
index 9f228c0..ac11ced 100644
--- a/chrome/browser/usb/usb_chooser_context.cc
+++ b/chrome/browser/usb/usb_chooser_context.cc
@@ -87,11 +87,7 @@
                          CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA),
       is_incognito_(profile->IsOffTheRecord()),
       client_binding_(this),
-      weak_factory_(this) {
-  // TODO(donna.wu@intel.com) set up connection with the device manager in
-  // AddObserver() after converting USB interfaces in UsbChooserController.
-  EnsureConnectionWithDeviceManager();
-}
+      weak_factory_(this) {}
 
 void UsbChooserContext::EnsureConnectionWithDeviceManager() {
   if (device_manager_)
@@ -271,6 +267,7 @@
 }
 
 void UsbChooserContext::AddObserver(Observer* observer) {
+  EnsureConnectionWithDeviceManager();
   observer_list_.AddObserver(observer);
 }
 
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc
index 1dcd0456..cb52904 100644
--- a/chrome/browser/usb/usb_chooser_controller.cc
+++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -13,17 +13,13 @@
 #include "chrome/browser/net/referrer.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/usb/usb_blocklist.h"
-#include "chrome/browser/usb/usb_chooser_context.h"
 #include "chrome/browser/usb/usb_chooser_context_factory.h"
 #include "chrome/browser/usb/web_usb_histograms.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "device/base/device_client.h"
-#include "device/usb/mojo/type_converters.h"
 #include "device/usb/public/cpp/filter_utils.h"
-#include "device/usb/usb_device.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
@@ -33,7 +29,6 @@
 
 using content::RenderFrameHost;
 using content::WebContents;
-using device::UsbDevice;
 
 namespace {
 
@@ -78,16 +73,8 @@
       filters_(std::move(device_filters)),
       callback_(std::move(callback)),
       web_contents_(WebContents::FromRenderFrameHost(render_frame_host)),
-      usb_service_observer_(this),
+      observer_(this),
       weak_factory_(this) {
-  device::UsbService* usb_service =
-      device::DeviceClient::Get()->GetUsbService();
-  if (usb_service) {
-    usb_service_observer_.Add(usb_service);
-    usb_service->GetDevices(base::Bind(&UsbChooserController::GotUsbDeviceList,
-                                       weak_factory_.GetWeakPtr()));
-  }
-
   RenderFrameHost* main_frame = web_contents_->GetMainFrame();
   requesting_origin_ = render_frame_host->GetLastCommittedURL().GetOrigin();
   embedding_origin_ = main_frame->GetLastCommittedURL().GetOrigin();
@@ -95,6 +82,9 @@
       Profile::FromBrowserContext(web_contents_->GetBrowserContext());
   chooser_context_ =
       UsbChooserContextFactory::GetForProfile(profile)->AsWeakPtr();
+  DCHECK(chooser_context_);
+  chooser_context_->GetDevices(base::BindOnce(
+      &UsbChooserController::GotUsbDeviceList, weak_factory_.GetWeakPtr()));
 }
 
 UsbChooserController::~UsbChooserController() {
@@ -172,9 +162,8 @@
       ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initialized */));
 }
 
-void UsbChooserController::OnDeviceAdded(scoped_refptr<UsbDevice> device) {
-  auto device_info = device::mojom::UsbDeviceInfo::From(*device);
-  DCHECK(device_info);
+void UsbChooserController::OnDeviceAdded(
+    device::mojom::UsbDeviceInfoPtr device_info) {
   if (DisplayDevice(*device_info)) {
     base::string16 device_name = FormatUsbDeviceName(*device_info);
     devices_.push_back(std::make_pair(std::move(device_info), device_name));
@@ -184,9 +173,8 @@
   }
 }
 
-void UsbChooserController::OnDeviceRemoved(scoped_refptr<UsbDevice> device) {
-  auto device_info = device::mojom::UsbDeviceInfo::From(*device);
-  DCHECK(device_info);
+void UsbChooserController::OnDeviceRemoved(
+    device::mojom::UsbDeviceInfoPtr device_info) {
   for (auto it = devices_.begin(); it != devices_.end(); ++it) {
     if (it->first->guid == device_info->guid) {
       size_t index = it - devices_.begin();
@@ -201,12 +189,15 @@
   }
 }
 
+void UsbChooserController::OnDeviceManagerConnectionError() {
+  observer_.RemoveAll();
+}
+
 // Get a list of devices that can be shown in the chooser bubble UI for
 // user to grant permsssion.
 void UsbChooserController::GotUsbDeviceList(
-    const std::vector<scoped_refptr<UsbDevice>>& devices) {
-  for (const auto& device : devices) {
-    auto device_info = device::mojom::UsbDeviceInfo::From(*device);
+    std::vector<::device::mojom::UsbDeviceInfoPtr> devices) {
+  for (auto& device_info : devices) {
     DCHECK(device_info);
     if (DisplayDevice(*device_info)) {
       base::string16 device_name = FormatUsbDeviceName(*device_info);
@@ -214,6 +205,12 @@
       ++device_name_map_[device_name];
     }
   }
+
+  // Listen to UsbChooserContext for OnDeviceAdded/Removed events after the
+  // enumeration.
+  if (chooser_context_)
+    observer_.Add(chooser_context_.get());
+
   if (view())
     view()->OnOptionsInitialized();
 }
diff --git a/chrome/browser/usb/usb_chooser_controller.h b/chrome/browser/usb/usb_chooser_controller.h
index 82a820a..7f893c6 100644
--- a/chrome/browser/usb/usb_chooser_controller.h
+++ b/chrome/browser/usb/usb_chooser_controller.h
@@ -14,8 +14,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/chooser_controller/chooser_controller.h"
+#include "chrome/browser/usb/usb_chooser_context.h"
 #include "device/usb/public/mojom/device.mojom.h"
-#include "device/usb/usb_service.h"
 #include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "url/gurl.h"
 
@@ -24,16 +24,10 @@
 class WebContents;
 }
 
-namespace device {
-class UsbDevice;
-}
-
-class UsbChooserContext;
-
 // UsbChooserController creates a chooser for WebUSB.
 // It is owned by ChooserBubbleDelegate.
 class UsbChooserController : public ChooserController,
-                             public device::UsbService::Observer {
+                             public UsbChooserContext::Observer {
  public:
   UsbChooserController(
       content::RenderFrameHost* render_frame_host,
@@ -52,13 +46,13 @@
   void Close() override;
   void OpenHelpCenterUrl() const override;
 
-  // device::UsbService::Observer:
-  void OnDeviceAdded(scoped_refptr<device::UsbDevice> device) override;
-  void OnDeviceRemoved(scoped_refptr<device::UsbDevice> device) override;
+  // UsbChooserContext::Observer implementation:
+  void OnDeviceAdded(device::mojom::UsbDeviceInfoPtr device_info) override;
+  void OnDeviceRemoved(device::mojom::UsbDeviceInfoPtr device_info) override;
+  void OnDeviceManagerConnectionError() override;
 
  private:
-  void GotUsbDeviceList(
-      const std::vector<scoped_refptr<device::UsbDevice>>& devices);
+  void GotUsbDeviceList(std::vector<device::mojom::UsbDeviceInfoPtr> devices);
   bool DisplayDevice(const device::mojom::UsbDeviceInfo& device) const;
 
   std::vector<device::mojom::UsbDeviceFilterPtr> filters_;
@@ -68,8 +62,7 @@
 
   content::WebContents* const web_contents_;
   base::WeakPtr<UsbChooserContext> chooser_context_;
-  ScopedObserver<device::UsbService, device::UsbService::Observer>
-      usb_service_observer_;
+  ScopedObserver<UsbChooserContext, UsbChooserContext::Observer> observer_;
 
   // Each pair is a (device, device name).
   std::vector<std::pair<device::mojom::UsbDeviceInfoPtr, base::string16>>
diff --git a/chrome/browser/usb/usb_chooser_controller_unittest.cc b/chrome/browser/usb/usb_chooser_controller_unittest.cc
index 6e784d5..0e46bad 100644
--- a/chrome/browser/usb/usb_chooser_controller_unittest.cc
+++ b/chrome/browser/usb/usb_chooser_controller_unittest.cc
@@ -56,6 +56,9 @@
         main_rfh(), std::move(device_filters), std::move(callback)));
     mock_usb_chooser_view_.reset(new MockUsbChooserView());
     usb_chooser_controller_->set_view(mock_usb_chooser_view_.get());
+    // Make sure the device::mojom::UsbDeviceManager::SetClient() call has
+    // been received.
+    base::RunLoop().RunUntilIdle();
   }
 
  protected:
@@ -80,6 +83,7 @@
       CreateMockUsbDevice("a", "001");
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionAdded(0)).Times(1);
   device_client_.usb_service()->AddDevice(device_a);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("a"), usb_chooser_controller_->GetOption(0));
 
@@ -87,6 +91,7 @@
       CreateMockUsbDevice("b", "002");
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionAdded(1)).Times(1);
   device_client_.usb_service()->AddDevice(device_b);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(2u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("b"), usb_chooser_controller_->GetOption(1));
 
@@ -94,6 +99,7 @@
       CreateMockUsbDevice("c", "003");
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionAdded(2)).Times(1);
   device_client_.usb_service()->AddDevice(device_c);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(3u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("c"), usb_chooser_controller_->GetOption(2));
 }
@@ -108,9 +114,11 @@
   scoped_refptr<device::MockUsbDevice> device_c =
       CreateMockUsbDevice("c", "003");
   device_client_.usb_service()->AddDevice(device_c);
+  base::RunLoop().RunUntilIdle();
 
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionRemoved(1)).Times(1);
   device_client_.usb_service()->RemoveDevice(device_b);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(2u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("a"), usb_chooser_controller_->GetOption(0));
   EXPECT_EQ(base::ASCIIToUTF16("c"), usb_chooser_controller_->GetOption(1));
@@ -119,17 +127,20 @@
   scoped_refptr<device::MockUsbDevice> device_non_existent =
       CreateMockUsbDevice("d", "001");
   device_client_.usb_service()->RemoveDevice(device_non_existent);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(2u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("a"), usb_chooser_controller_->GetOption(0));
   EXPECT_EQ(base::ASCIIToUTF16("c"), usb_chooser_controller_->GetOption(1));
 
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionRemoved(0)).Times(1);
   device_client_.usb_service()->RemoveDevice(device_a);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1u, usb_chooser_controller_->NumOptions());
   EXPECT_EQ(base::ASCIIToUTF16("c"), usb_chooser_controller_->GetOption(0));
 
   EXPECT_CALL(*mock_usb_chooser_view_, OnOptionRemoved(0)).Times(1);
   device_client_.usb_service()->RemoveDevice(device_c);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(0u, usb_chooser_controller_->NumOptions());
 }
 
@@ -137,13 +148,16 @@
   scoped_refptr<device::MockUsbDevice> device_a_1 =
       CreateMockUsbDevice("a", "001");
   device_client_.usb_service()->AddDevice(device_a_1);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(base::ASCIIToUTF16("a"), usb_chooser_controller_->GetOption(0));
+
   scoped_refptr<device::MockUsbDevice> device_b =
       CreateMockUsbDevice("b", "002");
   device_client_.usb_service()->AddDevice(device_b);
   scoped_refptr<device::MockUsbDevice> device_a_2 =
       CreateMockUsbDevice("a", "002");
   device_client_.usb_service()->AddDevice(device_a_2);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(base::ASCIIToUTF16("a (001)"),
             usb_chooser_controller_->GetOption(0));
   EXPECT_EQ(base::ASCIIToUTF16("b"), usb_chooser_controller_->GetOption(1));
@@ -151,6 +165,7 @@
             usb_chooser_controller_->GetOption(2));
 
   device_client_.usb_service()->RemoveDevice(device_a_1);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(base::ASCIIToUTF16("b"), usb_chooser_controller_->GetOption(0));
   EXPECT_EQ(base::ASCIIToUTF16("a"), usb_chooser_controller_->GetOption(1));
 }
@@ -161,6 +176,7 @@
   scoped_refptr<device::MockUsbDevice> device =
       new device::MockUsbDevice(vendor_id, product_id);
   device_client_.usb_service()->AddDevice(device);
+  base::RunLoop().RunUntilIdle();
   EXPECT_EQ(base::ASCIIToUTF16("Unknown device [007b:01c8]"),
             usb_chooser_controller_->GetOption(0));
 }
diff --git a/chrome/common/apps/platform_apps/api/api_sources.gni b/chrome/common/apps/platform_apps/api/api_sources.gni
index bc0b994..dd8dcff 100644
--- a/chrome/common/apps/platform_apps/api/api_sources.gni
+++ b/chrome/common/apps/platform_apps/api/api_sources.gni
@@ -16,4 +16,4 @@
 chrome_apps_api_schema_files =
     get_path_info(chrome_apps_api_schema_files_, "abspath")
 
-apps_api_root_namespace = "apps::api::%(namespace)s"
+apps_api_root_namespace = "chrome_apps::api::%(namespace)s"
diff --git a/chrome/common/apps/platform_apps/chrome_apps_api_provider.cc b/chrome/common/apps/platform_apps/chrome_apps_api_provider.cc
index 246a192..09ad6d4 100644
--- a/chrome/common/apps/platform_apps/chrome_apps_api_provider.cc
+++ b/chrome/common/apps/platform_apps/chrome_apps_api_provider.cc
@@ -13,7 +13,7 @@
 #include "extensions/common/features/json_feature_provider_source.h"
 #include "extensions/common/permissions/permissions_info.h"
 
-namespace apps {
+namespace chrome_apps {
 
 ChromeAppsAPIProvider::ChromeAppsAPIProvider() {}
 ChromeAppsAPIProvider::~ChromeAppsAPIProvider() = default;
@@ -61,4 +61,4 @@
   // No apps-specific manifest handlers (yet).
 }
 
-}  // namespace apps
+}  // namespace chrome_apps
diff --git a/chrome/common/apps/platform_apps/chrome_apps_api_provider.h b/chrome/common/apps/platform_apps/chrome_apps_api_provider.h
index e6c1eaf..b5312b85 100644
--- a/chrome/common/apps/platform_apps/chrome_apps_api_provider.h
+++ b/chrome/common/apps/platform_apps/chrome_apps_api_provider.h
@@ -7,7 +7,7 @@
 
 #include "extensions/common/extensions_api_provider.h"
 
-namespace apps {
+namespace chrome_apps {
 
 class ChromeAppsAPIProvider : public extensions::ExtensionsAPIProvider {
  public:
@@ -31,6 +31,6 @@
   DISALLOW_COPY_AND_ASSIGN(ChromeAppsAPIProvider);
 };
 
-}  // namespace apps
+}  // namespace chrome_apps
 
 #endif  // CHROME_COMMON_APPS_PLATFORM_APPS_CHROME_APPS_API_PROVIDER_H_
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 16635c3..81d7e2c 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -885,10 +885,6 @@
 // Allows hosted apps to be opened in windows on Mac.
 const char kEnableHostedAppsInWindows[] = "enable-hosted-apps-in-windows";
 
-// Enables use of toolkit-views based native app windows.
-const char kEnableMacViewsNativeAppWindows[] =
-    "enable-mac-views-native-app-windows";
-
 // Shows a notification when quitting Chrome with hosted apps running. Default
 // behavior is to also quit all hosted apps.
 const char kHostedAppQuitNotification[] = "enable-hosted-app-quit-notification";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 7d914782..fe990df2 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -266,7 +266,6 @@
 extern const char kEnableFullscreenTabDetaching[];
 extern const char kEnableFullscreenToolbarReveal[];
 extern const char kEnableHostedAppsInWindows[];
-extern const char kEnableMacViewsNativeAppWindows[];
 extern const char kEnableUserMetrics[];
 extern const char kHostedAppQuitNotification[];
 extern const char kMetricsClientID[];
diff --git a/chrome/common/extensions/manifest_handlers/extension_action_handler_unittest.cc b/chrome/common/extensions/manifest_handlers/extension_action_handler_unittest.cc
new file mode 100644
index 0000000..188af2ea
--- /dev/null
+++ b/chrome/common/extensions/manifest_handlers/extension_action_handler_unittest.cc
@@ -0,0 +1,59 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/manifest_handlers/extension_action_handler.h"
+
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+#include "chrome/common/chrome_paths.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/file_util.h"
+#include "extensions/common/manifest.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+base::FilePath GetTestDataDir() {
+  base::FilePath path;
+  base::PathService::Get(chrome::DIR_TEST_DATA, &path);
+  return path.AppendASCII("extensions").AppendASCII("manifest_handlers");
+}
+
+}  // namespace
+
+namespace extensions {
+
+// Tests that an unpacked extension with an invisible browser action
+// default icon fails as expected.
+TEST(ExtensionActionHandlerTest, LoadInvisibleBrowserActionIconUnpacked) {
+  base::FilePath extension_dir =
+      GetTestDataDir().AppendASCII("browser_action_invisible_icon");
+  // Set the flag that enables the error.
+  file_util::SetReportErrorForInvisibleIconForTesting(true);
+  std::string error;
+  scoped_refptr<Extension> extension(file_util::LoadExtension(
+      extension_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
+  file_util::SetReportErrorForInvisibleIconForTesting(false);
+  EXPECT_FALSE(extension);
+  EXPECT_EQ("The icon is not sufficiently visible 'invisible_icon.png'.",
+            error);
+}
+
+// Tests that an unpacked extension with an invisible page action
+// default icon fails as expected.
+TEST(ExtensionActionHandlerTest, LoadInvisiblePageActionIconUnpacked) {
+  base::FilePath extension_dir =
+      GetTestDataDir().AppendASCII("page_action_invisible_icon");
+  // Set the flag that enables the error.
+  file_util::SetReportErrorForInvisibleIconForTesting(true);
+  std::string error;
+  scoped_refptr<Extension> extension(file_util::LoadExtension(
+      extension_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
+  file_util::SetReportErrorForInvisibleIconForTesting(false);
+  EXPECT_FALSE(extension);
+  EXPECT_EQ("The icon is not sufficiently visible 'invisible_icon.png'.",
+            error);
+}
+
+}  // namespace extensions
diff --git a/chrome/common/initialize_extensions_client.cc b/chrome/common/initialize_extensions_client.cc
index 9c24e76..3e9d4cf 100644
--- a/chrome/common/initialize_extensions_client.cc
+++ b/chrome/common/initialize_extensions_client.cc
@@ -20,7 +20,7 @@
   if (!initialized) {
     initialized = true;
     extensions_client->AddAPIProvider(
-        std::make_unique<apps::ChromeAppsAPIProvider>());
+        std::make_unique<chrome_apps::ChromeAppsAPIProvider>());
     extensions::ExtensionsClient::Set(extensions_client.get());
   }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index ddc0d48..756dc405 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1971,7 +1971,6 @@
         "../browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm",
         "../browser/ui/cocoa/touchbar/browser_window_touch_bar_controller_browsertest.mm",
         "../browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_browsertest.mm",
-        "../browser/ui/cocoa/view_id_util_browsertest.mm",
 
         ## TODO(crbug/845389): Re-Enable the following, which were temporarily
         ## omitted from the build, but still in use by the Cocoa browser.
@@ -2360,7 +2359,6 @@
     "../browser/autocomplete/chrome_autocomplete_scheme_classifier_unittest.cc",
     "../browser/autocomplete/search_provider_unittest.cc",
     "../browser/autocomplete/shortcuts_provider_extension_unittest.cc",
-    "../browser/autofill/strike_database_unittest.cc",
     "../browser/background_sync/background_sync_controller_impl_unittest.cc",
     "../browser/background_sync/background_sync_permission_context_unittest.cc",
     "../browser/banners/app_banner_settings_helper_unittest.cc",
@@ -3733,6 +3731,7 @@
       "../common/extensions/manifest_handlers/automation_unittest.cc",
       "../common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc",
       "../common/extensions/manifest_handlers/exclude_matches_manifest_unittest.cc",
+      "../common/extensions/manifest_handlers/extension_action_handler_unittest.cc",
       "../common/extensions/manifest_handlers/settings_overrides_handler_unittest.cc",
       "../common/extensions/manifest_handlers/ui_overrides_handler_unittest.cc",
       "../common/extensions/manifest_tests/chrome_manifest_test.cc",
@@ -4124,7 +4123,6 @@
         "../browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm",
         "../browser/ui/cocoa/browser_window_cocoa_unittest.mm",
         "../browser/ui/cocoa/browser_window_controller_unittest.mm",
-        "../browser/ui/cocoa/browser_window_layout_unittest.mm",
         "../browser/ui/cocoa/browser_window_utils_unittest.mm",
         "../browser/ui/cocoa/chrome_browser_window_unittest.mm",
         "../browser/ui/cocoa/color_panel_cocoa_unittest.mm",
@@ -4140,7 +4138,6 @@
         "../browser/ui/cocoa/history_menu_bridge_unittest.mm",
         "../browser/ui/cocoa/history_menu_cocoa_controller_unittest.mm",
         "../browser/ui/cocoa/history_overlay_controller_unittest.mm",
-        "../browser/ui/cocoa/hover_close_button_unittest.mm",
         "../browser/ui/cocoa/main_menu_builder_unittest.mm",
         "../browser/ui/cocoa/media_picker/desktop_media_picker_controller_unittest.mm",
         "../browser/ui/cocoa/notifications/notification_builder_mac_unittest.mm",
@@ -4150,15 +4147,10 @@
         "../browser/ui/cocoa/page_info/page_info_bubble_controller_unittest.mm",
         "../browser/ui/cocoa/profiles/profile_menu_controller_unittest.mm",
         "../browser/ui/cocoa/scoped_menu_bar_lock_unittest.mm",
-        "../browser/ui/cocoa/spinner_view_unittest.mm",
         "../browser/ui/cocoa/status_icons/status_icon_mac_unittest.mm",
         "../browser/ui/cocoa/styled_text_field_cell_unittest.mm",
         "../browser/ui/cocoa/styled_text_field_unittest.mm",
         "../browser/ui/cocoa/tabbed_browser_window_unittest.mm",
-        "../browser/ui/cocoa/tabs/tab_controller_unittest.mm",
-        "../browser/ui/cocoa/tabs/tab_strip_controller_unittest.mm",
-        "../browser/ui/cocoa/tabs/tab_strip_view_unittest.mm",
-        "../browser/ui/cocoa/tabs/tab_view_unittest.mm",
         "../browser/ui/cocoa/test/cocoa_profile_test.h",
         "../browser/ui/cocoa/test/cocoa_profile_test.mm",
         "../browser/ui/cocoa/test/run_loop_testing_unittest.mm",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index 530e280a..ff585414 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -97,7 +97,7 @@
   extensions_browser_client_.reset(
       new extensions::ChromeExtensionsBrowserClient);
   extensions_browser_client_->AddAPIProvider(
-      std::make_unique<apps::ChromeAppsBrowserAPIProvider>());
+      std::make_unique<chrome_apps::ChromeAppsBrowserAPIProvider>());
   extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
   extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
 #endif
diff --git a/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/README b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/README
new file mode 100644
index 0000000..d52000c
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/README
@@ -0,0 +1,2 @@
+The file invisible_icon.png is an image with a single visible pixel. It is
+considered "invisible" by our icon analysis code.
diff --git a/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/invisible_icon.png b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/invisible_icon.png
new file mode 100644
index 0000000..3729d818
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/invisible_icon.png
Binary files differ
diff --git a/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/manifest.json b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/manifest.json
new file mode 100644
index 0000000..901e126
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/browser_action_invisible_icon/manifest.json
@@ -0,0 +1,10 @@
+{
+  "name": "My extension with an invisible icon",
+  "version": "1.0",
+  "browser_action": {
+    "default_icon": {
+      "16": "invisible_icon.png"
+    }
+  },
+  "manifest_version": 2
+}
diff --git a/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/README b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/README
new file mode 100644
index 0000000..d52000c
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/README
@@ -0,0 +1,2 @@
+The file invisible_icon.png is an image with a single visible pixel. It is
+considered "invisible" by our icon analysis code.
diff --git a/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/invisible_icon.png b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/invisible_icon.png
new file mode 100644
index 0000000..3729d818
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/invisible_icon.png
Binary files differ
diff --git a/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/manifest.json b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/manifest.json
new file mode 100644
index 0000000..ed21188a
--- /dev/null
+++ b/chrome/test/data/extensions/manifest_handlers/page_action_invisible_icon/manifest.json
@@ -0,0 +1,10 @@
+{
+  "name": "My extension with an invisible icon",
+  "version": "1.0",
+  "page_action": {
+    "default_icon": {
+      "16": "invisible_icon.png"
+    }
+  },
+  "manifest_version": 2
+}
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 7f86a88..9b4a632 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-11099.0.0
\ No newline at end of file
+11100.0.0
\ No newline at end of file
diff --git a/chromeos/dbus/fake_auth_policy_client.cc b/chromeos/dbus/fake_auth_policy_client.cc
index 7c720b18..d798ef2 100644
--- a/chromeos/dbus/fake_auth_policy_client.cc
+++ b/chromeos/dbus/fake_auth_policy_client.cc
@@ -113,21 +113,28 @@
   DCHECK(tpm_util::IsActiveDirectoryLocked());
   authpolicy::ErrorType error = authpolicy::ERROR_NONE;
   authpolicy::ActiveDirectoryAccountInfo account_info;
-  if (!started_) {
+  if (auth_error_ != authpolicy::ERROR_NONE) {
+    error = auth_error_;
+  } else if (!started_) {
     LOG(ERROR) << "authpolicyd not started";
     error = authpolicy::ERROR_DBUS_FAILURE;
   } else {
-    if (auth_error_ == authpolicy::ERROR_NONE) {
-      if (request.account_id().empty())
-        account_info.set_account_id(
-            base::MD5String(request.user_principal_name()));
-      else
-        account_info.set_account_id(request.account_id());
-    }
-    error = auth_error_;
+    std::vector<std::string> parts =
+        base::SplitString(request.user_principal_name(), "@",
+                          base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+    if (parts.size() != 2 || parts[0].empty() || parts[1].empty())
+      error = authpolicy::ERROR_PARSE_UPN_FAILED;
   }
-  if (error == authpolicy::ERROR_NONE)
+
+  if (error == authpolicy::ERROR_NONE) {
+    if (request.account_id().empty()) {
+      account_info.set_account_id(
+          base::MD5String(request.user_principal_name()));
+    } else {
+      account_info.set_account_id(request.account_id());
+    }
     SetUserKerberosFiles(kDefaultKerberosCreds, kDefaultKerberosConf);
+  }
   PostDelayedClosure(base::BindOnce(std::move(callback), error, account_info),
                      dbus_operation_delay_);
 }
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 2aaa2e8..d139947 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -156,6 +156,8 @@
     "search_field.h",
     "state_names.cc",
     "state_names.h",
+    "strike_database.cc",
+    "strike_database.h",
     "subkey_requester.cc",
     "subkey_requester.h",
     "suggestion.cc",
@@ -262,6 +264,7 @@
     "//components/data_use_measurement/core",
     "//components/infobars/core",
     "//components/keyed_service/core",
+    "//components/leveldb_proto:leveldb_proto",
     "//components/os_crypt",
     "//components/pref_registry",
     "//components/prefs",
@@ -339,6 +342,8 @@
     "test_personal_data_manager.h",
     "test_region_data_loader.cc",
     "test_region_data_loader.h",
+    "test_strike_database.cc",
+    "test_strike_database.h",
     "test_sync_service.cc",
     "test_sync_service.h",
     "webdata/autofill_sync_bridge_test_util.cc",
@@ -480,6 +485,7 @@
     "rationalization_util_unittest.cc",
     "region_combobox_model_unittest.cc",
     "search_field_unittest.cc",
+    "strike_database_unittest.cc",
     "subkey_requester_unittest.cc",
     "ui/card_unmask_prompt_controller_impl_unittest.cc",
     "validation_unittest.cc",
diff --git a/components/autofill/core/browser/DEPS b/components/autofill/core/browser/DEPS
index f3199c0..0399a2e 100644
--- a/components/autofill/core/browser/DEPS
+++ b/components/autofill/core/browser/DEPS
@@ -3,6 +3,7 @@
   "+components/grit/components_scaled_resources.h",
   "+components/infobars/core",
   "+components/keyed_service/core",
+  "+components/leveldb_proto",
   "+components/metrics",
   "+components/policy",
   "+components/security_state",
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index 88d46f5f..445c56dc 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -5932,11 +5932,6 @@
     EXPECT_TRUE(autofill_manager_->ShouldUploadForm(FormStructure(form)));
   }
 
-  // Has two fields which are password fields.
-  test::CreateTestFormField("New Password", "new_pw", "", "password", &field);
-  form.fields.push_back(field);
-  EXPECT_TRUE(autofill_manager_->ShouldUploadForm(FormStructure(form)));
-
   // Autofill disabled.
   autofill_manager_->SetAutofillEnabled(false);
   EXPECT_FALSE(autofill_manager_->ShouldUploadForm(FormStructure(form)));
@@ -6175,6 +6170,8 @@
 
 // Test that a sign-in form submission sends an upload with types matching the
 // fields.
+// TODO(https://crbug.com/889472): Remove this test together with sending
+// sign-in vote.
 TEST_F(AutofillManagerTest, SignInFormSubmission_Upload) {
   // Set up our form data (it's already filled out with user data).
   FormData form;
@@ -6212,16 +6209,11 @@
 
   std::string signature = form_structure->FormSignatureAsStr();
 
-  ServerFieldTypeSet uploaded_available_types;
   EXPECT_CALL(*download_manager_,
               StartUploadRequest(_, false, _, std::string(), true))
-      .WillOnce(DoAll(SaveArg<2>(&uploaded_available_types), Return(true)));
+      .Times(0);
   autofill_manager_->MaybeStartVoteUploadProcess(std::move(form_structure),
                                                  base::TimeTicks::Now(), true);
-
-  EXPECT_EQ(signature, autofill_manager_->GetSubmittedFormSignature());
-  EXPECT_NE(uploaded_available_types.end(),
-            uploaded_available_types.find(autofill::PASSWORD));
 }
 
 // Test that with small form upload enabled but heuristics and query disabled
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 38efc0c..d313284 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -431,7 +431,6 @@
     const std::string& login_form_signature,
     bool observed_submission,
     AutofillUploadContents* upload) const {
-  DCHECK(ShouldBeUploaded());
   DCHECK(AllTypesCaptured(*this, available_field_types));
 
   upload->set_submission(observed_submission);
@@ -726,8 +725,7 @@
 }
 
 bool FormStructure::ShouldBeUploaded() const {
-  return (has_password_field_ ||
-          active_field_count() >= MinRequiredFieldsForUpload()) &&
+  return active_field_count() >= MinRequiredFieldsForUpload() &&
          ShouldBeParsed();
 }
 
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index 2111f0c..2cf3f6e 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -132,8 +132,8 @@
   // directly.
   bool ShouldBeQueried() const;
 
-  // Returns true if we should upload votes for this form to the crowd-sourcing
-  // server.
+  // Returns true if we should upload Autofill votes for this form to the
+  // crowd-sourcing server. It is not applied for Password Manager votes.
   bool ShouldBeUploaded() const;
 
   // Sets the field types to be those set for |cached_form|.
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc
index c205ac6..99e4b69 100644
--- a/components/autofill/core/browser/form_structure_unittest.cc
+++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -6262,4 +6262,20 @@
   EXPECT_EQ(1u, encoded_signatures.size());
 }
 
+// Tests that an Autofill upload for password form with 1 field should not be
+// uploaded.
+TEST_F(FormStructureTest, OneFieldPasswordFormShouldNotBeUpload) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeatures(
+      /* enabled features */ {kAutofillEnforceMinRequiredFieldsForUpload},
+      /* disabled features */ {kAutofillEnforceMinRequiredFieldsForQuery});
+  FormData form;
+  FormFieldData field;
+  field.name = ASCIIToUTF16("Password");
+  field.form_control_type = "password";
+  form.fields.push_back(field);
+
+  EXPECT_FALSE(FormStructure(form).ShouldBeUploaded());
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/proto/BUILD.gn b/components/autofill/core/browser/proto/BUILD.gn
index 04f9f54..06981f9 100644
--- a/components/autofill/core/browser/proto/BUILD.gn
+++ b/components/autofill/core/browser/proto/BUILD.gn
@@ -10,5 +10,6 @@
     "password_requirements.proto",
     "password_requirements_shard.proto",
     "server.proto",
+    "strike_data.proto",
   ]
 }
diff --git a/chrome/browser/autofill/strike_data.proto b/components/autofill/core/browser/proto/strike_data.proto
similarity index 100%
rename from chrome/browser/autofill/strike_data.proto
rename to components/autofill/core/browser/proto/strike_data.proto
diff --git a/chrome/browser/autofill/strike_database.cc b/components/autofill/core/browser/strike_database.cc
similarity index 95%
rename from chrome/browser/autofill/strike_database.cc
rename to components/autofill/core/browser/strike_database.cc
index f84d4e0..c4831518 100644
--- a/chrome/browser/autofill/strike_database.cc
+++ b/components/autofill/core/browser/strike_database.cc
@@ -2,11 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/autofill/strike_database.h"
+#include "components/autofill/core/browser/strike_database.h"
+
+#include <string>
+#include <utility>
+#include <vector>
 
 #include "base/task/post_task.h"
 #include "base/time/time.h"
-#include "chrome/browser/autofill/strike_data.pb.h"
+#include "components/autofill/core/browser/proto/strike_data.pb.h"
 #include "components/leveldb_proto/proto_database_impl.h"
 
 namespace autofill {
diff --git a/chrome/browser/autofill/strike_database.h b/components/autofill/core/browser/strike_database.h
similarity index 92%
rename from chrome/browser/autofill/strike_database.h
rename to components/autofill/core/browser/strike_database.h
index 68ad5d8..859478b 100644
--- a/chrome/browser/autofill/strike_database.h
+++ b/components/autofill/core/browser/strike_database.h
@@ -2,10 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_H_
-#define CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_H_
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
 
 #include <memory>
+#include <string>
 
 #include "base/callback_forward.h"
 #include "base/memory/weak_ptr.h"
@@ -32,7 +33,7 @@
 
   using StrikeDataProto = leveldb_proto::ProtoDatabase<StrikeData>;
 
-  StrikeDatabase(const base::FilePath& database_dir);
+  explicit StrikeDatabase(const base::FilePath& database_dir);
   ~StrikeDatabase();
 
   // Passes the number of strikes for |key| to |outer_callback|. In the case
@@ -90,4 +91,4 @@
 
 }  // namespace autofill
 
-#endif  // CHROME_BROWSER_AUTOFILL_STRIKE_DATABASE_H_
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_STRIKE_DATABASE_H_
diff --git a/chrome/browser/autofill/strike_database_unittest.cc b/components/autofill/core/browser/strike_database_unittest.cc
similarity index 86%
rename from chrome/browser/autofill/strike_database_unittest.cc
rename to components/autofill/core/browser/strike_database_unittest.cc
index ff6e60b..81280af 100644
--- a/chrome/browser/autofill/strike_database_unittest.cc
+++ b/components/autofill/core/browser/strike_database_unittest.cc
@@ -2,25 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/autofill/strike_database.h"
+#include "components/autofill/core/browser/strike_database.h"
 
+#include <utility>
+#include <vector>
+
+#include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/autofill/strike_data.pb.h"
-#include "chrome/browser/autofill/test_strike_database.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/leveldb_proto/proto_database.h"
-#include "components/leveldb_proto/proto_database_impl.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/test/test_browser_thread_bundle.h"
+#include "components/autofill/core/browser/proto/strike_data.pb.h"
+#include "components/autofill/core/browser/test_strike_database.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace autofill {
 
 class StrikeDatabaseTest : public ::testing::Test {
  public:
-  StrikeDatabaseTest()
-      : db_(profile_.GetPath().Append(FILE_PATH_LITERAL("StrikeDatabase"))) {}
+  StrikeDatabaseTest() : db_(InitFilePath()) {}
 
   void AddEntries(
       std::vector<std::pair<std::string, StrikeData>> entries_to_add) {
@@ -79,10 +78,17 @@
   }
 
  private:
+  static const base::FilePath InitFilePath() {
+    base::ScopedTempDir temp_dir_;
+    EXPECT_TRUE(temp_dir_.CreateUniqueTempDir());
+    const base::FilePath file_path =
+        temp_dir_.GetPath().AppendASCII("StrikeDatabaseTest");
+    return file_path;
+  }
+
   int num_strikes_;
-  content::TestBrowserThreadBundle thread_bundle_;
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::unique_ptr<StrikeData> strike_data_;
-  TestingProfile profile_;
   TestStrikeDatabase db_;
 };
 
diff --git a/chrome/browser/autofill/test_strike_database.cc b/components/autofill/core/browser/test_strike_database.cc
similarity index 86%
rename from chrome/browser/autofill/test_strike_database.cc
rename to components/autofill/core/browser/test_strike_database.cc
index 38edfe7c..5f2bde44 100644
--- a/chrome/browser/autofill/test_strike_database.cc
+++ b/components/autofill/core/browser/test_strike_database.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/autofill/test_strike_database.h"
+#include "components/autofill/core/browser/test_strike_database.h"
 
-#include "chrome/browser/autofill/strike_data.pb.h"
+#include "components/autofill/core/browser/proto/strike_data.pb.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/test_strike_database.h b/components/autofill/core/browser/test_strike_database.h
new file mode 100644
index 0000000..2419ad282
--- /dev/null
+++ b/components/autofill/core/browser/test_strike_database.h
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "components/autofill/core/browser/strike_database.h"
+
+namespace autofill {
+
+class TestStrikeDatabase : public StrikeDatabase {
+ public:
+  explicit TestStrikeDatabase(const base::FilePath& database_dir);
+
+  void AddEntries(
+      std::vector<std::pair<std::string, StrikeData>> entries_to_add,
+      const SetValueCallback& callback);
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_STRIKE_DATABASE_H_
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index 0ef9491..c7e3341 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -73,7 +73,7 @@
 
 // Controls whether the iframe messaging is enabled for autofill on iOS.
 const base::Feature kAutofillEnableIFrameSupportOniOS{
-    "AutofillEnableIFrameSupportOniOS", base::FEATURE_DISABLED_BY_DEFAULT};
+    "AutofillEnableIFrameSupportOniOS", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Controls whether the server credit cards are offered to be filled and
 // uploaded to Google Pay if the sync service is in auth error.
diff --git a/components/constrained_window/constrained_window_views.h b/components/constrained_window/constrained_window_views.h
index 42e9018..64f1e30 100644
--- a/components/constrained_window/constrained_window_views.h
+++ b/components/constrained_window/constrained_window_views.h
@@ -51,12 +51,6 @@
 // notify via WillClose() when it is being destroyed.
 void ShowModalDialog(gfx::NativeWindow dialog,
                      content::WebContents* web_contents);
-#if defined(OS_MACOSX)
-// Temporary shim for Polychrome. See bottom of first comment in
-// https://crbug.com/804950 for details.
-void ShowModalDialogCocoa(gfx::NativeWindow dialog,
-                          content::WebContents* web_contents);
-#endif
 
 // Calls CreateWebModalDialogViews, shows the dialog, and returns its widget.
 views::Widget* ShowWebModalDialogViews(
diff --git a/components/keyed_service/content/browser_context_keyed_service_factory.cc b/components/keyed_service/content/browser_context_keyed_service_factory.cc
index acfd882a..258fae84 100644
--- a/components/keyed_service/content/browser_context_keyed_service_factory.cc
+++ b/components/keyed_service/content/browser_context_keyed_service_factory.cc
@@ -16,34 +16,48 @@
 void BrowserContextKeyedServiceFactory::SetTestingFactory(
     content::BrowserContext* context,
     TestingFactoryFunction testing_factory) {
+  TestingFactory wrapped_factory;
+  if (testing_factory) {
+    wrapped_factory = base::BindRepeating(testing_factory);
+  }
+  SetTestingFactory(context, std::move(wrapped_factory));
+}
+
+KeyedService* BrowserContextKeyedServiceFactory::SetTestingFactoryAndUse(
+    content::BrowserContext* context,
+    TestingFactoryFunction testing_factory) {
+  DCHECK(testing_factory);
+  return SetTestingFactoryAndUse(context, base::BindRepeating(testing_factory));
+}
+
+void BrowserContextKeyedServiceFactory::SetTestingFactory(
+    content::BrowserContext* context,
+    TestingFactory testing_factory) {
   KeyedServiceFactory::TestingFactory wrapped_factory;
   if (testing_factory) {
     wrapped_factory = base::BindRepeating(
-        [](TestingFactoryFunction testing_factory,
+        [](const TestingFactory& testing_factory,
            base::SupportsUserData* context) {
-          return testing_factory(
+          return testing_factory.Run(
               static_cast<content::BrowserContext*>(context));
         },
-        testing_factory);
+        std::move(testing_factory));
   }
   KeyedServiceFactory::SetTestingFactory(context, std::move(wrapped_factory));
 }
 
 KeyedService* BrowserContextKeyedServiceFactory::SetTestingFactoryAndUse(
     content::BrowserContext* context,
-    TestingFactoryFunction testing_factory) {
-  KeyedServiceFactory::TestingFactory wrapped_factory;
-  if (testing_factory) {
-    wrapped_factory = base::BindRepeating(
-        [](TestingFactoryFunction testing_factory,
-           base::SupportsUserData* context) {
-          return testing_factory(
-              static_cast<content::BrowserContext*>(context));
-        },
-        testing_factory);
-  }
+    TestingFactory testing_factory) {
+  DCHECK(testing_factory);
   return KeyedServiceFactory::SetTestingFactoryAndUse(
-      context, std::move(wrapped_factory));
+      context, base::BindRepeating(
+                   [](const TestingFactory& testing_factory,
+                      base::SupportsUserData* context) {
+                     return testing_factory.Run(
+                         static_cast<content::BrowserContext*>(context));
+                   },
+                   std::move(testing_factory)));
 }
 
 BrowserContextKeyedServiceFactory::BrowserContextKeyedServiceFactory(
diff --git a/components/keyed_service/content/browser_context_keyed_service_factory.h b/components/keyed_service/content/browser_context_keyed_service_factory.h
index cc1d708..b8fd9d5 100644
--- a/components/keyed_service/content/browser_context_keyed_service_factory.h
+++ b/components/keyed_service/content/browser_context_keyed_service_factory.h
@@ -42,6 +42,7 @@
   // A function that supplies the instance of a KeyedService for a given
   // BrowserContext. This is used primarily for testing, where we want to feed
   // a specific mock into the BCKSF system.
+  // DEPRECATED: use TestingFactory instead, see http://crbug.com/809610
   using TestingFactoryFunction =
       std::unique_ptr<KeyedService> (*)(content::BrowserContext* context);
 
@@ -49,15 +50,36 @@
   // the KeyedService when requested.  |factory| can be NULL to signal that
   // KeyedService should be NULL. Multiple calls to SetTestingFactory() are
   // allowed; previous services will be shut down.
+  // DEPRECATED: use TestingFactory version instead, see http://crbug.com/809610
   void SetTestingFactory(content::BrowserContext* context,
                          TestingFactoryFunction factory);
 
   // Associates |factory| with |context| and immediately returns the created
   // KeyedService. Since the factory will be used immediately, it may not be
   // NULL.
+  // DEPRECATED: use TestingFactory version instead, see http://crbug.com/809610
   KeyedService* SetTestingFactoryAndUse(content::BrowserContext* context,
                                         TestingFactoryFunction factory);
 
+  // A callback that supplies the instance of a KeyedService for a given
+  // BrowserContext. This is used primarily for testing, where we want to feed
+  // a specific test double into the BCKSF system.
+  using TestingFactory = base::RepeatingCallback<std::unique_ptr<KeyedService>(
+      content::BrowserContext* context)>;
+
+  // Associates |testing_factory| with |context| so that |testing_factory| is
+  // used to create the KeyedService when requested.  |testing_factory| can be
+  // empty to signal that KeyedService should be null. Multiple calls to
+  // SetTestingFactory() are allowed; previous services will be shut down.
+  void SetTestingFactory(content::BrowserContext* context,
+                         TestingFactory testing_factory);
+
+  // Associates |testing_factory| with |context| and immediately returns the
+  // created KeyedService. Since the factory will be used immediately, it may
+  // not be empty.
+  KeyedService* SetTestingFactoryAndUse(content::BrowserContext* context,
+                                        TestingFactory testing_factory);
+
  protected:
   // BrowserContextKeyedServiceFactories must communicate with a
   // BrowserContextDependencyManager. For all non-test code, write your subclass
diff --git a/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.cc b/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.cc
index ad23f57..48dfbf18 100644
--- a/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.cc
+++ b/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.cc
@@ -13,15 +13,33 @@
 void RefcountedBrowserContextKeyedServiceFactory::SetTestingFactory(
     content::BrowserContext* context,
     TestingFactoryFunction testing_factory) {
+  TestingFactory wrapped_factory;
+  if (testing_factory) {
+    wrapped_factory = base::BindRepeating(testing_factory);
+  }
+  SetTestingFactory(context, std::move(wrapped_factory));
+}
+
+scoped_refptr<RefcountedKeyedService>
+RefcountedBrowserContextKeyedServiceFactory::SetTestingFactoryAndUse(
+    content::BrowserContext* context,
+    TestingFactoryFunction testing_factory) {
+  DCHECK(testing_factory);
+  return SetTestingFactoryAndUse(context, base::BindRepeating(testing_factory));
+}
+
+void RefcountedBrowserContextKeyedServiceFactory::SetTestingFactory(
+    content::BrowserContext* context,
+    TestingFactory testing_factory) {
   RefcountedKeyedServiceFactory::TestingFactory wrapped_factory;
   if (testing_factory) {
     wrapped_factory = base::BindRepeating(
-        [](TestingFactoryFunction testing_factory,
+        [](const TestingFactory& testing_factory,
            base::SupportsUserData* context) {
-          return testing_factory(
+          return testing_factory.Run(
               static_cast<content::BrowserContext*>(context));
         },
-        testing_factory);
+        std::move(testing_factory));
   }
   RefcountedKeyedServiceFactory::SetTestingFactory(context,
                                                    std::move(wrapped_factory));
@@ -30,19 +48,16 @@
 scoped_refptr<RefcountedKeyedService>
 RefcountedBrowserContextKeyedServiceFactory::SetTestingFactoryAndUse(
     content::BrowserContext* context,
-    TestingFactoryFunction testing_factory) {
-  RefcountedKeyedServiceFactory::TestingFactory wrapped_factory;
-  if (testing_factory) {
-    wrapped_factory = base::BindRepeating(
-        [](TestingFactoryFunction testing_factory,
-           base::SupportsUserData* context) {
-          return testing_factory(
-              static_cast<content::BrowserContext*>(context));
-        },
-        testing_factory);
-  }
+    TestingFactory testing_factory) {
+  DCHECK(testing_factory);
   return RefcountedKeyedServiceFactory::SetTestingFactoryAndUse(
-      context, std::move(wrapped_factory));
+      context, base::BindRepeating(
+                   [](const TestingFactory& testing_factory,
+                      base::SupportsUserData* context) {
+                     return testing_factory.Run(
+                         static_cast<content::BrowserContext*>(context));
+                   },
+                   std::move(testing_factory)));
 }
 
 RefcountedBrowserContextKeyedServiceFactory::
diff --git a/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.h b/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.h
index 50c7043..245ec95 100644
--- a/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.h
+++ b/components/keyed_service/content/refcounted_browser_context_keyed_service_factory.h
@@ -33,6 +33,7 @@
   // A function that supplies the instance of a KeyedService for a given
   // BrowserContext. This is used primarily for testing, where we want to feed
   // a specific mock into the BCKSF system.
+  // DEPRECATED: use TestingFactory instead, see http://crbug.com/809610
   using TestingFactoryFunction = scoped_refptr<RefcountedKeyedService> (*)(
       content::BrowserContext* context);
 
@@ -40,16 +41,39 @@
   // the KeyedService when requested.  |factory| can be NULL to signal that
   // KeyedService should be NULL. Multiple calls to SetTestingFactory() are
   // allowed; previous services will be shut down.
+  // DEPRECATED: use TestingFactory version instead, see http://crbug.com/809610
   void SetTestingFactory(content::BrowserContext* context,
                          TestingFactoryFunction factory);
 
   // Associates |factory| with |context| and immediately returns the created
   // KeyedService. Since the factory will be used immediately, it may not be
   // NULL.
+  // DEPRECATED: use TestingFactory version instead, see http://crbug.com/809610
   scoped_refptr<RefcountedKeyedService> SetTestingFactoryAndUse(
       content::BrowserContext* context,
       TestingFactoryFunction factory);
 
+  // A callback that supplies the instance of a KeyedService for a given
+  // BrowserContext. This is used primarily for testing, where we want to feed
+  // a specific test double into the BCKSF system.
+  using TestingFactory =
+      base::RepeatingCallback<scoped_refptr<RefcountedKeyedService>(
+          content::BrowserContext* context)>;
+
+  // Associates |testing_factory| with |context| so that |testing_factory| is
+  // used to create the KeyedService when requested.  |testing_factory| can be
+  // empty to signal that KeyedService should be null. Multiple calls to
+  // SetTestingFactory() are allowed; previous services will be shut down.
+  void SetTestingFactory(content::BrowserContext* context,
+                         TestingFactory testing_factory);
+
+  // Associates |testing_factory| with |context| and immediately returns the
+  // created KeyedService. Since the factory will be used immediately, it may
+  // not be empty.
+  scoped_refptr<RefcountedKeyedService> SetTestingFactoryAndUse(
+      content::BrowserContext* context,
+      TestingFactory testing_factory);
+
  protected:
   // RefcountedBrowserContextKeyedServiceFactories must communicate with a
   // BrowserContextDependencyManager. For all non-test code, write your subclass
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstaller.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstaller.java
index c0a2542..30672cd 100644
--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstaller.java
+++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/ModuleInstaller.java
@@ -13,6 +13,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
+import org.chromium.base.StrictModeContext;
 import org.chromium.base.ThreadUtils;
 
 import java.util.Arrays;
@@ -41,7 +42,10 @@
 
     /** Needs to be called before trying to access a module. */
     public static void init() {
-        SplitCompat.install(ContextUtils.getApplicationContext());
+        // SplitCompat.install may copy modules into Chrome's internal folder or clean them up.
+        try (StrictModeContext unused = StrictModeContext.allowDiskWrites()) {
+            SplitCompat.install(ContextUtils.getApplicationContext());
+        }
     }
 
     /**
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index 1787108..6bf7ba45 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -482,6 +482,12 @@
                   StartUploadRequest(_, _, _, _, _))
           .Times(0);
     }
+    if (times_used == 0) {
+      // First login vote.
+      EXPECT_CALL(
+          *client()->mock_driver()->mock_autofill_download_manager(),
+          StartUploadRequest(SignatureIsSameAs(form_to_save), _, _, _, _));
+    }
     form_manager.ProvisionallySave(form_to_save);
     form_manager.Save();
     Mock::VerifyAndClearExpectations(
@@ -2008,7 +2014,7 @@
   AccountCreationUploadTest(saved_match()->form_data, 2,
                             PasswordForm::POSITIVE_SIGNAL_SENT, &field_type);
 
-  // For any other GenerationUplaodStatus, no autofill upload should occur
+  // For any other GenerationUploadStatus, no autofill upload should occur
   // if the observed form data matches the saved form data.
   AccountCreationUploadTest(saved_match()->form_data, 3,
                             PasswordForm::NO_SIGNAL_SENT, nullptr);
@@ -3545,14 +3551,14 @@
         EXPECT_CALL(*mock_autofill_manager,
                     MaybeStartVoteUploadProcessPtr(_, _, true))
             .WillOnce(WithArg<0>(SaveToUniquePtr(&signin_vote_form_structure)));
-      } else {
-        autofill::ServerFieldTypeSet field_types;
-        field_types.insert(autofill::PASSWORD);
-        EXPECT_CALL(
-            *client()->mock_driver()->mock_autofill_download_manager(),
-            StartUploadRequest(_, false, field_types, std::string(), true));
       }
 
+      autofill::ServerFieldTypeSet field_types;
+      field_types.insert(autofill::PASSWORD);
+      EXPECT_CALL(
+          *client()->mock_driver()->mock_autofill_download_manager(),
+          StartUploadRequest(_, false, field_types, std::string(), true));
+
       EXPECT_CALL(
           *client()->mock_driver()->mock_autofill_download_manager(),
           StartUploadRequest(AllOf(SignatureIsSameAs(expected_username_vote),
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc
index ade7f58..111bb4e4 100644
--- a/components/password_manager/core/browser/votes_uploader.cc
+++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -236,6 +236,11 @@
   if (!has_autofill_vote && !has_password_generation_vote)
     return false;
 
+  if (form_to_upload.form_data.fields.empty()) {
+    // List of fields may be empty in tests.
+    return false;
+  }
+
   AutofillManager* autofill_manager = client_->GetAutofillManagerForMainFrame();
   if (!autofill_manager || !autofill_manager->download_manager())
     return false;
@@ -245,10 +250,6 @@
   // credentials, the observed and pending forms are the same.
   FormStructure form_structure(form_to_upload.form_data);
   form_structure.set_submission_event(submitted_form.submission_event);
-  if (!autofill_manager->ShouldUploadForm(form_structure)) {
-    UMA_HISTOGRAM_BOOLEAN("PasswordGeneration.UploadStarted", false);
-    return false;
-  }
 
   ServerFieldTypeSet available_field_types;
   // A map from field names to field types.
@@ -335,10 +336,13 @@
   if (!autofill_manager || !autofill_manager->download_manager())
     return;
 
+  if (form_to_upload.form_data.fields.empty()) {
+    // List of fields may be empty in tests.
+    return;
+  }
+
   FormStructure form_structure(form_to_upload.form_data);
   form_structure.set_submission_event(form_to_upload.submission_event);
-  if (!autofill_manager->ShouldUploadForm(form_structure))
-    return;
 
   FieldTypeMap field_types = {
       {form_to_upload.username_element, autofill::USERNAME}};
@@ -377,7 +381,6 @@
   std::unique_ptr<FormStructure> form_structure(new FormStructure(form_data));
   form_structure->set_submission_event(submission_event);
   form_structure->set_is_signin_upload(true);
-  DCHECK(form_structure->ShouldBeUploaded());
   DCHECK_EQ(2u, form_structure->field_count());
   form_structure->field(1)->set_possible_types({autofill::PASSWORD});
   autofill_manager->MaybeStartVoteUploadProcess(std::move(form_structure),
diff --git a/components/password_manager/core/browser/votes_uploader.h b/components/password_manager/core/browser/votes_uploader.h
index c6aeb63..286d68e 100644
--- a/components/password_manager/core/browser/votes_uploader.h
+++ b/components/password_manager/core/browser/votes_uploader.h
@@ -136,7 +136,7 @@
   };
 
   // Send a vote for sign-in forms with autofill types for a username field.
-  // TODO(https://crbug.com/831123): Remove this method.
+  // TODO(https://crbug.com/889472): Remove this method.
   void SendSignInVote(
       const autofill::FormData& form_data,
       const autofill::PasswordForm::SubmissionIndicatorEvent& submission_event);
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 737a613..362898c 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -6950,9 +6950,9 @@
       'id': 463,
       'caption': '''Allow managed session on device''',
       'tags': [],
-      'desc': '''If this policy is set to false or left unset, managed guest session will behave as documented in https://support.google.com/chrome/a/answer/3017014 - the standard "Public Session".
+      'desc': '''If this policy is set to false, managed guest session will behave as documented in https://support.google.com/chrome/a/answer/3017014 - the standard "Public Session".
 
-      If this policy is set to true, managed guest session will take on "Managed Session" behaviour which lifts many of the restrictions that are in place for regular "Public Sessions".
+      If this policy is set to true or left unset, managed guest session will take on "Managed Session" behaviour which lifts many of the restrictions that are in place for regular "Public Sessions".
 
       If this policy is set, the user cannot change or override it.''',
     },
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp
index 4506f81..7f24fef 100644
--- a/components/policy_strings.grdp
+++ b/components/policy_strings.grdp
@@ -331,12 +331,27 @@
   <message name="IDS_POLICY_STATUS_USER" desc="Title for the user policy status box.">
     User policies
   </message>
+<message name="IDS_POLICY_STATUS_MACHINE" desc="Title for the machine policy status box.">
+    Machine policies
+  </message>
   <message name="IDS_POLICY_LABEL_ENTERPRISE_ENROLLMENT_DOMAIN" desc="Label for the enrollment domain in the device policy status box.">
     Enrollment domain:
   </message>
   <message name="IDS_POLICY_LABEL_ENTERPRISE_DISPLAY_DOMAIN" desc="Label for the display domain in the device policy status box.">
     Display domain:
   </message>
+  <message name="IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DOMAIN" desc="Label for the enrollment domain in the machine policy status box.">
+    Enrollment domain:
+  </message>
+  <message name="IDS_POLICY_LABEL_MACHINE_ENROLLMENT_TOKEN" desc="Label for the enrollment token in the machine policy status box.">
+    Enrollment Token:
+  </message>
+  <message name="IDS_POLICY_LABEL_MACHINE_ENROLLMENT_DEVICE_ID" desc="Label for the device ID in the machine policy status box.">
+    Device ID:
+  </message>
+    <message name="IDS_POLICY_LABEL_MACHINE_ENROLLMENT_MACHINE_NAME" desc="Label for the machine name in the machine policy status box.">
+    Machine Name:
+  </message>
   <message name="IDS_POLICY_LABEL_USERNAME" desc="Label for the username in the user policy status box.">
     User:
   </message>
diff --git a/components/sync/base/nigori.cc b/components/sync/base/nigori.cc
index c9cd6ec..79323a9 100644
--- a/components/sync/base/nigori.cc
+++ b/components/sync/base/nigori.cc
@@ -100,8 +100,12 @@
          scrypt_salt_ == other.scrypt_salt_;
 }
 
+bool KeyDerivationParams::operator!=(const KeyDerivationParams& other) const {
+  return !(*this == other);
+}
+
 const std::string& KeyDerivationParams::scrypt_salt() const {
-  DCHECK(method_ == KeyDerivationMethod::SCRYPT_8192_8_11);
+  DCHECK_EQ(method_, KeyDerivationMethod::SCRYPT_8192_8_11);
   return scrypt_salt_;
 }
 
diff --git a/components/sync/base/nigori.h b/components/sync/base/nigori.h
index fad5faa..bba98bd 100644
--- a/components/sync/base/nigori.h
+++ b/components/sync/base/nigori.h
@@ -20,7 +20,7 @@
 
 class Nigori;
 
-struct KeyDerivationParams {
+class KeyDerivationParams {
  public:
   static KeyDerivationParams CreateForPbkdf2();
   static KeyDerivationParams CreateForScrypt(const std::string& salt);
@@ -33,6 +33,7 @@
   KeyDerivationParams(KeyDerivationParams&& other);
   KeyDerivationParams& operator=(const KeyDerivationParams& other);
   bool operator==(const KeyDerivationParams& other) const;
+  bool operator!=(const KeyDerivationParams& other) const;
 
  private:
   KeyDerivationParams(KeyDerivationMethod method,
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl.cc b/components/sync/engine_impl/sync_encryption_handler_impl.cc
index 034214f4..52664ce 100644
--- a/components/sync/engine_impl/sync_encryption_handler_impl.cc
+++ b/components/sync/engine_impl/sync_encryption_handler_impl.cc
@@ -224,7 +224,6 @@
 std::string GetScryptSaltFromNigori(const sync_pb::NigoriSpecifics& nigori) {
   DCHECK_EQ(nigori.custom_passphrase_key_derivation_method(),
             sync_pb::NigoriSpecifics::SCRYPT_8192_8_11);
-  DCHECK(nigori.has_custom_passphrase_key_derivation_salt());
   std::string decoded_salt;
   bool result = base::Base64Decode(
       nigori.custom_passphrase_key_derivation_salt(), &decoded_salt);
@@ -239,7 +238,6 @@
     case KeyDerivationMethod::PBKDF2_HMAC_SHA1_1003:
       return KeyDerivationParams::CreateForPbkdf2();
     case KeyDerivationMethod::SCRYPT_8192_8_11:
-      DCHECK(nigori.has_custom_passphrase_key_derivation_salt());
       return KeyDerivationParams::CreateForScrypt(
           GetScryptSaltFromNigori(nigori));
     case KeyDerivationMethod::UNSUPPORTED:
diff --git a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc
index 9afd392..467f2f1 100644
--- a/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc
+++ b/components/sync/engine_impl/sync_encryption_handler_impl_unittest.cc
@@ -2559,8 +2559,8 @@
 
   IgnoreAllObserverCalls();
   InitCustomPassMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::UNSPECIFIED,
-      kCustomPassphrase, /* key_derivation_salt = */ base::nullopt);
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::UNSPECIFIED,
+      kCustomPassphrase, /*key_derivation_salt=*/base::nullopt);
 
   sync_pb::NigoriSpecifics nigori = ReadNigoriSpecifics();
   ASSERT_TRUE(nigori.has_custom_passphrase_key_derivation_method());
@@ -2578,8 +2578,8 @@
   EXPECT_CALL(*observer(), OnPassphraseRequired(
                                _, KeyDerivationParams::CreateForPbkdf2(), _));
   InitCustomPassMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::UNSPECIFIED,
-      kCustomPassphrase, /* key_derivation_salt = */ base::nullopt);
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::UNSPECIFIED,
+      kCustomPassphrase, /*key_derivation_salt=*/base::nullopt);
 
   Mock::VerifyAndClearExpectations(observer());
 }
@@ -2657,7 +2657,7 @@
 }
 
 TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldSetPbkdf2InNigoriIfScryptForNewDisabled) {
+       SetEncryptionPassphraseShouldUsePbkdf2IfScryptForNewDisabled) {
   SetScryptFeaturesState(/*force_disabled=*/false,
                          /*use_for_new_passphrases=*/false);
   TearDown();
@@ -2672,22 +2672,6 @@
 
   VerifyMigratedNigori(PassphraseType::CUSTOM_PASSPHRASE, kCustomPassphrase,
                        {KeyDerivationParams::CreateForPbkdf2()});
-}
-
-TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldAddPbkdf2KeyIfScryptForNewDisabled) {
-  SetScryptFeaturesState(/*force_disabled=*/false,
-                         /*use_for_new_passphrases=*/false);
-  TearDown();
-  test_user_share_.SetUp();
-  SetUpEncryption();
-  SetupKeystoreKeys({kRawKeystoreKey});
-  InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey,
-                                      kKeystoreKey);
-
-  IgnoreAllObserverCalls();
-  encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true);
-
   EXPECT_EQ(GetSerializedNigoriKeyForCustomPassphrase(
                 KeyDerivationParams::CreateForPbkdf2(), kCustomPassphrase),
             GetCryptographer()->GetDefaultNigoriKeyData());
@@ -2718,7 +2702,7 @@
 // Regardless of the state of the "scrypt for new passphrases" feature, turning
 // on the "force-disable scrypt" should lead to using PBKDF2.
 TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldSetPbkdf2InNigoriIfScryptForceDisabled) {
+       SetEncryptionPassphraseShouldUsePbkdf2IfScryptForceDisabled) {
   SetScryptFeaturesState(/*force_disabled=*/true,
                          /*use_for_new_passphrases=*/true);
   TearDown();
@@ -2731,37 +2715,17 @@
   IgnoreAllObserverCalls();
   encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true);
 
+  // Nigori should contain PBKDF2 as the key derivation method.
   VerifyMigratedNigori(PassphraseType::CUSTOM_PASSPHRASE, kCustomPassphrase,
                        {KeyDerivationParams::CreateForPbkdf2()});
-}
-
-TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldAddPbkdf2KeyIfScryptForceDisabled) {
-  SetScryptFeaturesState(/*force_disabled=*/true,
-                         /*use_for_new_passphrases=*/true);
-  TearDown();
-  test_user_share_.SetUp();
-  SetUpEncryption();
-  SetupKeystoreKeys({kRawKeystoreKey});
-  InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey,
-                                      kKeystoreKey);
-
-  IgnoreAllObserverCalls();
-  encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true);
-
+  // The key added to the cryptographer should have been derived using PBKDF2.
   EXPECT_EQ(GetSerializedNigoriKeyForCustomPassphrase(
                 KeyDerivationParams::CreateForPbkdf2(), kCustomPassphrase),
             GetCryptographer()->GetDefaultNigoriKeyData());
 }
 
-// TODO(davidovic): Merge ...ShouldSet*InNigori and ...ShouldAdd*Key test pairs
-// into a single test that checks both. This is not trivial because (a) there
-// are a lot of such pairs in this file and (b) a good name for them needs to be
-// found, and that is tricky because of the 80-character line limit which limits
-// how descriptive the names can be (and the tests will then have two behaviors
-// that they are testing, which will be harder to explain in test names).
 TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldSetScryptInNigoriIfScryptForNewEnabled) {
+       SetEncryptionPassphraseShouldUseScryptIfScryptForNewEnabled) {
   SetScryptFeaturesState(/*force_disabled=*/false,
                          /*use_for_new_passphrases=*/true);
   TearDown();
@@ -2775,25 +2739,11 @@
   encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true);
 
   std::string salt = fake_random_salt_generator_.Run();
+  // Nigori should contain scrypt as the key derivation method.
   VerifyMigratedNigori(PassphraseType::CUSTOM_PASSPHRASE, kCustomPassphrase,
                        {KeyDerivationParams::CreateForScrypt(salt)});
-}
-
-TEST_F(SyncEncryptionHandlerImplTest,
-       SetEncryptionPassphraseShouldAddScryptKeyIfScryptForNewEnabled) {
-  SetScryptFeaturesState(/*force_disabled=*/false,
-                         /*use_for_new_passphrases=*/true);
-  TearDown();
-  test_user_share_.SetUp();
-  SetUpEncryption();
-  SetupKeystoreKeys({kRawKeystoreKey});
-  InitAndVerifyKeystoreMigratedNigori(/*migration_time=*/1, kRawKeystoreKey,
-                                      kKeystoreKey);
-
-  IgnoreAllObserverCalls();
-  encryption_handler()->SetEncryptionPassphrase(kCustomPassphrase, true);
-
-  std::string salt = fake_random_salt_generator_.Run();
+  // The key added to the cryptographer should have been derived using scrypt
+  // with the proper salt.
   EXPECT_EQ(GetSerializedNigoriKeyForCustomPassphrase(
                 KeyDerivationParams::CreateForScrypt(salt), kCustomPassphrase),
             GetCryptographer()->GetDefaultNigoriKeyData());
@@ -2823,8 +2773,8 @@
 TEST_F(SyncEncryptionHandlerImplTest,
        SetDecryptionPassphraseShouldUsePbkdf2WhenUnspecifiedInNigori) {
   InitAndVerifyCustomPassphraseMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::UNSPECIFIED,
-      kCustomPassphrase, /* key_derivation_salt = */ base::nullopt);
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::UNSPECIFIED,
+      kCustomPassphrase, /*key_derivation_salt=*/base::nullopt);
   GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag());
 
   IgnoreAllObserverCalls();
@@ -2839,8 +2789,8 @@
 TEST_F(SyncEncryptionHandlerImplTest,
        SetDecryptionPassphraseShouldUsePbkdf2FromNigori) {
   InitAndVerifyCustomPassphraseMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003,
-      kCustomPassphrase, /* key_derivation_salt = */ base::nullopt);
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003,
+      kCustomPassphrase, /*key_derivation_salt=*/base::nullopt);
   GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag());
 
   IgnoreAllObserverCalls();
@@ -2859,8 +2809,8 @@
     SyncEncryptionHandlerImplTest,
     SetDecryptionPassphraseShouldRejectPassphraseOnUnsupportedNigoriKeyMethod) {
   InitAndVerifyCustomPassphraseMigratedNigori(
-      /* migration_time = */ 1, kUnsupportedKeyDerivationMethod,
-      kCustomPassphrase, /* key_derivation_salt = */ base::nullopt);
+      /*migration_time=*/1, kUnsupportedKeyDerivationMethod, kCustomPassphrase,
+      /*key_derivation_salt=*/base::nullopt);
   GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag());
 
   IgnoreAllObserverCalls();
@@ -2880,7 +2830,7 @@
                          /*use_for_new_passphrases=*/false);
 
   InitAndVerifyCustomPassphraseMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
       kCustomPassphrase, {kScryptSalt});
   GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag());
 
@@ -2902,7 +2852,7 @@
                          /*use_for_new_passphrases=*/false);
 
   InitAndVerifyCustomPassphraseMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
       kCustomPassphrase, {kScryptSalt});
   GetCryptographer()->SetPendingKeys(ReadNigoriSpecifics().encryption_keybag());
 
@@ -2976,7 +2926,7 @@
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
       0, sync_pb::NigoriSpecifics::UNSPECIFIED, kCustomPassphrase,
-      /* key_derivation_salt = */ base::nullopt);
+      /*key_derivation_salt=*/base::nullopt);
   WriteNigori(new_nigori);
 
   IgnoreAllObserverCalls();
@@ -2999,7 +2949,7 @@
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
       0, sync_pb::NigoriSpecifics::PBKDF2_HMAC_SHA1_1003, kCustomPassphrase,
-      /* key_derivation_salt = */ base::nullopt);
+      /*key_derivation_salt=*/base::nullopt);
   WriteNigori(new_nigori);
 
   IgnoreAllObserverCalls();
@@ -3024,7 +2974,7 @@
   SetupKeystoreKeys({kRawKeystoreKey});
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
       kCustomPassphrase, {kScryptSalt});
   WriteNigori(new_nigori);
 
@@ -3051,7 +3001,7 @@
   SetupKeystoreKeys({kRawKeystoreKey});
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
-      /* migration_time = */ 1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
+      /*migration_time=*/1, sync_pb::NigoriSpecifics::SCRYPT_8192_8_11,
       kCustomPassphrase, {kScryptSalt});
   WriteNigori(new_nigori);
 
@@ -3075,7 +3025,7 @@
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
       0, kUnsupportedKeyDerivationMethod, kCustomPassphrase,
-      /* key_derivation_salt = */ base::nullopt);
+      /*key_derivation_salt=*/base::nullopt);
   WriteNigori(new_nigori);
 
   IgnoreAllObserverCalls();
@@ -3099,7 +3049,7 @@
   InitAndVerifyKeystoreMigratedNigori(1, kRawKeystoreKey, kKeystoreKey);
   sync_pb::NigoriSpecifics new_nigori = BuildCustomPassMigratedNigori(
       0, sync_pb::NigoriSpecifics::UNSPECIFIED, kCustomPassphrase,
-      /* key_derivation_salt = */ base::nullopt);
+      /*key_derivation_salt=*/base::nullopt);
   WriteNigori(new_nigori);
 
   IgnoreAllObserverCalls();
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc
index b96ef5c..35a6645 100644
--- a/components/sync_bookmarks/bookmark_specifics_conversions.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -58,16 +58,23 @@
       new base::RefCountedString());
   icon_bytes->data().assign(icon_bytes_str);
 
-  const GURL icon_url(specifics.icon_url());
+  GURL icon_url(specifics.icon_url());
 
-  if (icon_bytes->size() == 0) {
-    DCHECK(icon_url.is_empty());
+  if (icon_bytes->size() == 0 && icon_url.is_empty()) {
     // Empty icon URL and no bitmap data means no icon mapping.
     favicon_service->DeleteFaviconMappings({bookmark_node->url()},
                                            favicon_base::IconType::kFavicon);
     return;
   }
 
+  if (icon_url.is_empty()) {
+    // WebUI pages such as "chrome://bookmarks/" are missing a favicon URL but
+    // they have a favicon. In addition, ancient clients (prior to M25) may not
+    // be syncing the favicon URL. If the icon URL is not synced, use the page
+    // URL as a fake icon URL as it is guaranteed to be unique.
+    icon_url = GURL(bookmark_node->url());
+  }
+
   // The client may have cached the favicon at 2x. Use MergeFavicon() as not to
   // overwrite the cached 2x favicon bitmap. Sync favicons are always
   // gfx::kFaviconSize in width and height. Store the favicon into history
@@ -85,7 +92,9 @@
     bookmarks::BookmarkModel* model) {
   sync_pb::EntitySpecifics specifics;
   sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
-  bm_specifics->set_url(node->url().spec());
+  if (!node->is_folder()) {
+    bm_specifics->set_url(node->url().spec());
+  }
   bm_specifics->set_title(base::UTF16ToUTF8(node->GetTitle()));
   bm_specifics->set_creation_time_us(
       node->date_added().ToDeltaSinceWindowsEpoch().InMicroseconds());
@@ -105,9 +114,9 @@
   }
 
   if (favicon_bytes.get() && favicon_bytes->size() != 0) {
-    DCHECK(!node->icon_url()->is_empty());
     bm_specifics->set_favicon(favicon_bytes->front(), favicon_bytes->size());
-    bm_specifics->set_icon_url(node->icon_url()->spec());
+    bm_specifics->set_icon_url(node->icon_url() ? node->icon_url()->spec()
+                                                : std::string());
   } else {
     bm_specifics->clear_favicon();
     bm_specifics->clear_icon_url();
@@ -181,9 +190,9 @@
       DLOG(ERROR) << "Invalid bookmark: invalid url in the specifics.";
       return false;
     }
-    if (specifics.favicon().empty() != specifics.icon_url().empty()) {
-      DLOG(ERROR) << "Invalid bookmark: specifics can have neither or both of "
-                     "favicon and icon_url.";
+    if (specifics.favicon().empty() && !specifics.icon_url().empty()) {
+      DLOG(ERROR) << "Invalid bookmark: specifics cannot have an icon_url "
+                     "without having a favicon.";
       return false;
     }
     if (!specifics.icon_url().empty() &&
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
index a49509a..2b22f69 100644
--- a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
+++ b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
@@ -63,6 +63,21 @@
   }
 }
 
+TEST(BookmarkSpecificsConversionsTest,
+     ShouldCreateSpecificsWithoutUrlFromFolderNode) {
+  std::unique_ptr<bookmarks::BookmarkModel> model =
+      bookmarks::TestBookmarkClient::CreateModel();
+  const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node();
+  const bookmarks::BookmarkNode* node = model->AddFolder(
+      /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16("Title"));
+  ASSERT_THAT(node, NotNull());
+
+  sync_pb::EntitySpecifics specifics =
+      CreateSpecificsFromBookmarkNode(node, model.get());
+  const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark();
+  EXPECT_FALSE(bm_specifics.has_url());
+}
+
 TEST(BookmarkSpecificsConversionsTest, ShouldCreateBookmarkNodeFromSpecifics) {
   const GURL kUrl("http://www.url.com");
   const std::string kTitle = "Title";
@@ -111,6 +126,31 @@
   EXPECT_THAT(value2, Eq(kValue2));
 }
 
+TEST(BookmarkSpecificsConversionsTest,
+     ShouldCreateBookmarkNodeFromSpecificsWithFaviconAndWithoutIconUrl) {
+  const GURL kUrl("http://www.url.com");
+  const std::string kTitle = "Title";
+  const GURL kIconUrl("http://www.icon-url.com");
+
+  sync_pb::EntitySpecifics specifics;
+  sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
+  bm_specifics->set_url(kUrl.spec());
+  bm_specifics->set_favicon("PNG");
+  bm_specifics->set_title(kTitle);
+
+  std::unique_ptr<bookmarks::BookmarkModel> model =
+      bookmarks::TestBookmarkClient::CreateModel();
+  testing::NiceMock<favicon::MockFaviconService> favicon_service;
+  // The favicon service should be called with page url since the icon url is
+  // missing.
+  EXPECT_CALL(favicon_service, MergeFavicon(kUrl, kUrl, _, _, _));
+  const bookmarks::BookmarkNode* node = CreateBookmarkNodeFromSpecifics(
+      *bm_specifics,
+      /*parent=*/model->bookmark_bar_node(), /*index=*/0,
+      /*is_folder=*/false, model.get(), &favicon_service);
+  EXPECT_THAT(node, NotNull());
+}
+
 TEST(BookmarkSpecificsConversionsTest, ShouldUpdateBookmarkNodeFromSpecifics) {
   const GURL kUrl("http://www.url.com");
   const std::string kTitle = "Title";
@@ -169,6 +209,35 @@
   EXPECT_THAT(value2, Eq(kNewValue2));
 }
 
+TEST(BookmarkSpecificsConversionsTest,
+     ShouldUpdateBookmarkNodeFromSpecificsWithFaviconAndWithoutIconUrl) {
+  const GURL kUrl("http://www.url.com");
+  const std::string kTitle = "Title";
+
+  std::unique_ptr<bookmarks::BookmarkModel> model =
+      bookmarks::TestBookmarkClient::CreateModel();
+
+  const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node();
+  const bookmarks::BookmarkNode* node = model->AddURL(
+      /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle),
+      GURL(kUrl));
+  ASSERT_THAT(node, NotNull());
+
+  const GURL kNewUrl("http://www.new-url.com");
+
+  sync_pb::EntitySpecifics specifics;
+  sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
+  bm_specifics->set_url(kNewUrl.spec());
+  bm_specifics->set_favicon("PNG");
+
+  testing::NiceMock<favicon::MockFaviconService> favicon_service;
+  // The favicon service should be called with page url since the icon url is
+  // missing.
+  EXPECT_CALL(favicon_service, MergeFavicon(kNewUrl, kNewUrl, _, _, _));
+  UpdateBookmarkNodeFromSpecifics(*bm_specifics, node, model.get(),
+                                  &favicon_service);
+}
+
 TEST(BookmarkSpecificsConversionsTest, ShouldBeValidBookmarkSpecifics) {
   sync_pb::EntitySpecifics specifics;
   sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
@@ -181,6 +250,24 @@
   EXPECT_TRUE(IsValidBookmarkSpecifics(*bm_specifics, /*is_folder=*/false));
 }
 
+TEST(BookmarkSpecificsConversionsTest,
+     ShouldBeValidBookmarkSpecificsWithFaviconAndWithoutIconUrl) {
+  sync_pb::EntitySpecifics specifics;
+  sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
+  bm_specifics->set_url("http://www.valid-url.com");
+  bm_specifics->set_favicon("PNG");
+  EXPECT_TRUE(IsValidBookmarkSpecifics(*bm_specifics, /*is_folder=*/false));
+}
+
+TEST(BookmarkSpecificsConversionsTest,
+     ShouldBeInvalidBookmarkSpecificsWithoutFaviconAndWithIconUrl) {
+  sync_pb::EntitySpecifics specifics;
+  sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
+  bm_specifics->set_url("http://www.valid-url.com");
+  bm_specifics->set_icon_url("http://www.valid-icon-url.com");
+  EXPECT_FALSE(IsValidBookmarkSpecifics(*bm_specifics, /*is_folder=*/false));
+}
+
 TEST(BookmarkSpecificsConversionsTest, ShouldBeInvalidBookmarkSpecifics) {
   sync_pb::EntitySpecifics specifics;
   sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
diff --git a/components/translate/content/browser/content_translate_driver.cc b/components/translate/content/browser/content_translate_driver.cc
index cec9442..42ea23d 100644
--- a/components/translate/content/browser/content_translate_driver.cc
+++ b/components/translate/content/browser/content_translate_driver.cc
@@ -238,7 +238,7 @@
   translate_manager_->set_current_seq_no(next_page_seq_no_);
 
   translate_manager_->GetLanguageState().LanguageDetermined(
-      details.adopted_language, page_needs_translation);
+      details, page_needs_translation);
 
   if (web_contents())
     translate_manager_->InitiateTranslation(details.adopted_language);
diff --git a/components/translate/content/common/translate.mojom b/components/translate/content/common/translate.mojom
index 7d09c8f..2f57fd4f 100644
--- a/components/translate/content/common/translate.mojom
+++ b/components/translate/content/common/translate.mojom
@@ -23,14 +23,18 @@
   TRANSLATE_ERROR_MAX,
 };
 
+// Mirrors LanguageDetectionDetails in
+// components/translate/core/common/language_detection_details.h
 struct LanguageDetectionDetails {
   mojo_base.mojom.Time time;
   url.mojom.Url url;
   string content_language;
+  string canonical_content_language;
   string cld_language;
   bool is_cld_reliable;
   bool has_notranslate;
   string html_root_language;
+  string canonical_html_root_language;
   string adopted_language;
   mojo_base.mojom.String16 contents;
 };
diff --git a/components/translate/content/common/translate_struct_traits.cc b/components/translate/content/common/translate_struct_traits.cc
index a5e8937..f45e659d 100644
--- a/components/translate/content/common/translate_struct_traits.cc
+++ b/components/translate/content/common/translate_struct_traits.cc
@@ -102,6 +102,8 @@
     return false;
   if (!data.ReadContentLanguage(&out->content_language))
     return false;
+  if (!data.ReadCanonicalContentLanguage(&out->canonical_content_language))
+    return false;
   if (!data.ReadCldLanguage(&out->cld_language))
     return false;
 
@@ -110,6 +112,8 @@
 
   if (!data.ReadHtmlRootLanguage(&out->html_root_language))
     return false;
+  if (!data.ReadCanonicalHtmlRootLanguage(&out->canonical_html_root_language))
+    return false;
   if (!data.ReadAdoptedLanguage(&out->adopted_language))
     return false;
   if (!data.ReadContents(&out->contents))
diff --git a/components/translate/content/common/translate_struct_traits.h b/components/translate/content/common/translate_struct_traits.h
index 9924abc8..7c2b337 100644
--- a/components/translate/content/common/translate_struct_traits.h
+++ b/components/translate/content/common/translate_struct_traits.h
@@ -39,6 +39,11 @@
     return r.content_language;
   }
 
+  static const std::string& canonical_content_language(
+      const translate::LanguageDetectionDetails& r) {
+    return r.canonical_content_language;
+  }
+
   static const std::string& cld_language(
       const translate::LanguageDetectionDetails& r) {
     return r.cld_language;
@@ -57,6 +62,11 @@
     return r.html_root_language;
   }
 
+  static const std::string& canonical_html_root_language(
+      const translate::LanguageDetectionDetails& r) {
+    return r.canonical_html_root_language;
+  }
+
   static const std::string& adopted_language(
       const translate::LanguageDetectionDetails& r) {
     return r.adopted_language;
diff --git a/components/translate/content/renderer/translate_helper.cc b/components/translate/content/renderer/translate_helper.cc
index ae95835a..53935e52 100644
--- a/components/translate/content/renderer/translate_helper.cc
+++ b/components/translate/content/renderer/translate_helper.cc
@@ -104,9 +104,12 @@
   std::string content_language = web_detection_details.content_language.Utf8();
   std::string html_lang = web_detection_details.html_language.Utf8();
   std::string cld_language;
+  std::string canonical_content_language;
+  std::string canonical_html_root_language;
   bool is_cld_reliable;
   std::string language = DeterminePageLanguage(
-      content_language, html_lang, contents, &cld_language, &is_cld_reliable);
+      content_language, html_lang, contents, &cld_language, &is_cld_reliable,
+      &canonical_html_root_language, &canonical_content_language);
 
   if (language.empty())
     return;
@@ -117,10 +120,12 @@
   details.time = base::Time::Now();
   details.url = web_detection_details.url;
   details.content_language = content_language;
+  details.canonical_content_language = canonical_content_language;
   details.cld_language = cld_language;
   details.is_cld_reliable = is_cld_reliable;
   details.has_notranslate = web_detection_details.has_no_translate_meta;
   details.html_root_language = html_lang;
+  details.canonical_html_root_language = canonical_html_root_language;
   details.adopted_language = language;
 
   // TODO(hajimehoshi): If this affects performance, it should be set only if
diff --git a/components/translate/core/browser/language_state.cc b/components/translate/core/browser/language_state.cc
index 2763ae6..cdad0cf 100644
--- a/components/translate/core/browser/language_state.cc
+++ b/components/translate/core/browser/language_state.cc
@@ -52,8 +52,10 @@
   SetTranslateEnabled(false);
 }
 
-void LanguageState::LanguageDetermined(const std::string& page_language,
+void LanguageState::LanguageDetermined(const LanguageDetectionDetails& details,
                                        bool page_needs_translation) {
+  std::string page_language = details.adopted_language;
+
   if (is_same_document_navigation_ && !original_lang_.empty()) {
     // Same-document navigation, we don't expect our states to change.
     // Note that we'll set the languages if original_lang_ is empty.  This might
@@ -62,6 +64,7 @@
   }
   page_needs_translation_ = page_needs_translation;
   original_lang_ = page_language;
+  language_detection_details_ = details;
   current_lang_ = page_language;
   SetIsPageTranslated(false);
 }
diff --git a/components/translate/core/browser/language_state.h b/components/translate/core/browser/language_state.h
index 3cee8dc..301a33c 100644
--- a/components/translate/core/browser/language_state.h
+++ b/components/translate/core/browser/language_state.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "components/translate/core/common/language_detection_details.h"
 
 namespace translate {
 
@@ -35,7 +36,7 @@
   // Should be called when the language of the page has been determined.
   // |page_needs_translation| when false indicates that the browser should not
   // offer to translate the page.
-  void LanguageDetermined(const std::string& page_language,
+  void LanguageDetermined(const LanguageDetectionDetails& details,
                           bool page_needs_translation);
 
   // Returns the language the current page should be translated to, based on the
@@ -52,6 +53,10 @@
 
   const std::string& original_language() const { return original_lang_; }
 
+  const LanguageDetectionDetails& language_detection_details() const {
+    return language_detection_details_;
+  }
+
   void SetCurrentLanguage(const std::string& language);
   const std::string& current_language() const { return current_lang_; }
 
@@ -94,6 +99,9 @@
   std::string prev_original_lang_;
   std::string prev_current_lang_;
 
+  // The signals used and obtained during language detection.
+  LanguageDetectionDetails language_detection_details_;
+
   // Provides driver-level context to the shared code of the component. Must
   // outlive this object.
   TranslateDriver* translate_driver_;
diff --git a/components/translate/core/browser/language_state_unittest.cc b/components/translate/core/browser/language_state_unittest.cc
index bf08eaf..ed56b08 100644
--- a/components/translate/core/browser/language_state_unittest.cc
+++ b/components/translate/core/browser/language_state_unittest.cc
@@ -22,7 +22,9 @@
   EXPECT_FALSE(language_state.IsPageTranslated());
 
   // Navigate to a French page.
-  language_state.LanguageDetermined("fr", true);
+  LanguageDetectionDetails details_fr;
+  details_fr.adopted_language = "fr";
+  language_state.LanguageDetermined(details_fr, true);
   EXPECT_EQ("fr", language_state.original_language());
   EXPECT_EQ("fr", language_state.current_language());
   EXPECT_FALSE(language_state.IsPageTranslated());
@@ -34,7 +36,9 @@
   EXPECT_TRUE(language_state.IsPageTranslated());
 
   // Move on another page in Japanese.
-  language_state.LanguageDetermined("ja", true);
+  LanguageDetectionDetails details_ja;
+  details_ja.adopted_language = "ja";
+  language_state.LanguageDetermined(details_ja, true);
   EXPECT_EQ("ja", language_state.original_language());
   EXPECT_EQ("ja", language_state.current_language());
   EXPECT_FALSE(language_state.IsPageTranslated());
@@ -58,7 +62,9 @@
 
   // Navigate to a French page.
   driver->Reset();
-  language_state.LanguageDetermined("fr", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "fr";
+  language_state.LanguageDetermined(details, true);
   EXPECT_FALSE(language_state.translate_enabled());
   EXPECT_FALSE(driver->on_is_page_translated_changed_called());
   EXPECT_FALSE(driver->on_translate_enabled_changed_called());
diff --git a/components/translate/core/browser/translate_browser_metrics.h b/components/translate/core/browser/translate_browser_metrics.h
index 86f5d0d..caec8db5 100644
--- a/components/translate/core/browser/translate_browser_metrics.h
+++ b/components/translate/core/browser/translate_browser_metrics.h
@@ -50,6 +50,7 @@
   INITIATION_STATUS_SHOW_ICON,
   INITIATION_STATUS_SUPPRESS_INFOBAR,
   // Insert new items here.
+  INITIATION_STATUS_CLD_CONTENT_OR_HTML_LANGUAGE_MISMATCH,
   INITIATION_STATUS_MAX,
 };
 
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc
index 725d883..22cbfecd 100644
--- a/components/translate/core/browser/translate_manager.cc
+++ b/components/translate/core/browser/translate_manager.cc
@@ -205,6 +205,25 @@
           translate_prefs->GetForceTriggerOnEnglishPagesCount()) ||
       translate_ranker_->ShouldOfferTranslation(translate_event_.get());
 
+  // Do not offer translation if language matches CLD language but not content
+  // or html languages, that is when the CLD language may be wrong.
+  // (crbug.com/875035)
+  const LanguageDetectionDetails details =
+      language_state_.language_detection_details();
+  if (details.cld_language == page_lang) {
+    // content language and html root language can be missing, in which case
+    // we do not require the page language to match.
+    if ((!details.canonical_content_language.empty() &&
+         details.canonical_content_language != page_lang) ||
+        (!details.canonical_html_root_language.empty() &&
+         details.html_root_language != page_lang)) {
+      TranslateBrowserMetrics::ReportInitiationStatus(
+          TranslateBrowserMetrics::
+              INITIATION_STATUS_CLD_CONTENT_OR_HTML_LANGUAGE_MISMATCH);
+      return;
+    }
+  }
+
   // Nothing to do if either the language Chrome is in or the language of
   // the page is not supported by the translation server.
   if (target_lang.empty() ||
diff --git a/components/translate/core/browser/translate_manager_unittest.cc b/components/translate/core/browser/translate_manager_unittest.cc
index 804cd44..e8c9903 100644
--- a/components/translate/core/browser/translate_manager_unittest.cc
+++ b/components/translate/core/browser/translate_manager_unittest.cc
@@ -42,6 +42,7 @@
 namespace {
 
 const char kInitiationStatusName[] = "Translate.InitiationStatus.v2";
+const LanguageDetectionDetails empty_language_detection_details;
 
 // Overrides NetworkChangeNotifier, simulating connection type changes
 // for tests.
@@ -160,10 +161,14 @@
   }
 
   void SetHasLanguageChanged(bool has_language_changed) {
-    translate_manager_->GetLanguageState().LanguageDetermined("de", true);
+    LanguageDetectionDetails details_de;
+    details_de.adopted_language = "de";
+    translate_manager_->GetLanguageState().LanguageDetermined(details_de, true);
     translate_manager_->GetLanguageState().DidNavigate(false, true, false);
-    translate_manager_->GetLanguageState().LanguageDetermined(
-        has_language_changed ? "en" : "de", true);
+    LanguageDetectionDetails details_changed;
+    details_changed.adopted_language = has_language_changed ? "en" : "de";
+    translate_manager_->GetLanguageState().LanguageDetermined(details_changed,
+                                                              true);
     EXPECT_EQ(has_language_changed,
               translate_manager_->GetLanguageState().HasLanguageChanged());
   }
@@ -360,7 +365,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
   EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
                       &translate_prefs_, &mock_language_model_, {"en"}));
@@ -396,7 +403,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
 
   translate_manager_->InitiateTranslation("en");
@@ -432,7 +441,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
 
   translate_manager_->InitiateTranslation("en");
@@ -475,7 +486,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
 
   translate_manager_->InitiateTranslation("en");
@@ -526,7 +539,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
   EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
                       &translate_prefs_, &mock_language_model_, {"en"}));
@@ -564,7 +579,126 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
+  network_notifier_.SimulateOnline();
+  EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
+                      &translate_prefs_, &mock_language_model_, {"en"}));
+  translate_manager_->InitiateTranslation("en");
+  EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName),
+              ElementsAre(Bucket(INITIATION_STATUS_SHOW_INFOBAR, 1),
+                          Bucket(INITIATION_STATUS_SHOW_ICON, 1)));
+}
+
+TEST_F(TranslateManagerTest, ShouldSuppressPrompt_CLDContentLanguagesDiffer) {
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      language::kOverrideTranslateTriggerInIndia,
+      {{"override_model", "heuristic"}, {"enforce_ranker", "false"}});
+  TranslateManager::SetIgnoreMissingKeyForTesting(true);
+  mock_language_model_.details = {
+      MockLanguageModel::LanguageDetails("en", 1.0),
+      MockLanguageModel::LanguageDetails("hi", 0.5),
+  };
+  ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
+      .WillByDefault(Return(true));
+  TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs);
+  ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
+      .WillByDefault(Return(&accept_langugages));
+  ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
+      .WillByDefault(Return(true));
+
+  mock_translate_ranker_.set_should_offer_translation(true);
+
+  translate_manager_.reset(new translate::TranslateManager(
+      &mock_translate_client_, &mock_translate_ranker_, &mock_language_model_));
+
+  base::HistogramTester histogram_tester;
+  prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
+
+  LanguageDetectionDetails details = LanguageDetectionDetails();
+  details.adopted_language = "en";
+  details.cld_language = "en";
+  details.canonical_content_language = "hi";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
+  network_notifier_.SimulateOnline();
+  EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
+                      &translate_prefs_, &mock_language_model_, {"en"}));
+  translate_manager_->InitiateTranslation("en");
+  EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName),
+              ElementsAre(Bucket(
+                  INITIATION_STATUS_CLD_CONTENT_OR_HTML_LANGUAGE_MISMATCH, 1)));
+}
+
+TEST_F(TranslateManagerTest, ShouldSuppressPrompt_CLDHTMLLanguagesDiffer) {
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      language::kOverrideTranslateTriggerInIndia,
+      {{"override_model", "heuristic"}, {"enforce_ranker", "false"}});
+  TranslateManager::SetIgnoreMissingKeyForTesting(true);
+  mock_language_model_.details = {
+      MockLanguageModel::LanguageDetails("en", 1.0),
+      MockLanguageModel::LanguageDetails("hi", 0.5),
+  };
+  ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
+      .WillByDefault(Return(true));
+  TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs);
+  ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
+      .WillByDefault(Return(&accept_langugages));
+  ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
+      .WillByDefault(Return(true));
+
+  mock_translate_ranker_.set_should_offer_translation(true);
+
+  translate_manager_.reset(new translate::TranslateManager(
+      &mock_translate_client_, &mock_translate_ranker_, &mock_language_model_));
+
+  base::HistogramTester histogram_tester;
+  prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
+
+  LanguageDetectionDetails details = LanguageDetectionDetails();
+  details.adopted_language = "en";
+  details.cld_language = "en";
+  details.canonical_html_root_language = "hi";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
+  network_notifier_.SimulateOnline();
+  EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
+                      &translate_prefs_, &mock_language_model_, {"en"}));
+  translate_manager_->InitiateTranslation("en");
+  EXPECT_THAT(histogram_tester.GetAllSamples(kInitiationStatusName),
+              ElementsAre(Bucket(
+                  INITIATION_STATUS_CLD_CONTENT_OR_HTML_LANGUAGE_MISMATCH, 1)));
+}
+
+TEST_F(TranslateManagerTest, ShouldShowPrompt_LanguageNotCLD) {
+  scoped_feature_list_.InitAndEnableFeatureWithParameters(
+      language::kOverrideTranslateTriggerInIndia,
+      {{"override_model", "heuristic"}, {"enforce_ranker", "false"}});
+  TranslateManager::SetIgnoreMissingKeyForTesting(true);
+  mock_language_model_.details = {
+      MockLanguageModel::LanguageDetails("en", 1.0),
+      MockLanguageModel::LanguageDetails("hi", 0.5),
+  };
+  ON_CALL(mock_translate_client_, IsTranslatableURL(GURL::EmptyGURL()))
+      .WillByDefault(Return(true));
+  TranslateAcceptLanguages accept_langugages(&prefs_, accept_languages_prefs);
+  ON_CALL(mock_translate_client_, GetTranslateAcceptLanguages())
+      .WillByDefault(Return(&accept_langugages));
+  ON_CALL(mock_translate_client_, ShowTranslateUI(_, _, _, _, _))
+      .WillByDefault(Return(true));
+
+  mock_translate_ranker_.set_should_offer_translation(true);
+
+  translate_manager_.reset(new translate::TranslateManager(
+      &mock_translate_client_, &mock_translate_ranker_, &mock_language_model_));
+
+  base::HistogramTester histogram_tester;
+  prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
+
+  LanguageDetectionDetails details = LanguageDetectionDetails();
+  details.adopted_language = "en";
+  details.cld_language = "hi";
+  details.canonical_html_root_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
   EXPECT_EQ("hi", TranslateManager::GetTargetLanguage(
                       &translate_prefs_, &mock_language_model_, {"en"}));
@@ -598,7 +732,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
 
   translate_manager_->InitiateTranslation("en");
@@ -642,7 +778,9 @@
 
   base::HistogramTester histogram_tester;
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, true);
-  translate_manager_->GetLanguageState().LanguageDetermined("en", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "en";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
   network_notifier_.SimulateOnline();
 
   translate_manager_->InitiateTranslation("fr");
@@ -671,7 +809,9 @@
 
   prefs_.SetBoolean(prefs::kOfferTranslateEnabled, false);
 
-  translate_manager_->GetLanguageState().LanguageDetermined("de", true);
+  LanguageDetectionDetails details;
+  details.adopted_language = "de";
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
 
   // In the offline case, Initiate will early-out before even hitting the API
   // key test.
diff --git a/components/translate/core/common/language_detection_details.h b/components/translate/core/common/language_detection_details.h
index d740570..041ee0323 100644
--- a/components/translate/core/common/language_detection_details.h
+++ b/components/translate/core/common/language_detection_details.h
@@ -27,6 +27,10 @@
   // The language detected by the content (Content-Language).
   std::string content_language;
 
+  // A canonical representation of content language (obtained from
+  // |content_language| during language detection).
+  std::string canonical_content_language;
+
   // The language detected by CLD.
   std::string cld_language;
 
@@ -41,6 +45,10 @@
   // The language written in the lang attribute of the html element.
   std::string html_root_language;
 
+  // A canonical representation of html root language (obtained from
+  // |html_root_language| during language detection).
+  std::string canonical_html_root_language;
+
   // The adopted language.
   std::string adopted_language;
 
diff --git a/components/translate/core/language_detection/language_detection_util.cc b/components/translate/core/language_detection/language_detection_util.cc
index e4e59ed..79b6cf3 100644
--- a/components/translate/core/language_detection/language_detection_util.cc
+++ b/components/translate/core/language_detection/language_detection_util.cc
@@ -150,7 +150,9 @@
                                   const std::string& html_lang,
                                   const base::string16& contents,
                                   std::string* cld_language_p,
-                                  bool* is_cld_reliable_p) {
+                                  bool* is_cld_reliable_p,
+                                  std::string* canonical_html_root_lang_p,
+                                  std::string* canonical_content_lang_p) {
   bool is_cld_reliable;
   // Check if html lang attribute is valid.
   std::string modified_html_lang;
@@ -177,6 +179,11 @@
     *is_cld_reliable_p = is_cld_reliable;
   translate::ToTranslateLanguageSynonym(&cld_language);
 
+  if (canonical_html_root_lang_p != nullptr)
+    *canonical_html_root_lang_p = modified_html_lang;
+  if (canonical_content_lang_p != nullptr)
+    *canonical_content_lang_p = modified_code;
+
   // Adopt |modified_html_lang| if it is valid. Otherwise, adopt
   // |modified_code|.
   std::string language = modified_html_lang.empty() ? modified_code :
diff --git a/components/translate/core/language_detection/language_detection_util.h b/components/translate/core/language_detection/language_detection_util.h
index 8e4fb68..380b32a 100644
--- a/components/translate/core/language_detection/language_detection_util.h
+++ b/components/translate/core/language_detection/language_detection_util.h
@@ -16,7 +16,9 @@
                                   const std::string& html_lang,
                                   const base::string16& contents,
                                   std::string* cld_language,
-                                  bool* is_cld_reliable);
+                                  bool* is_cld_reliable,
+                                  std::string* canonical_html_root_lang,
+                                  std::string* canonical_content_lang);
 
 // Corrects language code if it contains well-known mistakes.
 // Called only by tests.
diff --git a/components/translate/core/language_detection/language_detection_util_unittest.cc b/components/translate/core/language_detection/language_detection_util_unittest.cc
index b14331e571..08516f1 100644
--- a/components/translate/core/language_detection/language_detection_util_unittest.cc
+++ b/components/translate/core/language_detection/language_detection_util_unittest.cc
@@ -101,13 +101,15 @@
       "is suspicious.</body></html>");
   std::string cld_language;
   bool is_cld_reliable;
-  std::string language = translate::DeterminePageLanguage(std::string("ja"),
-                                                          std::string(),
-                                                          contents,
-                                                          &cld_language,
-                                                          &is_cld_reliable);
+  std::string canonical_content_language;
+  std::string canonical_html_root_language;
+  std::string language = translate::DeterminePageLanguage(
+      std::string("ja"), std::string(), contents, &cld_language,
+      &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   EXPECT_EQ(translate::kUnknownLanguageCode, language);
   EXPECT_EQ("en", cld_language);
+  EXPECT_EQ("ja", canonical_content_language);
   EXPECT_TRUE(is_cld_reliable);
 }
 
@@ -121,13 +123,15 @@
       "is suspicious.</body></html>");
   std::string cld_language;
   bool is_cld_reliable;
-  std::string language = translate::DeterminePageLanguage(std::string("en-US"),
-                                                          std::string(),
-                                                          contents,
-                                                          &cld_language,
-                                                          &is_cld_reliable);
+  std::string canonical_content_language;
+  std::string canonical_html_root_language;
+  std::string language = translate::DeterminePageLanguage(
+      std::string("en-US"), std::string(), contents, &cld_language,
+      &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   EXPECT_EQ("en", language);
   EXPECT_EQ("en", cld_language);
+  EXPECT_EQ("en", canonical_content_language);
   EXPECT_TRUE(is_cld_reliable);
 }
 
@@ -142,11 +146,12 @@
       " language will be adopted if the value is invalid.</body></html>");
   std::string cld_language;
   bool is_cld_reliable;
-  std::string language = translate::DeterminePageLanguage(std::string("utf-8"),
-                                                          std::string(),
-                                                          contents,
-                                                          &cld_language,
-                                                          &is_cld_reliable);
+  std::string canonical_content_language;
+  std::string canonical_html_root_language;
+  std::string language = translate::DeterminePageLanguage(
+      std::string("utf-8"), std::string(), contents, &cld_language,
+      &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   EXPECT_EQ("en", language);
   EXPECT_EQ("en", cld_language);
   EXPECT_TRUE(is_cld_reliable);
@@ -162,13 +167,16 @@
       "is suspicious.</body></html>");
   std::string cld_language;
   bool is_cld_reliable;
-  std::string language = translate::DeterminePageLanguage(std::string("ja"),
-                                                          std::string("en"),
-                                                          contents,
-                                                          &cld_language,
-                                                          &is_cld_reliable);
+  std::string canonical_content_language;
+  std::string canonical_html_root_language;
+  std::string language = translate::DeterminePageLanguage(
+      std::string("ja"), std::string("en"), contents, &cld_language,
+      &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   EXPECT_EQ("en", language);
   EXPECT_EQ("en", cld_language);
+  EXPECT_EQ("ja", canonical_content_language);
+  EXPECT_EQ("en", canonical_html_root_language);
   EXPECT_TRUE(is_cld_reliable);
 }
 
diff --git a/components/translate/ios/browser/ios_translate_driver.mm b/components/translate/ios/browser/ios_translate_driver.mm
index 3549637..c0cc8171 100644
--- a/components/translate/ios/browser/ios_translate_driver.mm
+++ b/components/translate/ios/browser/ios_translate_driver.mm
@@ -93,8 +93,7 @@
     const translate::LanguageDetectionDetails& details) {
   if (!translate_manager_)
     return;
-  translate_manager_->GetLanguageState().LanguageDetermined(
-      details.adopted_language, true);
+  translate_manager_->GetLanguageState().LanguageDetermined(details, true);
 
   translate_manager_->translate_client()->RecordLanguageDetectionEvent(details);
 
diff --git a/components/translate/ios/browser/language_detection_controller.mm b/components/translate/ios/browser/language_detection_controller.mm
index e74df44..27bbd00 100644
--- a/components/translate/ios/browser/language_detection_controller.mm
+++ b/components/translate/ios/browser/language_detection_controller.mm
@@ -125,11 +125,14 @@
     const base::string16& text_content) {
   std::string cld_language;
   bool is_cld_reliable;
+  std::string canonical_html_root_language;
+  std::string canonical_content_language;
   std::string language = translate::DeterminePageLanguage(
       http_content_language, html_lang,
       GetStringByClippingLastWord(text_content,
                                   language_detection::kMaxIndexChars),
-      &cld_language, &is_cld_reliable);
+      &cld_language, &is_cld_reliable, &canonical_html_root_language,
+      &canonical_content_language);
   if (language.empty())
     return;  // No language detected.
 
diff --git a/components/viz/service/surfaces/surface.cc b/components/viz/service/surfaces/surface.cc
index 69b41d91..f279157 100644
--- a/components/viz/service/surfaces/surface.cc
+++ b/components/viz/service/surfaces/surface.cc
@@ -50,8 +50,8 @@
   for (const FrameSinkId& sink_id : observed_sinks_)
     surface_manager_->RemoveActivationObserver(sink_id, surface_info_.id());
 
-  if (deadline_)
-    deadline_->Cancel();
+  DCHECK(deadline_);
+  deadline_->Cancel();
 
   TRACE_EVENT_ASYNC_END1(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime"),
                          "Surface", this, "surface_info",
@@ -77,8 +77,8 @@
 void Surface::InheritActivationDeadlineFrom(Surface* surface) {
   TRACE_EVENT1("viz", "Surface::InheritActivationDeadlineFrom", "FrameSinkId",
                surface_id().frame_sink_id().ToString());
-  if (!deadline_ || !surface->deadline_)
-    return;
+  DCHECK(deadline_);
+  DCHECK(surface->deadline_);
 
   deadline_->InheritFrom(*surface->deadline_);
 }
@@ -216,14 +216,13 @@
       std::move(pending_frame_data_);
   pending_frame_data_.reset();
 
-  FrameDeadline deadline = UpdateActivationDependencies(frame);
+  UpdateActivationDependencies(frame);
 
   // Receive and track the resources referenced from the CompositorFrame
   // regardless of whether it's pending or active.
   surface_client_->ReceiveFromChild(frame.resource_list);
 
-  if (activation_dependencies_.empty() ||
-      (deadline_ && !deadline.deadline_in_frames())) {
+  if (activation_dependencies_.empty()) {
     // If there are no blockers, then immediately activate the frame.
     ActivateFrame(
         FrameData(std::move(frame), frame_index, std::move(presented_callback)),
@@ -233,8 +232,9 @@
         FrameData(std::move(frame), frame_index, std::move(presented_callback));
     RejectCompositorFramesToFallbackSurfaces();
 
-    // If the deadline is in the past, then we will activate immediately.
-    if (!deadline_ || deadline_->Set(deadline)) {
+    // If the deadline is in the past, then the CompositorFrame will activate
+    // immediately.
+    if (deadline_->Set(ResolveFrameDeadline(frame))) {
       // Ask the SurfaceDependencyTracker to inform |this| when its dependencies
       // are resolved.
       surface_manager_->dependency_tracker()->RequestSurfaceResolution(this);
@@ -339,8 +339,8 @@
   FrameData frame_data = std::move(*pending_frame_data_);
   pending_frame_data_.reset();
 
-  DCHECK(!duration || !deadline_ || !deadline_->has_deadline());
-  if (!duration && deadline_)
+  DCHECK(!duration || !deadline_->has_deadline());
+  if (!duration)
     duration = deadline_->Cancel();
 
   ActivateFrame(std::move(frame_data), duration);
@@ -456,22 +456,28 @@
     surface_client_->OnFrameTokenChanged(metadata.frame_token);
 }
 
-FrameDeadline Surface::UpdateActivationDependencies(
+FrameDeadline Surface::ResolveFrameDeadline(
     const CompositorFrame& current_frame) {
   const base::Optional<uint32_t>& default_deadline =
       surface_manager_->activation_deadline_in_frames();
-  FrameDeadline deadline = current_frame.metadata.deadline;
-
+  const FrameDeadline& deadline = current_frame.metadata.deadline;
   uint32_t deadline_in_frames = deadline.deadline_in_frames();
-  if (default_deadline && deadline.use_default_lower_bound_deadline())
-    deadline_in_frames = std::max(deadline_in_frames, *default_deadline);
 
-  deadline = FrameDeadline(deadline.frame_start_time(), deadline_in_frames,
-                           deadline.frame_interval(),
-                           false /* use_default_lower_bound_deadline */);
+  // If no default deadline is available then all deadlines are treated as
+  // effectively infinite deadlines.
+  if (!default_deadline || deadline.use_default_lower_bound_deadline()) {
+    deadline_in_frames = std::max(
+        deadline_in_frames,
+        default_deadline.value_or(std::numeric_limits<uint32_t>::max()));
+  }
 
-  bool track_dependencies = !default_deadline || deadline_in_frames > 0;
+  return FrameDeadline(deadline.frame_start_time(), deadline_in_frames,
+                       deadline.frame_interval(),
+                       false /* use_default_lower_bound_deadline */);
+}
 
+void Surface::UpdateActivationDependencies(
+    const CompositorFrame& current_frame) {
   base::flat_map<FrameSinkId, SequenceNumbers> new_frame_sink_id_dependencies;
   base::flat_set<SurfaceId> new_activation_dependencies;
 
@@ -482,9 +488,6 @@
     // the display compositor, then it blocks this frame.
     if (!dependency || !dependency->HasActiveFrame()) {
       new_activation_dependencies.insert(surface_id);
-      if (!track_dependencies)
-        continue;
-
       TRACE_EVENT_WITH_FLOW2(
           TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
           "LocalSurfaceId.Embed.Flow",
@@ -516,16 +519,8 @@
   // map.
   ComputeChangeInDependencies(new_frame_sink_id_dependencies);
 
-  if (track_dependencies) {
-    activation_dependencies_ = std::move(new_activation_dependencies);
-  } else {
-    // If the deadline is zero, then all dependencies are late.
-    activation_dependencies_.clear();
-    late_activation_dependencies_ = std::move(new_activation_dependencies);
-  }
-
+  activation_dependencies_ = std::move(new_activation_dependencies);
   frame_sink_id_dependencies_ = std::move(new_frame_sink_id_dependencies);
-  return deadline;
 }
 
 void Surface::ComputeChangeInDependencies(
diff --git a/components/viz/service/surfaces/surface.h b/components/viz/service/surfaces/surface.h
index ca22038..9f53af1 100644
--- a/components/viz/service/surfaces/surface.h
+++ b/components/viz/service/surfaces/surface.h
@@ -262,11 +262,15 @@
   void ActivateFrame(FrameData frame_data,
                      base::Optional<base::TimeDelta> duration);
 
+  // Resolve the activation deadline specified by |current_frame| into a wall
+  // time to be used by SurfaceDependencyDeadline.
+  FrameDeadline ResolveFrameDeadline(const CompositorFrame& current_frame);
+
   // Updates the set of unresolved activation dependenices of the
   // |current_frame|. If the deadline requested by the frame is 0 then no
   // dependencies will be added even if they're not yet available.
-  FrameDeadline UpdateActivationDependencies(
-      const CompositorFrame& current_frame);
+  void UpdateActivationDependencies(const CompositorFrame& current_frame);
+
   void ComputeChangeInDependencies(
       const base::flat_map<FrameSinkId, SequenceNumbers>& new_dependencies);
 
diff --git a/components/viz/service/surfaces/surface_dependency_deadline.cc b/components/viz/service/surfaces/surface_dependency_deadline.cc
index 4e86b83..bb5faca 100644
--- a/components/viz/service/surfaces/surface_dependency_deadline.cc
+++ b/components/viz/service/surfaces/surface_dependency_deadline.cc
@@ -29,7 +29,6 @@
 }
 
 bool SurfaceDependencyDeadline::Set(const FrameDeadline& frame_deadline) {
-  DCHECK_GT(frame_deadline.deadline_in_frames(), 0u);
   CancelInternal(false);
   start_time_ = frame_deadline.frame_start_time();
   deadline_ = start_time_ + frame_deadline.deadline_in_frames() *
diff --git a/components/viz/service/surfaces/surface_manager.cc b/components/viz/service/surfaces/surface_manager.cc
index f65f31b..89c5fd2d 100644
--- a/components/viz/service/surfaces/surface_manager.cc
+++ b/components/viz/service/surfaces/surface_manager.cc
@@ -117,12 +117,8 @@
   if (it == surface_map_.end()) {
     std::unique_ptr<Surface> surface = std::make_unique<Surface>(
         surface_info, this, surface_client, needs_sync_tokens);
-    // If no default deadline is specified then don't track deadlines.
-    if (activation_deadline_in_frames_) {
-      surface->SetDependencyDeadline(
-          std::make_unique<SurfaceDependencyDeadline>(
-              surface.get(), begin_frame_source, tick_clock_));
-    }
+    surface->SetDependencyDeadline(std::make_unique<SurfaceDependencyDeadline>(
+        surface.get(), begin_frame_source, tick_clock_));
     surface_map_[surface_info.id()] = std::move(surface);
     // We can get into a situation where multiple CompositorFrames arrive for a
     // FrameSink before the client can add any references for the frame. When
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index 7091aaa..c37c300 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -19,10 +19,6 @@
 
 namespace content {
 
-// See OnScreenReaderHoneyPotQueried, below.
-bool g_screen_reader_honeypot_queried = false;
-bool g_acc_name_called = false;
-
 // static
 BrowserAccessibilityManager* BrowserAccessibilityManager::Create(
     const ui::AXTreeUpdate& initial_tree,
@@ -44,7 +40,6 @@
       load_complete_pending_(false) {
   ui::win::CreateATLModuleIfNeeded();
   Initialize(initial_tree);
-  ui::GetIAccessible2UsageObserverList().AddObserver(this);
 }
 
 BrowserAccessibilityManagerWin::~BrowserAccessibilityManagerWin() {
@@ -52,7 +47,6 @@
   // destructor, otherwise our overrides of functions like
   // OnNodeWillBeDeleted won't be called.
   tree_.reset(NULL);
-  ui::GetIAccessible2UsageObserverList().RemoveObserver(this);
 }
 
 // static
@@ -76,38 +70,6 @@
   return delegate->AccessibilityGetAcceleratedWidget();
 }
 
-void BrowserAccessibilityManagerWin::OnIAccessible2Used() {
-  // When IAccessible2 APIs have been used elsewhere in the codebase,
-  // enable basic web accessibility support. (Full screen reader support is
-  // detected later when specific more advanced APIs are accessed.)
-  BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
-      ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
-}
-
-void BrowserAccessibilityManagerWin::OnScreenReaderHoneyPotQueried() {
-  // We used to trust this as a signal that a screen reader is running,
-  // but it's been abused. Now only enable accessibility if we also
-  // detect a call to get_accName.
-  if (g_screen_reader_honeypot_queried)
-    return;
-  g_screen_reader_honeypot_queried = true;
-  if (g_acc_name_called) {
-    BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
-        ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
-  }
-}
-
-void BrowserAccessibilityManagerWin::OnAccNameCalled() {
-  // See OnScreenReaderHoneyPotQueried, above.
-  if (g_acc_name_called)
-    return;
-  g_acc_name_called = true;
-  if (g_screen_reader_honeypot_queried) {
-    BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
-        ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
-  }
-}
-
 void BrowserAccessibilityManagerWin::UserIsReloading() {
   if (GetRoot())
     FireWinAccessibilityEvent(IA2_EVENT_DOCUMENT_RELOAD, GetRoot());
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h
index 76d3434..88fd18b4 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.h
+++ b/content/browser/accessibility/browser_accessibility_manager_win.h
@@ -18,8 +18,7 @@
 
 // Manages a tree of BrowserAccessibilityWin objects.
 class CONTENT_EXPORT BrowserAccessibilityManagerWin
-    : public BrowserAccessibilityManager,
-      public ui::IAccessible2UsageObserver {
+    : public BrowserAccessibilityManager {
  public:
   BrowserAccessibilityManagerWin(
       const ui::AXTreeUpdate& initial_tree,
@@ -33,11 +32,6 @@
   // Get the closest containing HWND.
   HWND GetParentHWND();
 
-  // IAccessible2UsageObserver
-  void OnIAccessible2Used() override;
-  void OnScreenReaderHoneyPotQueried() override;
-  void OnAccNameCalled() override;
-
   // BrowserAccessibilityManager methods
   void UserIsReloading() override;
   BrowserAccessibility* GetFocus() override;
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index cbd461a..2c185d0ad 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -68,6 +68,9 @@
   // Hook ourselves up to observe ax mode changes.
   ui::AXPlatformNode::AddAXModeObserver(this);
 
+  // Let each platform do its own initialization.
+  PlatformInitialize();
+
 #if defined(OS_WIN)
   // The delay is necessary because assistive technology sometimes isn't
   // detected until after the user interacts in some way, so a reasonable delay
@@ -168,6 +171,8 @@
 }
 
 #if !defined(OS_WIN) && !defined(OS_MACOSX)
+void BrowserAccessibilityStateImpl::PlatformInitialize() {}
+
 void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
 }
 #endif
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.h b/content/browser/accessibility/browser_accessibility_state_impl.h
index d3d09e3..1b592367 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.h
+++ b/content/browser/accessibility/browser_accessibility_state_impl.h
@@ -84,6 +84,7 @@
   // Leaky singleton, destructor generally won't be called.
   ~BrowserAccessibilityStateImpl() override;
 
+  void PlatformInitialize();
   void UpdatePlatformSpecificHistograms();
 
   ui::AXMode accessibility_mode_;
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_mac.mm b/content/browser/accessibility/browser_accessibility_state_impl_mac.mm
index e3a743e..262083f 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_state_impl_mac.mm
@@ -18,6 +18,8 @@
 
 namespace content {
 
+void BrowserAccessibilityStateImpl::PlatformInitialize() {}
+
 void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
   // NOTE: This function is running on the file thread.
   NSWorkspace* workspace = [NSWorkspace sharedWorkspace];
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_win.cc b/content/browser/accessibility/browser_accessibility_state_impl_win.cc
index df3b54b..16314d71 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl_win.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl_win.cc
@@ -15,9 +15,65 @@
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
+#include "ui/accessibility/platform/ax_platform_node_win.h"
 
 namespace content {
 
+namespace {
+
+// Enables accessibility based on three possible clues that indicate
+// accessibility API usage.
+//
+// TODO(dmazzoni): Rename IAccessible2UsageObserver to something more general.
+class WindowsAccessibilityEnabler : public ui::IAccessible2UsageObserver {
+ public:
+  WindowsAccessibilityEnabler() {}
+
+ private:
+  // IAccessible2UsageObserver
+  void OnIAccessible2Used() override {
+    // When IAccessible2 APIs have been used elsewhere in the codebase,
+    // enable basic web accessibility support. (Full screen reader support is
+    // detected later when specific more advanced APIs are accessed.)
+    BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
+        ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
+  }
+
+  void OnScreenReaderHoneyPotQueried() override {
+    // We used to trust this as a signal that a screen reader is running,
+    // but it's been abused. Now only enable accessibility if we also
+    // detect a call to get_accName.
+    if (screen_reader_honeypot_queried_)
+      return;
+    screen_reader_honeypot_queried_ = true;
+    if (acc_name_called_) {
+      BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
+          ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
+    }
+  }
+
+  void OnAccNameCalled() override {
+    // See OnScreenReaderHoneyPotQueried, above.
+    if (acc_name_called_)
+      return;
+    acc_name_called_ = true;
+    if (screen_reader_honeypot_queried_) {
+      BrowserAccessibilityStateImpl::GetInstance()->AddAccessibilityModeFlags(
+          ui::AXMode::kNativeAPIs | ui::AXMode::kWebContents);
+    }
+  }
+
+  bool screen_reader_honeypot_queried_ = false;
+  bool acc_name_called_ = false;
+};
+
+}  // namespace
+
+void BrowserAccessibilityStateImpl::PlatformInitialize() {
+  ui::GetIAccessible2UsageObserverList().AddObserver(
+      new WindowsAccessibilityEnabler());
+}
+
 void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() {
   // NOTE: this method is run from the file thread to reduce jank, since
   // there's no guarantee these system calls will return quickly. Be careful
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 2117370..7efe826b 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1839,6 +1839,11 @@
   RunHtmlTest(FILE_PATH_LITERAL("window-crops-items.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
+                       AccessibilityInputInsideLabel) {
+  RunHtmlTest(FILE_PATH_LITERAL("input-inside-label.html"));
+}
+
 //
 // Regression tests. These don't test a specific web platform feature,
 // they test a specific web page that crashed or had some bad behavior
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc
index b1a0ee1e..ae4d0f92 100644
--- a/content/browser/dom_storage/dom_storage_context_wrapper.cc
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc
@@ -47,7 +47,7 @@
 void GetLegacyLocalStorageUsage(
     const base::FilePath& directory,
     scoped_refptr<base::SingleThreadTaskRunner> reply_task_runner,
-    const DOMStorageContext::GetLocalStorageUsageCallback& callback) {
+    DOMStorageContext::GetLocalStorageUsageCallback callback) {
   std::vector<LocalStorageUsageInfo> infos;
   base::FileEnumerator enumerator(directory, false,
                                   base::FileEnumerator::FILES);
@@ -62,14 +62,14 @@
       infos.push_back(info);
     }
   }
-  reply_task_runner->PostTask(FROM_HERE,
-                              base::BindOnce(callback, std::move(infos)));
+  reply_task_runner->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), std::move(infos)));
 }
 
 void InvokeLocalStorageUsageCallbackHelper(
-    const DOMStorageContext::GetLocalStorageUsageCallback& callback,
+    DOMStorageContext::GetLocalStorageUsageCallback callback,
     std::unique_ptr<std::vector<LocalStorageUsageInfo>> infos) {
-  callback.Run(*infos);
+  std::move(callback).Run(*infos);
 }
 
 void GetSessionStorageUsageHelper(
@@ -84,7 +84,7 @@
 
 void CollectLocalStorageUsage(
     std::vector<LocalStorageUsageInfo>* out_info,
-    base::Closure done_callback,
+    base::OnceClosure done_callback,
     const std::vector<LocalStorageUsageInfo>& in_info) {
   out_info->insert(out_info->end(), in_info.begin(), in_info.end());
   std::move(done_callback).Run();
@@ -98,10 +98,10 @@
 
 void GotMojoLocalStorageUsage(
     scoped_refptr<base::SingleThreadTaskRunner> reply_task_runner,
-    const DOMStorageContext::GetLocalStorageUsageCallback& callback,
+    DOMStorageContext::GetLocalStorageUsageCallback callback,
     std::vector<LocalStorageUsageInfo> usage) {
-  reply_task_runner->PostTask(FROM_HERE,
-                              base::BindOnce(callback, std::move(usage)));
+  reply_task_runner->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), std::move(usage)));
 }
 
 void GotMojoSessionStorageUsage(
@@ -187,13 +187,13 @@
 }
 
 void DOMStorageContextWrapper::GetLocalStorageUsage(
-    const GetLocalStorageUsageCallback& callback) {
+    GetLocalStorageUsageCallback callback) {
   DCHECK(context_.get());
   auto infos = std::make_unique<std::vector<LocalStorageUsageInfo>>();
   auto* infos_ptr = infos.get();
   base::RepeatingClosure got_local_storage_usage = base::BarrierClosure(
-      2, base::BindOnce(&InvokeLocalStorageUsageCallbackHelper, callback,
-                        std::move(infos)));
+      2, base::BindOnce(&InvokeLocalStorageUsageCallbackHelper,
+                        std::move(callback), std::move(infos)));
   auto collect_callback = base::BindRepeating(
       CollectLocalStorageUsage, infos_ptr, std::move(got_local_storage_usage));
   // base::Unretained is safe here, because the mojo_state_ won't be deleted
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.h b/content/browser/dom_storage/dom_storage_context_wrapper.h
index 7b702ef..17a2aa8 100644
--- a/content/browser/dom_storage/dom_storage_context_wrapper.h
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.h
@@ -58,8 +58,7 @@
       storage::SpecialStoragePolicy* special_storage_policy);
 
   // DOMStorageContext implementation.
-  void GetLocalStorageUsage(
-      const GetLocalStorageUsageCallback& callback) override;
+  void GetLocalStorageUsage(GetLocalStorageUsageCallback callback) override;
   void GetSessionStorageUsage(GetSessionStorageUsageCallback callback) override;
   void DeleteLocalStorage(const GURL& origin,
                           base::OnceClosure callback) override;
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h
index 020f0d12..34a7d12 100644
--- a/content/browser/renderer_host/compositor_impl_android.h
+++ b/content/browser/renderer_host/compositor_impl_android.h
@@ -130,6 +130,7 @@
   void DidPresentCompositorFrame(
       uint32_t frame_token,
       const gfx::PresentationFeedback& feedback) override {}
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override {}
 
   // LayerTreeHostSingleThreadClient implementation.
   void DidSubmitCompositorFrame() override;
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 637de06a..274dc206 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -13,6 +13,7 @@
 
 #include "base/barrier_closure.h"
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/sequenced_task_runner.h"
@@ -97,18 +98,18 @@
 }
 
 void CheckQuotaManagedDataDeletionStatus(size_t* deletion_task_count,
-                                         const base::Closure& callback) {
+                                         base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (*deletion_task_count == 0) {
     delete deletion_task_count;
-    callback.Run();
+    std::move(callback).Run();
   }
 }
 
 void OnQuotaManagedOriginDeleted(const GURL& origin,
                                  blink::mojom::StorageType type,
                                  size_t* deletion_task_count,
-                                 const base::Closure& callback,
+                                 base::OnceClosure callback,
                                  blink::mojom::QuotaStatusCode status) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK_GT(*deletion_task_count, 0u);
@@ -119,7 +120,7 @@
   }
 
   (*deletion_task_count)--;
-  CheckQuotaManagedDataDeletionStatus(deletion_task_count, callback);
+  CheckQuotaManagedDataDeletionStatus(deletion_task_count, std::move(callback));
 }
 
 void ClearedShaderCache(const base::Closure& callback) {
@@ -146,11 +147,12 @@
     const StoragePartition::OriginMatcherFunction& origin_matcher,
     const base::Time delete_begin,
     const base::Time delete_end,
-    const base::Closure& callback,
+    base::OnceClosure callback,
     const std::vector<LocalStorageUsageInfo>& infos) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  base::RepeatingClosure barrier = base::BarrierClosure(infos.size(), callback);
+  base::RepeatingClosure barrier =
+      base::BarrierClosure(infos.size(), std::move(callback));
   for (size_t i = 0; i < infos.size(); ++i) {
     if (!origin_matcher.is_null() &&
         !origin_matcher.Run(infos[i].origin, special_storage_policy.get())) {
@@ -171,7 +173,7 @@
     const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const scoped_refptr<storage::SpecialStoragePolicy>& special_storage_policy,
     const StoragePartition::OriginMatcherFunction& origin_matcher,
-    const base::Closure& callback,
+    base::OnceClosure callback,
     const std::vector<SessionStorageUsageInfo>& infos) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
@@ -183,7 +185,7 @@
     dom_storage_context->DeleteSessionStorage(infos[i]);
   }
 
-  callback.Run();
+  std::move(callback).Run();
 }
 
 void ClearLocalStorageOnUIThread(
@@ -193,7 +195,7 @@
     const GURL& storage_origin,
     const base::Time begin,
     const base::Time end,
-    const base::Closure& callback) {
+    base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   if (!storage_origin.is_empty()) {
@@ -201,29 +203,29 @@
                       origin_matcher.Run(storage_origin,
                                          special_storage_policy.get());
     if (can_delete) {
-      dom_storage_context->DeleteLocalStorage(storage_origin, callback);
+      dom_storage_context->DeleteLocalStorage(storage_origin,
+                                              std::move(callback));
     } else {
-      callback.Run();
+      std::move(callback).Run();
     }
     return;
   }
 
-  dom_storage_context->GetLocalStorageUsage(
-      base::Bind(&OnLocalStorageUsageInfo,
-                 dom_storage_context, special_storage_policy, origin_matcher,
-                 begin, end, callback));
+  dom_storage_context->GetLocalStorageUsage(base::BindOnce(
+      &OnLocalStorageUsageInfo, dom_storage_context, special_storage_policy,
+      origin_matcher, begin, end, std::move(callback)));
 }
 
 void ClearSessionStorageOnUIThread(
     const scoped_refptr<DOMStorageContextWrapper>& dom_storage_context,
     const scoped_refptr<storage::SpecialStoragePolicy>& special_storage_policy,
     const StoragePartition::OriginMatcherFunction& origin_matcher,
-    const base::Closure& callback) {
+    base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  dom_storage_context->GetSessionStorageUsage(
-      base::BindOnce(&OnSessionStorageUsageInfo, dom_storage_context,
-                     special_storage_policy, origin_matcher, callback));
+  dom_storage_context->GetSessionStorageUsage(base::BindOnce(
+      &OnSessionStorageUsageInfo, dom_storage_context, special_storage_policy,
+      origin_matcher, std::move(callback)));
 }
 
 }  // namespace
@@ -354,11 +356,11 @@
   QuotaManagedDataDeletionHelper(uint32_t remove_mask,
                                  uint32_t quota_storage_remove_mask,
                                  const GURL& storage_origin,
-                                 const base::Closure& callback)
+                                 base::OnceClosure callback)
       : remove_mask_(remove_mask),
         quota_storage_remove_mask_(quota_storage_remove_mask),
         storage_origin_(storage_origin),
-        callback_(callback),
+        callback_(std::move(callback)),
         task_count_(0) {}
 
   void IncrementTaskCountOnIO();
@@ -376,7 +378,7 @@
       const scoped_refptr<storage::SpecialStoragePolicy>&
           special_storage_policy,
       const StoragePartition::OriginMatcherFunction& origin_matcher,
-      const base::Closure& callback,
+      base::OnceClosure callback,
       const std::set<GURL>& origins,
       blink::mojom::StorageType quota_storage_type);
 
@@ -385,7 +387,7 @@
   uint32_t remove_mask_;
   uint32_t quota_storage_remove_mask_;
   GURL storage_origin_;
-  const base::Closure callback_;
+  base::OnceClosure callback_;
   int task_count_;
 
   DISALLOW_COPY_AND_ASSIGN(QuotaManagedDataDeletionHelper);
@@ -461,7 +463,7 @@
       const scoped_refptr<storage::SpecialStoragePolicy>&
           special_storage_policy,
       const StoragePartition::OriginMatcherFunction& origin_matcher,
-      const base::Closure& callback);
+      base::OnceClosure callback);
 
  private:
   uint32_t remove_mask_;
@@ -481,12 +483,13 @@
     const GURL& storage_origin,
     const scoped_refptr<storage::SpecialStoragePolicy>& special_storage_policy,
     const StoragePartition::OriginMatcherFunction& origin_matcher,
-    const base::Closure& callback) {
+    base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
   StoragePartitionImpl::QuotaManagedDataDeletionHelper* helper =
       new StoragePartitionImpl::QuotaManagedDataDeletionHelper(
-          remove_mask_, quota_storage_remove_mask_, storage_origin, callback);
+          remove_mask_, quota_storage_remove_mask_, storage_origin,
+          std::move(callback));
   helper->ClearDataOnIOThread(quota_manager, begin, special_storage_policy,
                               origin_matcher);
 }
@@ -581,8 +584,8 @@
       in_memory, partition_path,
       base::CreateSingleThreadTaskRunnerWithTraits({BrowserThread::IO}).get(),
       context->GetSpecialStoragePolicy(),
-      base::Bind(&StoragePartitionImpl::GetQuotaSettings,
-                 partition->weak_factory_.GetWeakPtr()));
+      base::BindRepeating(&StoragePartitionImpl::GetQuotaSettings,
+                          partition->weak_factory_.GetWeakPtr()));
   scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy =
       partition->quota_manager_->proxy();
 
@@ -947,7 +950,7 @@
   if (task_count_)
     return;
 
-  callback_.Run();
+  std::move(callback_).Run();
   delete this;
 }
 
@@ -957,7 +960,7 @@
     const scoped_refptr<storage::SpecialStoragePolicy>& special_storage_policy,
     const StoragePartition::OriginMatcherFunction& origin_matcher) {
   IncrementTaskCountOnIO();
-  base::Closure decrement_callback = base::Bind(
+  base::RepeatingClosure decrement_callback = base::BindRepeating(
       &QuotaManagedDataDeletionHelper::DecrementTaskCountOnIO,
       base::Unretained(this));
 
@@ -993,7 +996,7 @@
         base::BindOnce(&QuotaManagedDataDeletionHelper::ClearOriginsOnIOThread,
                        base::Unretained(this), base::RetainedRef(quota_manager),
                        special_storage_policy, origin_matcher,
-                       std::move(decrement_callback)));
+                       decrement_callback));
   }
 
   DecrementTaskCountOnIO();
@@ -1005,7 +1008,7 @@
         const scoped_refptr<storage::SpecialStoragePolicy>&
             special_storage_policy,
         const StoragePartition::OriginMatcherFunction& origin_matcher,
-        const base::Closure& callback,
+        base::OnceClosure callback,
         const std::set<GURL>& origins,
         blink::mojom::StorageType quota_storage_type) {
   // The QuotaManager manages all storage other than cookies, LocalStorage,
@@ -1013,10 +1016,15 @@
   // origins.
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   if (origins.empty()) {
-    callback.Run();
+    std::move(callback).Run();
     return;
   }
 
+  // The logic below (via CheckQuotaManagedDataDeletionStatus) only
+  // invokes the callback when all processing is complete.
+  base::RepeatingClosure completion =
+      base::AdaptCallbackForRepeating(std::move(callback));
+
   size_t* deletion_task_count = new size_t(0u);
   (*deletion_task_count)++;
   for (std::set<GURL>::const_iterator origin = origins.begin();
@@ -1035,11 +1043,11 @@
         *origin, quota_storage_type,
         StoragePartitionImpl::GenerateQuotaClientMask(remove_mask_),
         base::BindOnce(&OnQuotaManagedOriginDeleted, origin->GetOrigin(),
-                       quota_storage_type, deletion_task_count, callback));
+                       quota_storage_type, deletion_task_count, completion));
   }
   (*deletion_task_count)--;
 
-  CheckQuotaManagedDataDeletionStatus(deletion_task_count, callback);
+  CheckQuotaManagedDataDeletionStatus(deletion_task_count, completion);
 }
 
 void StoragePartitionImpl::DataDeletionHelper::IncrementTaskCountOnUI() {
@@ -1080,7 +1088,7 @@
   DCHECK(!callback_.is_null());
 
   IncrementTaskCountOnUI();
-  base::Closure decrement_callback = base::Bind(
+  base::RepeatingClosure decrement_callback = base::BindRepeating(
       &DataDeletionHelper::DecrementTaskCount, base::Unretained(this));
 
   if (remove_mask_ & REMOVE_DATA_MASK_COOKIES) {
diff --git a/content/browser/web_package/signed_exchange_handler.cc b/content/browser/web_package/signed_exchange_handler.cc
index 29199c0..0d3150c 100644
--- a/content/browser/web_package/signed_exchange_handler.cc
+++ b/content/browser/web_package/signed_exchange_handler.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/web_package/signed_exchange_handler.h"
 
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/post_task.h"
 #include "base/time/time.h"
@@ -48,6 +50,16 @@
 namespace {
 
 constexpr char kDigestHeader[] = "Digest";
+constexpr char kHistogramSignatureVerificationResult[] =
+    "SignedExchange.SignatureVerificationResult";
+constexpr char kHistogramCertVerificationResult[] =
+    "SignedExchange.CertVerificationResult";
+constexpr char kHistogramCTVerificationResult[] =
+    "SignedExchange.CTVerificationResult";
+constexpr char kHistogramOCSPResponseStatus[] =
+    "SignedExchange.OCSPResponseStatus";
+constexpr char kHistogramOCSPRevocationStatus[] =
+    "SignedExchange.OCSPRevocationStatus";
 
 network::mojom::NetworkContext* g_network_context_for_testing = nullptr;
 
@@ -427,6 +439,8 @@
       SignedExchangeSignatureVerifier::Verify(
           *envelope_, unverified_cert_chain_->cert(), GetVerificationTime(),
           devtools_proxy_.get());
+  UMA_HISTOGRAM_ENUMERATION(kHistogramSignatureVerificationResult,
+                            verify_result);
   if (verify_result != SignedExchangeSignatureVerifier::Result::kSuccess) {
     base::Optional<SignedExchangeError::Field> error_field =
         SignedExchangeError::GetFieldFromSignatureVerifierResult(verify_result);
@@ -483,12 +497,21 @@
   //
   // OCSP verification is done in CertVerifier::Verify(), so we just check the
   // result here.
-
-  if (ocsp_result.response_status != net::OCSPVerifyResult::PROVIDED ||
-      ocsp_result.revocation_status != net::OCSPRevocationStatus::GOOD)
-    return false;
-
-  return true;
+  UMA_HISTOGRAM_ENUMERATION(kHistogramOCSPResponseStatus,
+                            ocsp_result.response_status,
+                            static_cast<base::HistogramBase::Sample>(
+                                net::OCSPVerifyResult::RESPONSE_STATUS_MAX) +
+                                1);
+  if (ocsp_result.response_status == net::OCSPVerifyResult::PROVIDED) {
+    UMA_HISTOGRAM_ENUMERATION(kHistogramOCSPRevocationStatus,
+                              ocsp_result.revocation_status,
+                              static_cast<base::HistogramBase::Sample>(
+                                  net::OCSPRevocationStatus::MAX_VALUE) +
+                                  1);
+    if (ocsp_result.revocation_status == net::OCSPRevocationStatus::GOOD)
+      return true;
+  }
+  return false;
 }
 
 void SignedExchangeHandler::OnVerifyCert(
@@ -497,6 +520,11 @@
     const net::ct::CTVerifyResult& ct_result) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"),
                "SignedExchangeHandler::OnCertVerifyComplete");
+  // net::Error codes are negative, so we put - in front of it.
+  base::UmaHistogramSparse(kHistogramCertVerificationResult, -error_code);
+  UMA_HISTOGRAM_ENUMERATION(kHistogramCTVerificationResult,
+                            ct_result.policy_compliance,
+                            net::ct::CTPolicyCompliance::CT_POLICY_MAX);
 
   if (error_code != net::OK) {
     SignedExchangeLoadResult result;
diff --git a/content/browser/web_package/signed_exchange_handler_unittest.cc b/content/browser/web_package/signed_exchange_handler_unittest.cc
index 58524f75..d4661c4 100644
--- a/content/browser/web_package/signed_exchange_handler_unittest.cc
+++ b/content/browser/web_package/signed_exchange_handler_unittest.cc
@@ -11,9 +11,11 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "content/browser/web_package/signed_exchange_cert_fetcher_factory.h"
 #include "content/browser/web_package/signed_exchange_devtools_proxy.h"
+#include "content/browser/web_package/signed_exchange_signature_verifier.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_paths.h"
 #include "content/public/test/test_browser_thread_bundle.h"
@@ -279,7 +281,30 @@
     }
   }
 
+  void ExpectHistogramValues(
+      base::Optional<SignedExchangeSignatureVerifier::Result> signature_result,
+      base::Optional<int32_t> cert_result,
+      base::Optional<net::ct::CTPolicyCompliance> ct_result,
+      base::Optional<net::OCSPVerifyResult::ResponseStatus>
+          ocsp_response_status,
+      base::Optional<net::OCSPRevocationStatus> ocsp_revocation_status) {
+    // CertVerificationResult histogram records negated net::Error code.
+    if (cert_result.has_value())
+      *cert_result = -*cert_result;
+
+    ExpectZeroOrUniqueSample("SignedExchange.SignatureVerificationResult",
+                             signature_result);
+    ExpectZeroOrUniqueSample("SignedExchange.CertVerificationResult",
+                             cert_result);
+    ExpectZeroOrUniqueSample("SignedExchange.CTVerificationResult", ct_result);
+    ExpectZeroOrUniqueSample("SignedExchange.OCSPResponseStatus",
+                             ocsp_response_status);
+    ExpectZeroOrUniqueSample("SignedExchange.OCSPRevocationStatus",
+                             ocsp_revocation_status);
+  }
+
  protected:
+  const base::HistogramTester histogram_tester_;
   MockSignedExchangeCertFetcherFactory* mock_cert_fetcher_factory_;
   std::unique_ptr<net::CertVerifier> cert_verifier_;
   std::unique_ptr<MockCTVerifier> mock_ct_verifier_;
@@ -302,6 +327,15 @@
     payload_stream_ = std::move(payload_stream);
   }
 
+  template <typename T>
+  void ExpectZeroOrUniqueSample(const std::string& histogram_name,
+                                base::Optional<T> expected_value) {
+    if (expected_value.has_value())
+      histogram_tester_.ExpectUniqueSample(histogram_name, *expected_value, 1);
+    else
+      histogram_tester_.ExpectTotalCount(histogram_name, 0);
+  }
+
   base::test::ScopedFeatureList feature_list_;
   content::TestBrowserThreadBundle browser_thread_bundle_;
   std::unique_ptr<net::TestURLRequestContext> url_request_context_;
@@ -377,6 +411,10 @@
 
   EXPECT_EQ(payload, expected_payload);
   EXPECT_EQ(rv, static_cast<int>(expected_payload.size()));
+  ExpectHistogramValues(
+      SignedExchangeSignatureVerifier::Result::kSuccess, net::OK,
+      net::ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS,
+      net::OCSPVerifyResult::PROVIDED, net::OCSPRevocationStatus::GOOD);
 }
 
 TEST_P(SignedExchangeHandlerTest, MimeType) {
@@ -550,6 +588,12 @@
   EXPECT_EQ(SignedExchangeLoadResult::kSignatureVerificationError, result());
   EXPECT_EQ(net::ERR_INVALID_SIGNED_EXCHANGE, error());
   EXPECT_EQ(kTestSxgInnerURL, inner_url());
+  ExpectHistogramValues(
+      SignedExchangeSignatureVerifier::Result::kErrCertificateSHA256Mismatch,
+      base::nullopt /* cert_result */, base::nullopt /* ct_result */,
+      base::nullopt /* ocsp_response_status */,
+      base::nullopt /* ocsp_revocation_status */);
+
   // Drain the MockSourceStream, otherwise its destructer causes DCHECK failure.
   ReadStream(source_, nullptr);
 }
@@ -586,6 +630,12 @@
   EXPECT_EQ(SignedExchangeLoadResult::kCertVerificationError, result());
   EXPECT_EQ(net::ERR_INVALID_SIGNED_EXCHANGE, error());
   EXPECT_EQ("https://test.example.com/test/", inner_url());
+  ExpectHistogramValues(
+      SignedExchangeSignatureVerifier::Result::kSuccess, net::ERR_CERT_INVALID,
+      net::ct::CTPolicyCompliance::CT_POLICY_COMPLIANCE_DETAILS_NOT_AVAILABLE,
+      base::nullopt /* ocsp_response_status */,
+      base::nullopt /* ocsp_revocation_status */);
+
   // Drain the MockSourceStream, otherwise its destructer causes DCHECK failure.
   ReadStream(source_, nullptr);
 }
@@ -809,6 +859,11 @@
   EXPECT_EQ(SignedExchangeLoadResult::kCTVerificationError, result());
   EXPECT_EQ(net::ERR_INVALID_SIGNED_EXCHANGE, error());
   EXPECT_EQ(kTestSxgInnerURL, inner_url());
+  ExpectHistogramValues(SignedExchangeSignatureVerifier::Result::kSuccess,
+                        net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED,
+                        net::ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS,
+                        base::nullopt /* ocsp_response_status */,
+                        base::nullopt /* ocsp_revocation_status */);
   // Drain the MockSourceStream, otherwise its destructer causes DCHECK failure.
   ReadStream(source_, nullptr);
 }
@@ -854,6 +909,10 @@
   EXPECT_TRUE(resource_response().ssl_info->ct_policy_compliance_required);
   EXPECT_EQ(net::ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS,
             resource_response().ssl_info->ct_policy_compliance);
+  ExpectHistogramValues(
+      SignedExchangeSignatureVerifier::Result::kSuccess, net::OK,
+      net::ct::CTPolicyCompliance::CT_POLICY_COMPLIES_VIA_SCTS,
+      net::OCSPVerifyResult::PROVIDED, net::OCSPRevocationStatus::GOOD);
 
   std::string payload;
   int rv = ReadPayloadStream(&payload);
@@ -906,6 +965,10 @@
   EXPECT_FALSE(resource_response().ssl_info->ct_policy_compliance_required);
   EXPECT_EQ(net::ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS,
             resource_response().ssl_info->ct_policy_compliance);
+  ExpectHistogramValues(
+      SignedExchangeSignatureVerifier::Result::kSuccess, net::OK,
+      net::ct::CTPolicyCompliance::CT_POLICY_NOT_ENOUGH_SCTS,
+      net::OCSPVerifyResult::PROVIDED, net::OCSPRevocationStatus::GOOD);
 
   std::string payload;
   int rv = ReadPayloadStream(&payload);
diff --git a/content/browser/web_package/signed_exchange_signature_verifier.h b/content/browser/web_package/signed_exchange_signature_verifier.h
index 57c6c6de..c066dc1 100644
--- a/content/browser/web_package/signed_exchange_signature_verifier.h
+++ b/content/browser/web_package/signed_exchange_signature_verifier.h
@@ -31,6 +31,7 @@
 // https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#signature-validity
 class CONTENT_EXPORT SignedExchangeSignatureVerifier final {
  public:
+  // This enum is used for recording histograms. Treat as append-only.
   enum class Result {
     kSuccess,
     kErrNoCertificate,
@@ -40,7 +41,8 @@
     kErrSignatureVerificationFailed,
     kErrInvalidSignatureIntegrity,
     kErrInvalidTimestamp,
-    kErrUnsupportedCertType
+    kErrUnsupportedCertType,
+    kMaxValue = kErrUnsupportedCertType
   };
 
   static Result Verify(const SignedExchangeEnvelope& envelope,
diff --git a/content/public/browser/dom_storage_context.h b/content/public/browser/dom_storage_context.h
index 6862d3c..ef3dfa7 100644
--- a/content/public/browser/dom_storage_context.h
+++ b/content/public/browser/dom_storage_context.h
@@ -22,16 +22,14 @@
 // Represents the per-BrowserContext Local Storage data.
 class DOMStorageContext {
  public:
-  typedef base::Callback<
-      void(const std::vector<LocalStorageUsageInfo>&)>
-          GetLocalStorageUsageCallback;
+  using GetLocalStorageUsageCallback =
+      base::OnceCallback<void(const std::vector<LocalStorageUsageInfo>&)>;
 
-  typedef base::OnceCallback<void(const std::vector<SessionStorageUsageInfo>&)>
-      GetSessionStorageUsageCallback;
+  using GetSessionStorageUsageCallback =
+      base::OnceCallback<void(const std::vector<SessionStorageUsageInfo>&)>;
 
   // Returns a collection of origins using local storage to the given callback.
-  virtual void GetLocalStorageUsage(
-      const GetLocalStorageUsageCallback& callback) = 0;
+  virtual void GetLocalStorageUsage(GetLocalStorageUsageCallback callback) = 0;
 
   // Returns a collection of origins using session storage to the given
   // callback.
diff --git a/content/renderer/gpu/layer_tree_view.cc b/content/renderer/gpu/layer_tree_view.cc
index b471c15..a26b36d 100644
--- a/content/renderer/gpu/layer_tree_view.cc
+++ b/content/renderer/gpu/layer_tree_view.cc
@@ -10,6 +10,7 @@
 
 #include "base/auto_reset.h"
 #include "base/callback.h"
+#include "base/feature_list.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/post_task.h"
@@ -57,6 +58,12 @@
 
 using ReportTimeCallback = blink::WebLayerTreeView::ReportTimeCallback;
 
+// Enables using presentation times instead of swap times in swap promises.
+// Currently, these promises are only used by Paint Timing, but they will be
+// used by other APIs such as Event Timing.
+const base::Feature kUsePresentationTimeInSwapPromise = {
+    "UsePresentationTimeInSwapPromise", base::FEATURE_DISABLED_BY_DEFAULT};
+
 class ReportTimeSwapPromise : public cc::SwapPromise {
  public:
   ReportTimeSwapPromise(ReportTimeCallback callback,
@@ -91,6 +98,11 @@
 void ReportTimeSwapPromise::WillSwap(viz::CompositorFrameMetadata* metadata) {
   DCHECK_GT(metadata->frame_token, 0u);
   metadata->request_presentation_feedback = true;
+  if (!base::FeatureList::IsEnabled(kUsePresentationTimeInSwapPromise))
+    return;
+
+  // If using presentation timestamp, post task here calling
+  // LayerTreeView::AddPresentationCallback.
   auto* task_runner = task_runner_.get();
   task_runner->PostTask(
       FROM_HERE,
@@ -102,8 +114,14 @@
 }
 
 void ReportTimeSwapPromise::DidSwap() {
-  // If swap did happen, then the paint-time will be reported when the
-  // presentation feedback is received.
+  if (base::FeatureList::IsEnabled(kUsePresentationTimeInSwapPromise))
+    return;
+
+  // If using swap timestamp, the swap promise should return the current time.
+  task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback_),
+                                blink::WebLayerTreeView::SwapResult::kDidSwap,
+                                base::TimeTicks::Now()));
 }
 
 void ReportTimeSwapPromise::DidNotSwap(
@@ -123,6 +141,8 @@
       result = blink::WebLayerTreeView::SwapResult::kDidNotSwapActivationFails;
       break;
   }
+  // During a failed swap, return the current time regardless of whether we're
+  // using presentation or swap timestamps.
   task_runner_->PostTask(FROM_HERE, base::BindOnce(std::move(callback_), result,
                                                    base::TimeTicks::Now()));
 }
@@ -673,6 +693,10 @@
   }
 }
 
+void LayerTreeView::RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {
+  delegate_->RecordEndOfFrameMetrics(frame_begin_time);
+}
+
 void LayerTreeView::RequestScheduleAnimation() {
   delegate_->RequestScheduleAnimation();
 }
diff --git a/content/renderer/gpu/layer_tree_view.h b/content/renderer/gpu/layer_tree_view.h
index 644d239..820d1a2 100644
--- a/content/renderer/gpu/layer_tree_view.h
+++ b/content/renderer/gpu/layer_tree_view.h
@@ -197,6 +197,7 @@
   void DidPresentCompositorFrame(
       uint32_t frame_token,
       const gfx::PresentationFeedback& feedback) override;
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
 
   // cc::LayerTreeHostSingleThreadClient implementation.
   void RequestScheduleAnimation() override;
diff --git a/content/renderer/gpu/layer_tree_view_delegate.h b/content/renderer/gpu/layer_tree_view_delegate.h
index 0f13c9d..d28c056 100644
--- a/content/renderer/gpu/layer_tree_view_delegate.h
+++ b/content/renderer/gpu/layer_tree_view_delegate.h
@@ -69,6 +69,12 @@
   // will be displayed.
   virtual void DidReceiveCompositorFrameAck() = 0;
 
+  // Requests that a UMA and UKM metric be recorded for the total frame time.
+  // Call this as soon as the total frame time becomes known for a given frame.
+  // For example, ProxyMain::BeginMainFrame calls it immediately before aborting
+  // or committing a frame (at the same time Tracing measurements are taken).
+  virtual void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) = 0;
+
   // Indicates whether the LayerTreeView is about to close.
   virtual bool IsClosing() const = 0;
 
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index beee71f..a5d9a08 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -150,6 +150,7 @@
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/public/web/web_navigation_policy.h"
 #include "third_party/blink/public/web/web_page_importance_signals.h"
+#include "third_party/blink/public/web/web_page_popup.h"
 #include "third_party/blink/public/web/web_plugin.h"
 #include "third_party/blink/public/web/web_plugin_action.h"
 #include "third_party/blink/public/web/web_range.h"
@@ -1505,12 +1506,60 @@
 }
 
 WebWidget* RenderViewImpl::CreatePopup(blink::WebLocalFrame* creator) {
-  RenderWidget* popup_widget = RenderWidget::CreateForPopup(
-      this, GetWidget()->compositor_deps(), GetWidget()->screen_info());
-  if (!popup_widget)
+  mojom::WidgetPtr widget_channel;
+  mojom::WidgetRequest widget_channel_request =
+      mojo::MakeRequest(&widget_channel);
+
+  // Do a synchronous IPC to obtain a routing ID.
+  int32_t widget_routing_id = MSG_ROUTING_NONE;
+  bool success =
+      RenderThreadImpl::current_render_message_filter()->CreateNewWidget(
+          GetRoutingID(), std::move(widget_channel), &widget_routing_id);
+  if (!success) {
+    // When the renderer is being killed the mojo message will fail.
     return nullptr;
-  popup_widget->ApplyEmulatedScreenMetricsForPopupWidget(GetWidget());
-  return popup_widget->GetWebWidget();
+  }
+
+  RenderWidget::ShowCallback opener_callback = base::BindOnce(
+      &RenderViewImpl::ShowCreatedPopupWidget, weak_ptr_factory_.GetWeakPtr());
+
+  // The RenderWidget associated with the RenderView. This should be the
+  // RenderWidget for the main frame, but may be a zombie RenderWidget when
+  // the main frame is remote (we don't need a RenderWidget for it then).
+  // However for now (https://crbug.com/419087) we know it exists and grab
+  // state off it for the popup.
+  // TODO(crbug.com/419087): This should probably be using the local root's
+  // RenderWidget for the frame making the popup.
+  RenderWidget* view_render_widget = GetWidget();
+
+  auto popup_widget = base::MakeRefCounted<RenderWidget>(
+      widget_routing_id, view_render_widget->compositor_deps(),
+      WidgetType::kPopup, view_render_widget->screen_info(),
+      blink::kWebDisplayModeUndefined,
+      /*swapped_out=*/false,
+      /*hidden=*/false,
+      /*never_visible=*/false, std::move(widget_channel_request));
+
+  // The returned WebPagePopup is self-referencing, so the pointer here is not
+  // an owning pointer.
+  blink::WebPagePopup* popup_web_widget =
+      blink::WebPagePopup::Create(popup_widget.get());
+
+  // Adds a self-reference on the |popup_widget| so it will not be destroyed
+  // when leaving scope. The WebPagePopup takes responsibility for Close()ing
+  // and thus destroying the RenderWidget.
+  popup_widget->InitForPopup(std::move(opener_callback), popup_web_widget);
+  // TODO(crbug.com/419087): RenderWidget has some weird logic for picking a
+  // WebWidget which doesn't apply to this case. So we verify. This can go away
+  // when RenderWidget::GetWebWidget() is just a simple accessor.
+  DCHECK_EQ(popup_widget->GetWebWidget(), popup_web_widget);
+
+  // Devtools emulation, which may be currently applied to the
+  // |view_render_widget|, should also apply to the new popup. This doesn't
+  // happen automatically.
+  popup_widget->ApplyEmulatedScreenMetricsForPopupWidget(view_render_widget);
+
+  return popup_web_widget;
 }
 
 base::StringPiece RenderViewImpl::GetSessionStorageNamespaceId() {
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 77f9bd6..7902b5d 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -473,35 +473,11 @@
   return it == widgets->end() ? NULL : it->second;
 }
 
-// static
-RenderWidget* RenderWidget::CreateForPopup(
-    RenderViewImpl* opener,
-    CompositorDependencies* compositor_deps,
-    const ScreenInfo& screen_info) {
-  mojom::WidgetPtr widget_channel;
-  mojom::WidgetRequest widget_channel_request =
-      mojo::MakeRequest(&widget_channel);
-
-  // Do a synchronous IPC to obtain a routing ID.
-  int32_t routing_id = MSG_ROUTING_NONE;
-  bool success =
-      RenderThreadImpl::current_render_message_filter()->CreateNewWidget(
-          opener->GetRoutingID(), std::move(widget_channel), &routing_id);
-  if (!success) {
-    // When the renderer is being killed the mojo message will fail.
-    return nullptr;
-  }
-
-  scoped_refptr<RenderWidget> widget(
-      new RenderWidget(routing_id, compositor_deps, WidgetType::kPopup,
-                       screen_info, blink::kWebDisplayModeUndefined, false,
-                       false, false, std::move(widget_channel_request)));
-  ShowCallback opener_callback = base::BindOnce(
-      &RenderViewImpl::ShowCreatedPopupWidget, opener->GetWeakPtr());
-  blink::WebWidget* web_widget = WebPagePopup::Create(widget.get());
-  widget->Init(std::move(opener_callback), web_widget);
-  DCHECK(!widget->HasOneRef());  // RenderWidget::Init() adds a reference.
-  return widget.get();
+void RenderWidget::InitForPopup(ShowCallback show_callback,
+                                blink::WebPagePopup* web_page_popup) {
+  // Init() increments the reference count on |this|, making it
+  // self-referencing.
+  Init(std::move(show_callback), web_page_popup);
 }
 
 void RenderWidget::InitForChildLocalRoot(
@@ -1099,6 +1075,13 @@
   }
 }
 
+void RenderWidget::RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {
+  if (!GetWebWidget())
+    return;
+
+  GetWebWidget()->RecordEndOfFrameMetrics(frame_begin_time);
+}
+
 void RenderWidget::WillBeginCompositorFrame() {
   TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame");
 
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 5a3c9a8..3c4e2e13 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -164,13 +164,12 @@
                bool never_visible,
                mojom::WidgetRequest widget_request = nullptr);
 
-  // Creates a new RenderWidget for a popup. |opener| is the RenderView that
-  // this widget lives inside.
-  // TODO(danakj): Change this to InitForPopup() and use the public constructor
-  // from RenderViewImpl, moving code specific to that class out of the method.
-  static RenderWidget* CreateForPopup(RenderViewImpl* opener,
-                                      CompositorDependencies* compositor_deps,
-                                      const ScreenInfo& screen_info);
+  // Initialize a new RenderWidget for a popup. The |show_callback| is called
+  // when RenderWidget::Show() happens. This method increments the reference
+  // count on the RenderWidget, making it self-referencing, which can be
+  // released by calling Close().
+  void InitForPopup(ShowCallback show_callback,
+                    blink::WebPagePopup* web_page_popup);
 
   // Initialize a new RenderWidget that will be attached to a RenderFrame (via
   // the WebFrameWidget), for a frame that is a local root, but not the main
@@ -272,6 +271,7 @@
   void DidCommitCompositorFrame() override;
   void DidCompletePageScaleAnimation() override;
   void DidReceiveCompositorFrameAck() override;
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
   bool IsClosing() const override;
   void RequestScheduleAnimation() override;
   void UpdateVisualState() override;
diff --git a/content/test/data/accessibility/aria/aria-level-expected-blink.txt b/content/test/data/accessibility/aria/aria-level-expected-blink.txt
index c63d06fd..6b159f8 100644
--- a/content/test/data/accessibility/aria/aria-level-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-level-expected-blink.txt
@@ -21,7 +21,7 @@
 ++++staticText name='Level 5'
 ++++++inlineTextBox name='Level 5'
 ++tree
-++++treeItem name='Tree item at level 1 ' hierarchicalLevel=1 selected=false
+++++treeItem name='Tree item at level 1' hierarchicalLevel=1 selected=false
 ++++++staticText name='Tree item at level 1'
 ++++++++inlineTextBox name='Tree item at level 1'
 ++++++group
diff --git a/content/test/data/accessibility/aria/aria-level-expected-mac.txt b/content/test/data/accessibility/aria/aria-level-expected-mac.txt
index 010de4b..37f8b32b 100644
--- a/content/test/data/accessibility/aria/aria-level-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-level-expected-mac.txt
@@ -14,7 +14,7 @@
 ++AXHeading AXTitle='Level 5' AXValue='5'
 ++++AXStaticText AXValue='Level 5'
 ++AXOutline
-++++AXRow AXSubrole=AXOutlineRow AXTitle='Tree item at level 1 ' AXDisclosing='1' AXDisclosureLevel='0'
+++++AXRow AXSubrole=AXOutlineRow AXTitle='Tree item at level 1' AXDisclosing='1' AXDisclosureLevel='0'
 ++++++AXStaticText AXValue='Tree item at level 1'
 ++++++AXGroup
 ++++++++AXRow AXSubrole=AXOutlineRow AXTitle='Tree item at level 2' AXDisclosing='0' AXDisclosureLevel='1'
diff --git a/content/test/data/accessibility/aria/aria-level-expected-win.txt b/content/test/data/accessibility/aria/aria-level-expected-win.txt
index 5270dd6..5e0e86f9 100644
--- a/content/test/data/accessibility/aria/aria-level-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-level-expected-win.txt
@@ -14,7 +14,7 @@
 ++IA2_ROLE_HEADING name='Level 5' level:5
 ++++ROLE_SYSTEM_STATICTEXT name='Level 5'
 ++ROLE_SYSTEM_OUTLINE
-++++ROLE_SYSTEM_OUTLINEITEM name='Tree item at level 1 ' EXPANDED level:1
+++++ROLE_SYSTEM_OUTLINEITEM name='Tree item at level 1' EXPANDED level:1
 ++++++ROLE_SYSTEM_STATICTEXT name='Tree item at level 1'
 ++++++ROLE_SYSTEM_GROUPING
 ++++++++ROLE_SYSTEM_OUTLINEITEM name='Tree item at level 2' level:2
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-android.txt b/content/test/data/accessibility/aria/aria-tree-expected-android.txt
index ea622f71..530969a 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-android.txt
@@ -1,9 +1,9 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View role_description='tree' collection hierarchical row_count=2
-++++android.view.View role_description='tree item' checkable collection_item name='Animals '
+++++android.view.View role_description='tree item' checkable collection_item name='Animals'
 ++++++android.view.View role_description='link' clickable focusable link name='Animals'
 ++++++android.view.View
-++++++++android.view.View role_description='tree item' collection_item name='Domesticated '
+++++++++android.view.View role_description='tree item' collection_item name='Domesticated'
 ++++++++++android.view.View role_description='link' clickable focusable link name='Domesticated'
 ++++++++++android.view.View
 ++++++++++++android.view.View role_description='tree item' checkable checked collection_item name='Dog'
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-blink.txt b/content/test/data/accessibility/aria/aria-tree-expected-blink.txt
index 7384fc212..d9ec7e3a 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-blink.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-blink.txt
@@ -1,11 +1,11 @@
 rootWebArea
 ++tree
-++++treeItem name='Animals ' hierarchicalLevel=1 setSize=2 posInSet=1 checkedState=mixed selected=false
+++++treeItem name='Animals' hierarchicalLevel=1 setSize=2 posInSet=1 checkedState=mixed selected=false
 ++++++link name='Animals'
 ++++++++staticText name='Animals'
 ++++++++++inlineTextBox name='Animals'
 ++++++group
-++++++++treeItem name='Domesticated ' hierarchicalLevel=2 setSize=2 posInSet=1 selected=false
+++++++++treeItem name='Domesticated' hierarchicalLevel=2 setSize=2 posInSet=1 selected=false
 ++++++++++link name='Domesticated'
 ++++++++++++staticText name='Domesticated'
 ++++++++++++++inlineTextBox name='Domesticated'
@@ -25,4 +25,4 @@
 ++++treeItem name='Plants' hierarchicalLevel=1 setSize=2 posInSet=2 selected=false
 ++++++link name='Plants'
 ++++++++staticText name='Plants'
-++++++++++inlineTextBox name='Plants'
\ No newline at end of file
+++++++++++inlineTextBox name='Plants'
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-mac.txt b/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
index d04629be..d1e5ba9 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-mac.txt
@@ -1,10 +1,10 @@
 AXWebArea
 ++AXOutline
-++++AXRow AXTitle='Animals ' AXValue='2' AXARIASetSize='2' AXARIAPosInSet='1'
+++++AXRow AXTitle='Animals' AXValue='2' AXARIASetSize='2' AXARIAPosInSet='1'
 ++++++AXLink AXTitle='Animals'
 ++++++++AXStaticText AXValue='Animals'
 ++++++AXGroup
-++++++++AXRow AXTitle='Domesticated ' AXARIASetSize='2' AXARIAPosInSet='1'
+++++++++AXRow AXTitle='Domesticated' AXARIASetSize='2' AXARIAPosInSet='1'
 ++++++++++AXLink AXTitle='Domesticated'
 ++++++++++++AXStaticText AXValue='Domesticated'
 ++++++++++AXGroup
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-win.txt b/content/test/data/accessibility/aria/aria-tree-expected-win.txt
index 2e3dfe2a..16010b8 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-win.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-win.txt
@@ -1,10 +1,10 @@
 ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
 ++ROLE_SYSTEM_OUTLINE IA2_STATE_VERTICAL
-++++ROLE_SYSTEM_OUTLINEITEM name='Animals ' MIXED IA2_STATE_CHECKABLE level:1 setsize:2 posinset:1 checkable:true
+++++ROLE_SYSTEM_OUTLINEITEM name='Animals' MIXED IA2_STATE_CHECKABLE level:1 setsize:2 posinset:1 checkable:true
 ++++++ROLE_SYSTEM_LINK name='Animals' FOCUSABLE
 ++++++++ROLE_SYSTEM_STATICTEXT name='Animals'
 ++++++ROLE_SYSTEM_GROUPING
-++++++++ROLE_SYSTEM_OUTLINEITEM name='Domesticated ' level:2 setsize:2 posinset:1
+++++++++ROLE_SYSTEM_OUTLINEITEM name='Domesticated' level:2 setsize:2 posinset:1
 ++++++++++ROLE_SYSTEM_LINK name='Domesticated' FOCUSABLE
 ++++++++++++ROLE_SYSTEM_STATICTEXT name='Domesticated'
 ++++++++++ROLE_SYSTEM_GROUPING
diff --git a/content/test/data/accessibility/html/button-content-changed-expected-blink.txt b/content/test/data/accessibility/html/button-content-changed-expected-blink.txt
index e0bd78b..4b306f40 100644
--- a/content/test/data/accessibility/html/button-content-changed-expected-blink.txt
+++ b/content/test/data/accessibility/html/button-content-changed-expected-blink.txt
@@ -1,3 +1,3 @@
 rootWebArea
 ++genericContainer name='Done'
-++button name='After '
+++button name='After'
diff --git a/content/test/data/accessibility/html/input-inside-label-expected-blink.txt b/content/test/data/accessibility/html/input-inside-label-expected-blink.txt
new file mode 100644
index 0000000..5ad82961
--- /dev/null
+++ b/content/test/data/accessibility/html/input-inside-label-expected-blink.txt
@@ -0,0 +1,12 @@
+rootWebArea
+++genericContainer
+++++checkBox name='foo bar baz' checkedState=false
+++++textField value='bar'
+++++++genericContainer
+++++++++staticText name='bar'
+++++++++++inlineTextBox name='bar'
+++++checkBox name='foo bar baz' checkedState=false
+++++textField value='bar'
+++++++genericContainer
+++++++++staticText name='bar'
+++++++++++inlineTextBox name='bar'
diff --git a/content/test/data/accessibility/html/input-inside-label.html b/content/test/data/accessibility/html/input-inside-label.html
new file mode 100644
index 0000000..84a951e9
--- /dev/null
+++ b/content/test/data/accessibility/html/input-inside-label.html
@@ -0,0 +1,9 @@
+<html>
+<body>
+  <input type="checkbox" id="test1">
+  <label for="test1">foo<input type="text" value="bar">baz</label>
+
+  <input type="checkbox" id="test2">
+  <label for="test2">foo <input type="text" value="bar"> baz</label>
+</body>
+</html>
diff --git a/content/test/stub_layer_tree_view_delegate.h b/content/test/stub_layer_tree_view_delegate.h
index 65dc3b5..83bba53 100644
--- a/content/test/stub_layer_tree_view_delegate.h
+++ b/content/test/stub_layer_tree_view_delegate.h
@@ -20,6 +20,7 @@
   void RecordWheelAndTouchScrollingCount(bool has_scrolled_by_wheel,
                                          bool has_scrolled_by_touch) override {}
   void BeginMainFrame(base::TimeTicks frame_time) override {}
+  void RecordEndOfFrameMetrics(base::TimeTicks) override {}
   void RequestNewLayerTreeFrameSink(
       LayerTreeFrameSinkCallback callback) override;
   void DidCommitAndDrawCompositorFrame() override {}
diff --git a/extensions/common/file_util.cc b/extensions/common/file_util.cc
index 0e44a358..238739e 100644
--- a/extensions/common/file_util.cc
+++ b/extensions/common/file_util.cc
@@ -32,6 +32,7 @@
 #include "extensions/common/extension_icon_set.h"
 #include "extensions/common/extension_l10n_util.h"
 #include "extensions/common/extension_set.h"
+#include "extensions/common/image_util.h"
 #include "extensions/common/install_warning.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_constants.h"
@@ -55,6 +56,8 @@
 };
 SafeInstallationFlag g_use_safe_installation = DEFAULT;
 
+bool g_report_error_for_invisible_icon = false;
+
 // Returns true if the given file path exists and is not zero-length.
 bool ValidateFilePath(const base::FilePath& path) {
   int64_t size = 0;
@@ -460,20 +463,36 @@
   return path;
 }
 
+void SetReportErrorForInvisibleIconForTesting(bool value) {
+  g_report_error_for_invisible_icon = value;
+}
+
 bool ValidateExtensionIconSet(const ExtensionIconSet& icon_set,
                               const Extension* extension,
                               int error_message_id,
                               std::string* error) {
-  for (ExtensionIconSet::IconMap::const_iterator iter = icon_set.map().begin();
-       iter != icon_set.map().end();
-       ++iter) {
+  for (const auto& entry : icon_set.map()) {
     const base::FilePath path =
-        extension->GetResource(iter->second).GetFilePath();
+        extension->GetResource(entry.second).GetFilePath();
     if (!ValidateFilePath(path)) {
       *error = l10n_util::GetStringFUTF8(error_message_id,
-                                         base::UTF8ToUTF16(iter->second));
+                                         base::UTF8ToUTF16(entry.second));
       return false;
     }
+
+    if (extension->location() == Manifest::UNPACKED) {
+      const bool is_sufficiently_visible =
+          image_util::IsIconAtPathSufficientlyVisible(path);
+      UMA_HISTOGRAM_BOOLEAN(
+          "Extensions.ManifestIconSetIconWasVisibleForUnpacked",
+          is_sufficiently_visible);
+      if (!is_sufficiently_visible && g_report_error_for_invisible_icon) {
+        *error = l10n_util::GetStringFUTF8(
+            IDS_EXTENSION_LOAD_ICON_NOT_SUFFICIENTLY_VISIBLE,
+            base::UTF8ToUTF16(entry.second));
+        return false;
+      }
+    }
   }
   return true;
 }
diff --git a/extensions/common/file_util.h b/extensions/common/file_util.h
index 306290ef..cd80782 100644
--- a/extensions/common/file_util.h
+++ b/extensions/common/file_util.h
@@ -17,10 +17,6 @@
 class ExtensionIconSet;
 class GURL;
 
-namespace base {
-class FilePath;
-}
-
 namespace extensions {
 class Extension;
 struct InstallWarning;
@@ -114,8 +110,16 @@
 // Get a relative file path from a chrome-extension:// URL.
 base::FilePath ExtensionURLToRelativeFilePath(const GURL& url);
 
-// Returns true if the icons in the icon set exist. Oherwise, populates
-// |error| with the |error_message_id| for an invalid file.
+// If |value| is true, when ValidateExtensionIconSet is called for unpacked
+// extensions, an icon which is not sufficiently visible will be reported as
+// an error.
+void SetReportErrorForInvisibleIconForTesting(bool value);
+
+// Returns true if the icons in |icon_set| exist. Otherwise, populates
+// |error| with the |error_message_id| for an invalid file. If an icon
+// is not sufficiently visible, and error checking is enabled, |error|
+// is populated with a different message, rather than one specified
+// by |error_message_id|.
 bool ValidateExtensionIconSet(const ExtensionIconSet& icon_set,
                               const Extension* extension,
                               int error_message_id,
diff --git a/extensions/common/file_util_unittest.cc b/extensions/common/file_util_unittest.cc
index 8919be9..4deab6f 100644
--- a/extensions/common/file_util_unittest.cc
+++ b/extensions/common/file_util_unittest.cc
@@ -513,6 +513,45 @@
   EXPECT_EQ("Could not load extension icon 'missing-icon.png'.", error);
 }
 
+// Try to install an unpacked extension with an invisible icon. This
+// should fail.
+TEST_F(FileUtilTest, CheckInvisibleIconFileUnpacked) {
+  base::FilePath install_dir;
+  ASSERT_TRUE(base::PathService::Get(DIR_TEST_DATA, &install_dir));
+
+  base::FilePath ext_dir =
+      install_dir.AppendASCII("file_util").AppendASCII("invisible_icon");
+
+  // Set the flag that enables the error.
+  file_util::SetReportErrorForInvisibleIconForTesting(true);
+  std::string error;
+  scoped_refptr<Extension> extension(file_util::LoadExtension(
+      ext_dir, Manifest::UNPACKED, Extension::NO_FLAGS, &error));
+  file_util::SetReportErrorForInvisibleIconForTesting(false);
+  EXPECT_FALSE(extension);
+  EXPECT_EQ("The icon is not sufficiently visible 'invisible_icon.png'.",
+            error);
+}
+
+// Try to install a packed extension with an invisible icon. This should
+// succeed.
+TEST_F(FileUtilTest, CheckInvisibleIconFilePacked) {
+  base::FilePath install_dir;
+  ASSERT_TRUE(base::PathService::Get(DIR_TEST_DATA, &install_dir));
+
+  base::FilePath ext_dir =
+      install_dir.AppendASCII("file_util").AppendASCII("invisible_icon");
+
+  // Set the flag that enables the error.
+  file_util::SetReportErrorForInvisibleIconForTesting(true);
+  std::string error;
+  scoped_refptr<Extension> extension(file_util::LoadExtension(
+      ext_dir, Manifest::INTERNAL, Extension::NO_FLAGS, &error));
+  file_util::SetReportErrorForInvisibleIconForTesting(false);
+  EXPECT_TRUE(extension);
+  EXPECT_TRUE(error.empty());
+}
+
 TEST_F(FileUtilTest, ExtensionURLToRelativeFilePath) {
 #define URL_PREFIX "chrome-extension://extension-id/"
   struct TestCase {
diff --git a/extensions/common/image_util.cc b/extensions/common/image_util.cc
index b22c43c..4c44162 100644
--- a/extensions/common/image_util.cc
+++ b/extensions/common/image_util.cc
@@ -8,6 +8,8 @@
 #include <stdint.h>
 #include <vector>
 
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -15,6 +17,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/utils/SkParse.h"
+#include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/color_utils.h"
 
 namespace extensions {
@@ -187,5 +190,24 @@
          kMinPercentVisiblePixels;
 }
 
+bool IsIconAtPathSufficientlyVisible(const base::FilePath& path) {
+  SkBitmap icon;
+  if (!LoadPngFromFile(path, &icon)) {
+    return false;
+  } else {
+    return image_util::IsIconSufficientlyVisible(icon);
+  }
+}
+
+bool LoadPngFromFile(const base::FilePath& path, SkBitmap* dst) {
+  std::string png_bytes;
+  if (!base::ReadFileToString(path, &png_bytes)) {
+    return false;
+  }
+  return gfx::PNGCodec::Decode(
+      reinterpret_cast<const unsigned char*>(png_bytes.data()),
+      png_bytes.length(), dst);
+}
+
 }  // namespace image_util
 }  // namespace extensions
diff --git a/extensions/common/image_util.h b/extensions/common/image_util.h
index 92eefc2eb..727977e 100644
--- a/extensions/common/image_util.h
+++ b/extensions/common/image_util.h
@@ -11,6 +11,10 @@
 
 typedef unsigned int SkColor;
 
+namespace base {
+class FilePath;
+}
+
 // This file contains various utility functions for extension images and colors.
 namespace extensions {
 namespace image_util {
@@ -32,10 +36,17 @@
 // Parses hsl() or hsla() string to a SkColor. Returns true for success.
 bool ParseHslColorString(const std::string& color_string, SkColor* result);
 
-// Analyzes an icon image to determine if it will be visible in its display
+// Returns whether an icon image is considered to be visible in its display
 // context.
 bool IsIconSufficientlyVisible(const SkBitmap& bitmap);
 
+// Returns whether an icon image is considered to be visible in its display
+// context.
+bool IsIconAtPathSufficientlyVisible(const base::FilePath& path);
+
+// Load a PNG image from a file into the destination bitmap.
+bool LoadPngFromFile(const base::FilePath& path, SkBitmap* dst);
+
 }  // namespace image_util
 }  // namespace extensions
 
diff --git a/extensions/common/image_util_unittest.cc b/extensions/common/image_util_unittest.cc
index f7e35e7..1acd375 100644
--- a/extensions/common/image_util_unittest.cc
+++ b/extensions/common/image_util_unittest.cc
@@ -5,30 +5,14 @@
 #include <string>
 
 #include "base/files/file_path.h"
-#include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "extensions/common/extension_paths.h"
 #include "extensions/common/image_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/color_utils.h"
 
-namespace {
-
-bool LoadPngFromFile(const base::FilePath& path, SkBitmap* dst) {
-  std::string png_bytes;
-  if (!base::ReadFileToString(path, &png_bytes)) {
-    return false;
-  }
-  return gfx::PNGCodec::Decode(
-      reinterpret_cast<const unsigned char*>(png_bytes.data()),
-      png_bytes.length(), dst);
-}
-
-}  // namespace
-
 namespace extensions {
 
 void RunPassHexTest(const std::string& css_string, SkColor expected_result) {
@@ -204,35 +188,35 @@
     // This icon has all transparent pixels, so it will fail.
     icon_path = test_dir.AppendASCII("transparent_icon.png");
     SkBitmap transparent_icon;
-    ASSERT_TRUE(LoadPngFromFile(icon_path, &transparent_icon));
+    ASSERT_TRUE(image_util::LoadPngFromFile(icon_path, &transparent_icon));
     EXPECT_FALSE(image_util::IsIconSufficientlyVisible(transparent_icon));
   }
   {
     // Test with an icon that has one opaque pixel.
     icon_path = test_dir.AppendASCII("one_pixel_opaque_icon.png");
     SkBitmap visible_icon;
-    ASSERT_TRUE(LoadPngFromFile(icon_path, &visible_icon));
+    ASSERT_TRUE(image_util::LoadPngFromFile(icon_path, &visible_icon));
     EXPECT_FALSE(image_util::IsIconSufficientlyVisible(visible_icon));
   }
   {
     // Test with an icon that has one transparent pixel.
     icon_path = test_dir.AppendASCII("one_pixel_transparent_icon.png");
     SkBitmap visible_icon;
-    ASSERT_TRUE(LoadPngFromFile(icon_path, &visible_icon));
+    ASSERT_TRUE(image_util::LoadPngFromFile(icon_path, &visible_icon));
     EXPECT_TRUE(image_util::IsIconSufficientlyVisible(visible_icon));
   }
   {
     // Test with an icon that is completely opaque.
     icon_path = test_dir.AppendASCII("opaque_icon.png");
     SkBitmap visible_icon;
-    ASSERT_TRUE(LoadPngFromFile(icon_path, &visible_icon));
+    ASSERT_TRUE(image_util::LoadPngFromFile(icon_path, &visible_icon));
     EXPECT_TRUE(image_util::IsIconSufficientlyVisible(visible_icon));
   }
   {
     // Test with an icon that is rectangular.
     icon_path = test_dir.AppendASCII("rectangle.png");
     SkBitmap visible_icon;
-    ASSERT_TRUE(LoadPngFromFile(icon_path, &visible_icon));
+    ASSERT_TRUE(image_util::LoadPngFromFile(icon_path, &visible_icon));
     EXPECT_TRUE(image_util::IsIconSufficientlyVisible(visible_icon));
   }
 }
diff --git a/extensions/strings/extensions_strings.grd b/extensions/strings/extensions_strings.grd
index 1e94b8e..cae80a8 100644
--- a/extensions/strings/extensions_strings.grd
+++ b/extensions/strings/extensions_strings.grd
@@ -178,6 +178,9 @@
       <message name="IDS_EXTENSION_LOAD_ICON_FAILED" desc="">
         Could not load extension icon '<ph name="ICON">$1<ex>icon.png</ex></ph>'.
       </message>
+      <message name="IDS_EXTENSION_LOAD_ICON_NOT_SUFFICIENTLY_VISIBLE" desc="">
+        The icon is not sufficiently visible '<ph name="ICON">$1<ex>icon.png</ex></ph>'.
+      </message>
       <message name="IDS_EXTENSION_LOAD_JAVASCRIPT_FAILED" desc="">
         Could not load javascript '<ph name="RELATIVE_PATH">$1<ex>javas.js</ex></ph>' for content script.
       </message>
diff --git a/extensions/test/data/file_util/invisible_icon.crx b/extensions/test/data/file_util/invisible_icon.crx
new file mode 100644
index 0000000..3a08a2e5
--- /dev/null
+++ b/extensions/test/data/file_util/invisible_icon.crx
Binary files differ
diff --git a/extensions/test/data/file_util/invisible_icon.pem b/extensions/test/data/file_util/invisible_icon.pem
new file mode 100644
index 0000000..d901bc0
--- /dev/null
+++ b/extensions/test/data/file_util/invisible_icon.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDH8LsktuebYQ4C
+0HPVgBNE7/vIaQq7+2RVaHUNJ4VWn/AEHam3Hn9kydaI/+/r4WBK+8Hkp6Fo62O9
+LESlsXWLNJxx1+qNThWmeiWxf1EIU0CzVbacWq9cGVu1wQ6MikC5XAzkoe7klKQ4
+3b02VgOls13XVaOSevvRl8TGmD8RA6sv6tBSjE+MrvQUuR0FQP305pYeOVeR/qrz
+3/x19nnIhfGZ5/BJ0HGBwOs5CQRNXLsz0l+rluFbYEb9FHEi3wXabWB25ef689q+
+5tD+e9regbZF3vz19wNs2lYsQ1cZC3VKP+o4isiSO7THBeCkdwqoXBjPS4Hce6RT
+m2eutja1AgMBAAECggEAEMjlEQs4zMq8SCCzRLZch8JExxmIYOkVDnV3NBw//Zpu
+Jg5Ob9TD2ZR3KeegftMcCBdz+svWyU3PgPNNLQLFjSLkykrXwjaOqzvgW7MGPLZu
+fU+iBaS4SXlIgWzcWZCGp/jyDSSJ/076LVryFjRo2HmDFH94PKUN7FW7G3fu/XDF
+GVUU/P92oVXEdtP2S1k1Zt0AZOb+jjz65E2uiI/xBVGwGXbLnZPxs/6Tl46GYAHy
+R7xTqHn2IAbO6B8iJuI+HF5L5XsjGX/dyLxxLWVGLIdOM4+Sqt+OAUaHqkTtbnd5
+JPt5jTS4gJF6flk+iev9skiH4/bnn2xHueM5qVoCaQKBgQDwWh4g8xnISqsaqynj
+1iuvWmqhPir442VmJyciu/Qs3wD4Y312mJhrdSeOQ9q+vikNUkUiwAPXJuZF+MCB
+onBA8BhnpeCRJinQEdqHLmmlVp0xS4CkQeeOqE2vqwZC64tOPbNZbJpFZx8in0ln
+F/iXtUGpplP4ZIDyuFzkEChrDQKBgQDU9RU/DkbjZd8lW4iuHNTZtxH1mdW+d1eG
+ykyO2PD/sa9AGE3JF1DhlWvLQJ/wCNdfTjsO4yWSYKMj4h1Fx8Ti1FPF6SJBFVoi
+SRbyqCNyCp8YvgdevkN1tM8Naq21Y1pFe20TDP/8Wwz680YDVHg7Tzku0erpV2mO
+yDTqN0JwSQKBgG086BidpIgtt5qFVKKignROKcxjDvDTmRBWlyjoN8/1AuHhhfJS
+5GNiebnlCRRMJShSze0/S/+LRHlk10mT5GT/OnhRIcGWkMZqduGdrJJizUrMQAln
+krB5ueUvW8cqesPyswLfozYL6lC4CIp8kJWS4ecTG3L3asvmEwHsfhI5AoGBAJGm
+GeTph9RJPWhYhU/ICk/pZNAcadL93pAi1l+wwouu5BSrSrApUTkoL/Rwe7L46QyW
+/c99zZminJGTOcAbFG6rF6y5eaMXznC6moZWNv/tgcizV2kWKh9cDWy4tJvlmr0A
+4KXx8zaOs38DWbQ3VpAB7DM4gTkcfuaXyZETQE55AoGBAKkEY2tV2BKMdWl2fsKy
+Vg1Hw5qbru9EuRGSaBEuy9dPoFUFMFq6BsmNxn+IlsGJhSK4rWybyCjGjBEuC3V7
+ufWwe3GIybmYQrza6lc9+7K9RZxGxJwEOksMjiGnSy7M4havfwK+d4g1jzT1ncuL
+VFVcVjvQTxawO2K1Rl5LJTV5
+-----END PRIVATE KEY-----
diff --git a/extensions/test/data/file_util/invisible_icon/README b/extensions/test/data/file_util/invisible_icon/README
new file mode 100644
index 0000000..d52000c
--- /dev/null
+++ b/extensions/test/data/file_util/invisible_icon/README
@@ -0,0 +1,2 @@
+The file invisible_icon.png is an image with a single visible pixel. It is
+considered "invisible" by our icon analysis code.
diff --git a/extensions/test/data/file_util/invisible_icon/invisible_icon.png b/extensions/test/data/file_util/invisible_icon/invisible_icon.png
new file mode 100644
index 0000000..3729d818
--- /dev/null
+++ b/extensions/test/data/file_util/invisible_icon/invisible_icon.png
Binary files differ
diff --git a/extensions/test/data/file_util/invisible_icon/manifest.json b/extensions/test/data/file_util/invisible_icon/manifest.json
new file mode 100644
index 0000000..2696def
--- /dev/null
+++ b/extensions/test/data/file_util/invisible_icon/manifest.json
@@ -0,0 +1,8 @@
+{
+  "name": "My extension with an invisible icon",
+  "version": "1.0",
+  "icons": {
+    "16": "invisible_icon.png"
+  },
+  "manifest_version": 2
+}
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 435f717..5562bf5 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -441,9 +441,15 @@
 }
 
 builder_mixins {
-  name: "ios-ci"
-  mixins: "mac-ci"
+  name: "ios"
+  mixins: "mac"
   mixins: "xcode-caches"
+}
+
+builder_mixins {
+  name: "ios-ci"
+  mixins: "ios"
+  mixins: "mac-ci"
   # ios bots may run both on Mac Minis with cores:4 and VMs with cores:8.
   dimensions: "cores:"
   recipe {
@@ -453,8 +459,8 @@
 
 builder_mixins {
   name: "ios-try"
+  mixins: "ios"
   mixins: "mac-try"
-  mixins: "xcode-caches"
   recipe {
     name: "ios/try"
   }
@@ -1657,12 +1663,18 @@
     builders {
       name: "ToTiOS"
       mixins: "clang-ci"
-      mixins: "mac"
+      mixins: "ios"
+      recipe {
+        name: "ios/unified_builder_tester"
+      }
     }
     builders {
       name: "ToTiOSDevice"
       mixins: "clang-ci"
-      mixins: "mac"
+      mixins: "ios"
+      recipe {
+        name: "ios/unified_builder_tester"
+      }
     }
     builders {
       name: "UBSanVptr Linux"
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index bdc5708..878d0e3 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -2058,13 +2058,11 @@
   }
   builders {
     name: "buildbot/chromium.clang/ToTiOS"
-    name: "buildbucket/luci.chromium.ci/ToTiOS"
     category: "iOS"
     short_name: "sim"
   }
   builders {
     name: "buildbot/chromium.clang/ToTiOSDevice"
-    name: "buildbucket/luci.chromium.ci/ToTiOSDevice"
     category: "iOS"
     short_name: "dev"
   }
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index a4c6b245..fe7f78e7 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -221,7 +221,7 @@
     "//ios/chrome/browser/ui/tab_grid",
     "//ios/chrome/browser/ui/tab_grid:tab_grid_ui",
     "//ios/chrome/browser/ui/tabs",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
+    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/webui:webui_internal",
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index 73ad9a7..68816ed 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -200,20 +200,16 @@
         std::max(CGRectGetWidth(screenBounds), CGRectGetHeight(screenBounds));
     _incognitoBlocker = [[UIView alloc]
         initWithFrame:CGRectMake(0, 0, maxDimension, maxDimension)];
-    if (IsUIRefreshPhase1Enabled()) {
-      NSBundle* mainBundle = base::mac::FrameworkBundle();
-      NSArray* topObjects =
-          [mainBundle loadNibNamed:@"LaunchScreen" owner:self options:nil];
-      UIViewController* launchScreenController =
-          base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
-      [_incognitoBlocker addSubview:[launchScreenController view]];
-      [launchScreenController view].autoresizingMask =
-          UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-      _incognitoBlocker.autoresizingMask =
-          UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-    } else {
-      InstallBackgroundInView(_incognitoBlocker);
-    }
+    NSBundle* mainBundle = base::mac::FrameworkBundle();
+    NSArray* topObjects =
+        [mainBundle loadNibNamed:@"LaunchScreen" owner:self options:nil];
+    UIViewController* launchScreenController =
+        base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
+    [_incognitoBlocker addSubview:[launchScreenController view]];
+    [launchScreenController view].autoresizingMask =
+        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+    _incognitoBlocker.autoresizingMask =
+        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
     [_window addSubview:_incognitoBlocker];
   }
 
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index a9ad838..a3ab8c0a 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -120,7 +120,6 @@
 #import "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h"
 #include "ios/chrome/browser/ui/history/history_coordinator.h"
 #import "ios/chrome/browser/ui/main/browser_view_wrangler.h"
-#import "ios/chrome/browser/ui/main/main_coordinator.h"
 #import "ios/chrome/browser/ui/main/tab_switcher.h"
 #import "ios/chrome/browser/ui/main/view_controller_swapping.h"
 #import "ios/chrome/browser/ui/orientation_limiting_navigation_controller.h"
@@ -399,15 +398,10 @@
   StartupTasks* _startupTasks;
 }
 
-// Pointer to the object that manages view controllers, provided by the main
-// coordinator.
-@property(weak, nonatomic, readonly) id<ViewControllerSwapping>
-    viewControllerSwapper;
-
 // The main coordinator, lazily created the first time it is accessed. Manages
 // the main view controller. This property should not be accessed before the
 // browser has started up to the FOREGROUND stage.
-@property(nonatomic, readonly) MainCoordinator* mainCoordinator;
+@property(nonatomic, readonly) TabGridCoordinator* mainCoordinator;
 
 // A property to track whether the QR Scanner should be started upon tab
 // switcher dismissal. It can only be YES if the QR Scanner experiment is
@@ -901,11 +895,7 @@
   return _browserViewWrangler;
 }
 
-- (id<ViewControllerSwapping>)viewControllerSwapper {
-  return self.mainCoordinator.viewControllerSwapper;
-}
-
-- (MainCoordinator*)mainCoordinator {
+- (TabGridCoordinator*)mainCoordinator {
   if (_browserInitializationStage == INITIALIZATION_STAGE_BASIC) {
     NOTREACHED() << "mainCoordinator accessed too early in initialization.";
     return nil;
@@ -1271,9 +1261,7 @@
 
   // Lazy init of mainCoordinator.
   [self.mainCoordinator start];
-  TabGridCoordinator* tabGridCoordinator =
-      base::mac::ObjCCastStrict<TabGridCoordinator>(self.mainCoordinator);
-  _tabSwitcher = tabGridCoordinator.tabSwitcher;
+  _tabSwitcher = self.mainCoordinator.tabSwitcher;
   // Call -restoreInternalState so that the grid shows the correct panel.
   [_tabSwitcher restoreInternalStateWithMainTabModel:self.mainTabModel
                                          otrTabModel:self.otrTabModel
@@ -1437,13 +1425,7 @@
 }
 
 - (void)prepareTabSwitcher {
-  if ([self.viewControllerSwapper
-          respondsToSelector:(@selector(prepareToShowTabSwitcher:))]) {
-    [self.viewControllerSwapper prepareToShowTabSwitcher:_tabSwitcher];
-  } else {
-    NOTREACHED() << "Grid view controller swapper doesn't implement "
-                 << "-prepareToShowTabSwitcher: as expected.";
-  }
+  [self.mainCoordinator prepareToShowTabSwitcher:_tabSwitcher];
 }
 
 - (void)displayTabSwitcher {
@@ -1599,7 +1581,7 @@
 - (void)showAccountsSettingsFromViewController:
     (UIViewController*)baseViewController {
   if (!baseViewController) {
-    DCHECK_EQ(self.currentBVC, self.viewControllerSwapper.activeViewController);
+    DCHECK_EQ(self.currentBVC, self.mainCoordinator.activeViewController);
     baseViewController = self.currentBVC;
   }
   DCHECK(![baseViewController presentedViewController]);
@@ -1624,7 +1606,7 @@
 - (void)showGoogleServicesSettingsFromViewController:
     (UIViewController*)baseViewController {
   if (!baseViewController) {
-    DCHECK_EQ(self.currentBVC, self.viewControllerSwapper.activeViewController);
+    DCHECK_EQ(self.currentBVC, self.mainCoordinator.activeViewController);
     baseViewController = self.currentBVC;
   }
   DCHECK(![baseViewController presentedViewController]);
@@ -1892,8 +1874,8 @@
       [weakCurrentBVC.dispatcher focusOmnibox];
     };
   }
-  [self.viewControllerSwapper showTabViewController:self.currentBVC
-                                         completion:completion];
+  [self.mainCoordinator showTabViewController:self.currentBVC
+                                   completion:completion];
   [self.currentBVC.dispatcher
       setIncognitoContentVisible:(self.currentBVC == self.otrBVC)];
 }
@@ -1999,7 +1981,7 @@
   _tabSwitcherIsActive = YES;
   [_tabSwitcher setDelegate:self];
 
-  [self.viewControllerSwapper
+  [self.mainCoordinator
       showTabSwitcher:_tabSwitcher
            completion:^{
              // Snapshotting may have been paused if the user initiated showing
@@ -2080,13 +2062,6 @@
   [self finishDismissingTabSwitcher];
 }
 
-- (id<ToolbarOwner>)tabSwitcherTransitionToolbarOwner {
-  // Request the view to ensure that the view has been loaded and initialized,
-  // since it may never have been loaded (or have been swapped out).
-  [self.currentBVC loadViewIfNeeded];
-  return self.currentBVC;
-}
-
 #pragma mark - TabSwitcherDelegate helper methods
 
 - (void)beginDismissingTabSwitcherWithCurrentModel:(TabModel*)tabModel
@@ -2107,7 +2082,7 @@
   // The tab switcher dismissal animation runs
   // as part of the BVC presentation process.  The BVC is presented before the
   // animations begin, so it should be the current active VC at this point.
-  DCHECK_EQ(self.viewControllerSwapper.activeViewController, self.currentBVC);
+  DCHECK_EQ(self.mainCoordinator.activeViewController, self.currentBVC);
 
   if (_modeToDisplayOnTabSwitcherDismissal ==
       TabSwitcherDismissalMode::NORMAL) {
@@ -2425,9 +2400,7 @@
     // History coordinator can be started on top of the tab grid. This is not
     // true of the other tab switchers.
     DCHECK(self.mainCoordinator);
-    TabGridCoordinator* tabGridCoordinator =
-        base::mac::ObjCCastStrict<TabGridCoordinator>(self.mainCoordinator);
-    [tabGridCoordinator stopChildCoordinatorsWithCompletion:completion];
+    [self.mainCoordinator stopChildCoordinatorsWithCompletion:completion];
   };
 
   // As a top level rule, if the settings are showing, they need to be
@@ -2599,7 +2572,7 @@
 }
 
 - (UIImage*)currentPageScreenshot {
-  UIView* lastView = self.viewControllerSwapper.activeViewController.view;
+  UIView* lastView = self.mainCoordinator.activeViewController.view;
   DCHECK(lastView);
   CGFloat scale = 0.0;
   // For screenshots of the tab switcher we need to use a scale of 1.0 to avoid
@@ -2660,7 +2633,7 @@
   // TODO(crbug.com/754642): Implement TopPresentedViewControllerFrom()
   // privately.
   return top_view_controller::TopPresentedViewControllerFrom(
-      self.viewControllerSwapper.viewController);
+      self.mainCoordinator.viewController);
 }
 
 - (void)setTabSwitcherActive:(BOOL)active {
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_back.png
deleted file mode 100644
index 91ebc53..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_disabled.png
deleted file mode 100644
index d2befe7..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_pressed.png
deleted file mode 100644
index 89cda799..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_background.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_background.png
deleted file mode 100644
index 7b1511c6..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward.png
deleted file mode 100644
index 86e75f9..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_disabled.png
deleted file mode 100644
index 699b1ee..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_pressed.png
deleted file mode 100644
index 7a658f8d0..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview.png
deleted file mode 100644
index c2e0c70..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_disabled.png
deleted file mode 100644
index 4b94e330..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_pressed.png
deleted file mode 100644
index 27f6e411..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload.png
deleted file mode 100644
index 307bc012b..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_disabled.png
deleted file mode 100644
index 021b247..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_pressed.png
deleted file mode 100644
index 38e827893..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_share.png
deleted file mode 100644
index 72879c5..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_disabled.png
deleted file mode 100644
index 3947e61f..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_pressed.png
deleted file mode 100644
index 584e02d..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_star.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_star.png
deleted file mode 100644
index c4c308c..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_star_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_star_pressed.png
deleted file mode 100644
index 8019a9d..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_star_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop.png
deleted file mode 100644
index 2c59f87..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_disabled.png
deleted file mode 100644
index 894d3ac..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_pressed.png
deleted file mode 100644
index 02ad955..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools.png
deleted file mode 100644
index ff90580..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools_pressed.png
deleted file mode 100644
index 88cffd52..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice.png
deleted file mode 100644
index c7c9811f..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice_pressed.png
deleted file mode 100644
index 1a3a442..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_dark_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_back.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_back.png
deleted file mode 100644
index f72e2cd..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_back_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_back_disabled.png
deleted file mode 100644
index 51d8ffe..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_back_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_back_pressed.png
deleted file mode 100644
index 8d25164..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_background.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_background.png
deleted file mode 100644
index 2ae1f7d5..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp.png
deleted file mode 100644
index 5f2bc61a..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp_pressed.png
deleted file mode 100644
index 2e0ec50..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_callingapp_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_forward.png
deleted file mode 100644
index 8f985571..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_disabled.png
deleted file mode 100644
index c1cc215..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_pressed.png
deleted file mode 100644
index 447419b1..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_overview.png
deleted file mode 100644
index 2b10f11..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_disabled.png
deleted file mode 100644
index a3fac17e..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_pressed.png
deleted file mode 100644
index 802a519..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_reload.png
deleted file mode 100644
index 537d4b8..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_disabled.png
deleted file mode 100644
index 2df20306..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_pressed.png
deleted file mode 100644
index a19d68d..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_share.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_share.png
deleted file mode 100644
index 1bfcae30..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_share_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_share_disabled.png
deleted file mode 100644
index 8fb2075..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_share_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_share_pressed.png
deleted file mode 100644
index 4b2f64b..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_star.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_star.png
deleted file mode 100644
index 6b67b37..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_star_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_star_pressed.png
deleted file mode 100644
index 2874ec0..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_star_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_stop.png
deleted file mode 100644
index 408b7c2e..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_disabled.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_disabled.png
deleted file mode 100644
index 81e1471..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_pressed.png
deleted file mode 100644
index 0021bfb..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_tools.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_tools.png
deleted file mode 100644
index 7216a46c5..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_tools_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_tools_pressed.png
deleted file mode 100644
index 9f51db1..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_voice.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_voice.png
deleted file mode 100644
index 394b2ce0..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_light_voice_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_light_voice_pressed.png
deleted file mode 100644
index 04e50c3..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_light_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_shadow.png b/ios/chrome/app/theme/default_100_percent/toolbar_shadow.png
deleted file mode 100644
index b68b0e9..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_shadow.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_shadow_full_bleed.png b/ios/chrome/app/theme/default_100_percent/toolbar_shadow_full_bleed.png
deleted file mode 100644
index 6ebc4fa0..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_shadow_full_bleed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_tts.png b/ios/chrome/app/theme/default_100_percent/toolbar_tts.png
deleted file mode 100644
index 27d12b7..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_tts.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_100_percent/toolbar_tts_pressed.png b/ios/chrome/app/theme/default_100_percent/toolbar_tts_pressed.png
deleted file mode 100644
index b64a0436..0000000
--- a/ios/chrome/app/theme/default_100_percent/toolbar_tts_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_back.png
deleted file mode 100644
index 3dd2ca9..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_disabled.png
deleted file mode 100644
index c930e7bd6..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_pressed.png
deleted file mode 100644
index 33296f3..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_background.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_background.png
deleted file mode 100644
index ec0400ae..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward.png
deleted file mode 100644
index c49762d3..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_disabled.png
deleted file mode 100644
index 9d9713d..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_pressed.png
deleted file mode 100644
index 17b7a29..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview.png
deleted file mode 100644
index 7faeae5..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_disabled.png
deleted file mode 100644
index f822586..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_pressed.png
deleted file mode 100644
index e320241a..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload.png
deleted file mode 100644
index 0aa086e..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_disabled.png
deleted file mode 100644
index 49640155..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_pressed.png
deleted file mode 100644
index 5ad4e40b..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_share.png
deleted file mode 100644
index bf07529..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_disabled.png
deleted file mode 100644
index 2e07d8d..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_pressed.png
deleted file mode 100644
index 56da23ed..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_star.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_star.png
deleted file mode 100644
index f57658a..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_star_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_star_pressed.png
deleted file mode 100644
index 14f620d6..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_star_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop.png
deleted file mode 100644
index 84875db7..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_disabled.png
deleted file mode 100644
index d6e3b0a..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_pressed.png
deleted file mode 100644
index e2e7db0b..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools.png
deleted file mode 100644
index 71ba4df..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools_pressed.png
deleted file mode 100644
index a9a2321..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice.png
deleted file mode 100644
index 5dfcf18..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice_pressed.png
deleted file mode 100644
index d723ee81..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_dark_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_back.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_back.png
deleted file mode 100644
index be0201a..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_back_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_back_disabled.png
deleted file mode 100644
index 7b42022..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_back_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_back_pressed.png
deleted file mode 100644
index bb9f4e3..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_background.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_background.png
deleted file mode 100644
index ef3ed8d..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp.png
deleted file mode 100644
index 1d65dfa..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp_pressed.png
deleted file mode 100644
index 660fd8e..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_callingapp_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_forward.png
deleted file mode 100644
index f96259cc..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_disabled.png
deleted file mode 100644
index 31f94ab..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_pressed.png
deleted file mode 100644
index 688f517..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_overview.png
deleted file mode 100644
index 877f9b9..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_disabled.png
deleted file mode 100644
index 9024ae18a..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_pressed.png
deleted file mode 100644
index 28ec900..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_reload.png
deleted file mode 100644
index d4da3112..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_disabled.png
deleted file mode 100644
index 6ac034a28..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_pressed.png
deleted file mode 100644
index 3428116..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_share.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_share.png
deleted file mode 100644
index 6ab0eea..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_share_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_share_disabled.png
deleted file mode 100644
index a3f54d4..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_share_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_share_pressed.png
deleted file mode 100644
index 524c4a70..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_star.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_star.png
deleted file mode 100644
index 8d329442..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_star_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_star_pressed.png
deleted file mode 100644
index bfe4293..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_star_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_stop.png
deleted file mode 100644
index 76e08d3..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_disabled.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_disabled.png
deleted file mode 100644
index 46b9c9e..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_pressed.png
deleted file mode 100644
index 7650bffb..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_tools.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_tools.png
deleted file mode 100644
index 7dd4c82..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_tools_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_tools_pressed.png
deleted file mode 100644
index 19a523b..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_voice.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_voice.png
deleted file mode 100644
index b3d04db..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_light_voice_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_light_voice_pressed.png
deleted file mode 100644
index a1ad62e..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_light_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_shadow.png b/ios/chrome/app/theme/default_200_percent/toolbar_shadow.png
deleted file mode 100644
index a3c6f25..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_shadow.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_shadow_full_bleed.png b/ios/chrome/app/theme/default_200_percent/toolbar_shadow_full_bleed.png
deleted file mode 100644
index 5c74f12..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_shadow_full_bleed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_tts.png b/ios/chrome/app/theme/default_200_percent/toolbar_tts.png
deleted file mode 100644
index 3f418669..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_tts.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_200_percent/toolbar_tts_pressed.png b/ios/chrome/app/theme/default_200_percent/toolbar_tts_pressed.png
deleted file mode 100644
index 78e6d8e..0000000
--- a/ios/chrome/app/theme/default_200_percent/toolbar_tts_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_back.png
deleted file mode 100644
index 7ef5d0de..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_disabled.png
deleted file mode 100644
index dfdbbba..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_pressed.png
deleted file mode 100644
index 76e9bb9d..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_background.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_background.png
deleted file mode 100644
index 7fd0060..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward.png
deleted file mode 100644
index 7118c45..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_disabled.png
deleted file mode 100644
index 61b571b..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_pressed.png
deleted file mode 100644
index 3fe9ff7..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview.png
deleted file mode 100644
index 2b5d20a..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_disabled.png
deleted file mode 100644
index 1af6b8a..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_pressed.png
deleted file mode 100644
index 28e06c1..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload.png
deleted file mode 100644
index 8a03911..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_disabled.png
deleted file mode 100644
index cc65ef4..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_pressed.png
deleted file mode 100644
index 06a28b6..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_share.png
deleted file mode 100644
index 33e3c88..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_disabled.png
deleted file mode 100644
index eb7341b..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_pressed.png
deleted file mode 100644
index 34750f51..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_star.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_star.png
deleted file mode 100644
index 67aed7f..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_star_filled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_star_filled.png
deleted file mode 100644
index c102af7..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_star_filled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop.png
deleted file mode 100644
index 85b41f0..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_disabled.png
deleted file mode 100644
index c3cbc08..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_pressed.png
deleted file mode 100644
index 98e5fbb..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools.png
deleted file mode 100644
index 9d00d1e..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools_pressed.png
deleted file mode 100644
index 56f5113..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice.png
deleted file mode 100644
index e0b95c4..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice_pressed.png
deleted file mode 100644
index bfc06eb..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_dark_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_back.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_back.png
deleted file mode 100644
index 4e7d220..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_back.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_back_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_back_disabled.png
deleted file mode 100644
index bc49843..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_back_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_back_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_back_pressed.png
deleted file mode 100644
index 46b3c7a..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_back_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_background.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_background.png
deleted file mode 100644
index e4ab416..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp.png
deleted file mode 100644
index 17e1b6cd..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp_pressed.png
deleted file mode 100644
index d57578c..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_callingapp_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_forward.png
deleted file mode 100644
index 3020d953..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_disabled.png
deleted file mode 100644
index 5f33630..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_pressed.png
deleted file mode 100644
index c755240..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_forward_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_overview.png
deleted file mode 100644
index 624e855..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_disabled.png
deleted file mode 100644
index 06ecb87..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_pressed.png
deleted file mode 100644
index cced2fe..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_overview_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_reload.png
deleted file mode 100644
index 5c72e18..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_disabled.png
deleted file mode 100644
index 292f775..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_pressed.png
deleted file mode 100644
index 1a7732b..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_reload_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_share.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_share.png
deleted file mode 100644
index 5cf2465..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_share.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_share_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_share_disabled.png
deleted file mode 100644
index 655f57bc..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_share_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_share_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_share_pressed.png
deleted file mode 100644
index 5e116d3b..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_share_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_star.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_star.png
deleted file mode 100644
index c643f75..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_star.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_star_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_star_pressed.png
deleted file mode 100644
index 4f7cd26..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_star_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_stop.png
deleted file mode 100644
index 0994cc5..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_disabled.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_disabled.png
deleted file mode 100644
index bbffe38..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_disabled.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_pressed.png
deleted file mode 100644
index 682a6b6b..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_stop_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_tools.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_tools.png
deleted file mode 100644
index d07e10c..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_tools.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_tools_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_tools_pressed.png
deleted file mode 100644
index 242e1c5..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_tools_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_voice.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_voice.png
deleted file mode 100644
index ee430225..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_voice.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_light_voice_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_light_voice_pressed.png
deleted file mode 100644
index dac58bd..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_light_voice_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_shadow.png b/ios/chrome/app/theme/default_300_percent/toolbar_shadow.png
deleted file mode 100644
index 2bc61cba..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_shadow.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_shadow_full_bleed.png b/ios/chrome/app/theme/default_300_percent/toolbar_shadow_full_bleed.png
deleted file mode 100644
index 5a61a31..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_shadow_full_bleed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_tts.png b/ios/chrome/app/theme/default_300_percent/toolbar_tts.png
deleted file mode 100644
index 0eeb37f..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_tts.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/default_300_percent/toolbar_tts_pressed.png b/ios/chrome/app/theme/default_300_percent/toolbar_tts_pressed.png
deleted file mode 100644
index ac47fdf6..0000000
--- a/ios/chrome/app/theme/default_300_percent/toolbar_tts_pressed.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/app/theme/ios_theme_resources.grd b/ios/chrome/app/theme/ios_theme_resources.grd
index 16ab7d85..92945496 100644
--- a/ios/chrome/app/theme/ios_theme_resources.grd
+++ b/ios/chrome/app/theme/ios_theme_resources.grd
@@ -25,13 +25,6 @@
       <!-- KEEP THESE IN ALPHABETICAL ORDER!  DO NOT ADD TO RANDOM PLACES JUST
            BECAUSE YOUR RESOURCES ARE FUNCTIONALLY RELATED OR FALL UNDER THE
            SAME CONDITIONALS. -->
-      <!-- The toolbar button images are mapped from name/style/state
-           combinations to the appropriate resource ID using a 3-dimensional
-           array built with macros. For example, 'IDR_IOS_TOOLBAR_DARK_BACK' and
-           its variations do not appear in code.  Instead, a macro call is used,
-           TOOLBAR_IDR_THREE_STATE(BACK), to add its variations to the array.
-           The easiest way to find the use of a given resource ID:
-           'git grep TOOLBAR_IDR_.*BACK' -->
       <structure type="chrome_scaled_image" name="IDR_IOS_CHECKMARK" file="checkmark.png" />
       <structure type="chrome_scaled_image" name="IDR_IOS_CONTROLLED_SETTING_MANDATORY" file="controlled_setting_mandatory.png" />
       <structure type="chrome_scaled_image" name="IDR_IOS_ERROR" file="error.png" />
@@ -68,64 +61,6 @@
       <structure type="chrome_scaled_image" name="IDR_IOS_PAYMENTS_WARNING" file="payments_warning.png" />
       <structure type="chrome_scaled_image" name="IDR_IOS_PROMO_INFO" file="promo_info.png" />
       <structure type="chrome_scaled_image" name="IDR_IOS_SETTINGS_INFO_24" file="settings_info_24.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_BACK" file="toolbar_dark_back.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_BACK_DISABLED" file="toolbar_dark_back_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_BACK_PRESSED" file="toolbar_dark_back_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_BACKGROUND" file="toolbar_dark_background.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_FORWARD" file="toolbar_dark_forward.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_FORWARD_DISABLED" file="toolbar_dark_forward_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_FORWARD_PRESSED" file="toolbar_dark_forward_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_OVERVIEW" file="toolbar_dark_overview.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_OVERVIEW_DISABLED" file="toolbar_dark_overview_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_OVERVIEW_PRESSED" file="toolbar_dark_overview_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_RELOAD" file="toolbar_dark_reload.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_RELOAD_DISABLED" file="toolbar_dark_reload_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_RELOAD_PRESSED" file="toolbar_dark_reload_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_SHARE" file="toolbar_dark_share.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_SHARE_DISABLED" file="toolbar_dark_share_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_SHARE_PRESSED" file="toolbar_dark_share_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_STAR" file="toolbar_dark_star.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_STAR_PRESSED" file="toolbar_dark_star_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_STOP" file="toolbar_dark_stop.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_STOP_DISABLED" file="toolbar_dark_stop_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_STOP_PRESSED" file="toolbar_dark_stop_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_TOOLS" file="toolbar_dark_tools.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_TOOLS_PRESSED" file="toolbar_dark_tools_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_TTS" file="toolbar_tts.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_TTS_PRESSED" file="toolbar_tts_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_VOICE" file="toolbar_dark_voice.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_DARK_VOICE_PRESSED" file="toolbar_dark_voice_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_BACK" file="toolbar_light_back.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_BACK_DISABLED" file="toolbar_light_back_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_BACK_PRESSED" file="toolbar_light_back_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_BACKGROUND" file="toolbar_light_background.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_CALLINGAPP" file="toolbar_light_callingapp.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_CALLINGAPP_PRESSED" file="toolbar_light_callingapp_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_FORWARD" file="toolbar_light_forward.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_FORWARD_DISABLED" file="toolbar_light_forward_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_FORWARD_PRESSED" file="toolbar_light_forward_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_OVERVIEW" file="toolbar_light_overview.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_OVERVIEW_DISABLED" file="toolbar_light_overview_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_OVERVIEW_PRESSED" file="toolbar_light_overview_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_RELOAD" file="toolbar_light_reload.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_RELOAD_DISABLED" file="toolbar_light_reload_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_RELOAD_PRESSED" file="toolbar_light_reload_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_SHARE" file="toolbar_light_share.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_SHARE_DISABLED" file="toolbar_light_share_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_SHARE_PRESSED" file="toolbar_light_share_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_STAR" file="toolbar_light_star.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_STAR_PRESSED" file="toolbar_light_star_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_STOP" file="toolbar_light_stop.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_STOP_DISABLED" file="toolbar_light_stop_disabled.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_STOP_PRESSED" file="toolbar_light_stop_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_TOOLS" file="toolbar_light_tools.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_TOOLS_PRESSED" file="toolbar_light_tools_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_TTS" file="toolbar_tts.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_TTS_PRESSED" file="toolbar_tts_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_VOICE" file="toolbar_light_voice.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_LIGHT_VOICE_PRESSED" file="toolbar_light_voice_pressed.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_SHADOW" file="toolbar_shadow.png" />
-      <structure type="chrome_scaled_image" name="IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED" file="toolbar_shadow_full_bleed.png" />
     </structures>
   </release>
 </grit>
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index 57fddf5..670947f 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -251,11 +251,6 @@
      flag_descriptions::kAutofillIOSDelayBetweenFieldsName,
      flag_descriptions::kAutofillIOSDelayBetweenFieldsDescription,
      flags_ui::kOsIos, MULTI_VALUE_TYPE(kAutofillIOSDelayBetweenFieldsChoices)},
-    {"autofill-ios-iframe-support",
-     flag_descriptions::kAutofillEnableIFrameSupportOniOSName,
-     flag_descriptions::kAutofillEnableIFrameSupportOniOSDescription,
-     flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableIFrameSupportOniOS)},
     {"mailto-handling-google-ui",
      flag_descriptions::kMailtoHandlingWithGoogleUIName,
      flag_descriptions::kMailtoHandlingWithGoogleUIDescription,
diff --git a/ios/chrome/browser/autofill/form_input_accessory_consumer.h b/ios/chrome/browser/autofill/form_input_accessory_consumer.h
index 2aa2e48..9910bd6 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_consumer.h
+++ b/ios/chrome/browser/autofill/form_input_accessory_consumer.h
@@ -11,6 +11,9 @@
 
 @protocol FormInputAccessoryConsumer<NSObject>
 
+// Removes the animations on the custom keyboard view.
+- (void)removeAnimationsOnKeyboardView;
+
 // Restores the keyboard and its default input accessory view, removing (if
 // necessary) any previously-added custom view.
 - (void)restoreKeyboardView;
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
index 12af0ad..5af3cc8 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
@@ -32,9 +32,6 @@
 // Called when the keyboard will or did change frame.
 - (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification;
 
-// Hides the subviews in |accessoryView|.
-- (void)hideSubviewsInOriginalAccessoryView:(UIView*)accessoryView;
-
 @end
 
 @implementation FormInputAccessoryViewController {
@@ -44,10 +41,6 @@
   // The custom view that should be shown in the input accessory view.
   FormInputAccessoryView* _customAccessoryView;
 
-  // The original subviews in keyboard accessory view that were originally not
-  // hidden but were hidden when showing Autofill suggestions.
-  NSMutableArray* _hiddenOriginalSubviews;
-
   // Whether suggestions have previously been shown.
   BOOL _suggestionsHaveBeenShown;
 }
@@ -60,7 +53,6 @@
 - (instancetype)init {
   self = [super init];
   if (self) {
-    _hiddenOriginalSubviews = [[NSMutableArray alloc] init];
     _suggestionsHaveBeenShown = NO;
 
     if (IsIPadIdiom()) {
@@ -93,7 +85,11 @@
   return self;
 }
 
+#pragma mark - Public
+
 - (void)presentView:(UIView*)view {
+  DCHECK(view);
+  DCHECK(!view.superview);
   UIView* keyboardView = [self getKeyboardView];
   view.accessibilityViewIsModal = YES;
   [keyboardView.superview addSubview:view];
@@ -105,17 +101,75 @@
   self.keyboardReplacementView = view;
 }
 
-#pragma mark - Private
+#pragma mark - FormInputAccessoryConsumer
 
-- (void)hideSubviewsInOriginalAccessoryView:(UIView*)accessoryView {
-  for (UIView* subview in [accessoryView subviews]) {
-    if (!subview.hidden) {
-      [_hiddenOriginalSubviews addObject:subview];
-      subview.hidden = YES;
+- (void)showCustomInputAccessoryView:(UIView*)view
+                  navigationDelegate:
+                      (id<FormInputAccessoryViewDelegate>)navigationDelegate {
+  DCHECK(view);
+  if (IsIPadIdiom()) {
+    // On iPad, there's no inputAccessoryView available, so we attach the custom
+    // view directly to the keyboard view instead.
+    [_customAccessoryView removeFromSuperview];
+    [self.grayBackgroundView removeFromSuperview];
+
+    // If the keyboard isn't visible don't show the custom view.
+    if (CGRectIntersection([UIScreen mainScreen].bounds, _keyboardFrame)
+                .size.height == 0 ||
+        CGRectEqualToRect(_keyboardFrame, CGRectZero)) {
+      _customAccessoryView = nil;
+      return;
     }
+
+    // If this is a form suggestion view and no suggestions have been triggered
+    // yet, don't show the custom view.
+    FormSuggestionView* formSuggestionView =
+        base::mac::ObjCCast<FormSuggestionView>(view);
+    if (formSuggestionView) {
+      int numSuggestions = [[formSuggestionView suggestions] count];
+      if (!_suggestionsHaveBeenShown && numSuggestions == 0) {
+        _customAccessoryView = nil;
+        return;
+      }
+    }
+    _suggestionsHaveBeenShown = YES;
+
+    _customAccessoryView = [[FormInputAccessoryView alloc] init];
+    [_customAccessoryView setUpWithCustomView:view];
+    [self addCustomAccessoryViewIfNeeded];
+  } else {
+    // On iPhone, the custom view replaces the default UI of the
+    // inputAccessoryView.
+    [self restoreInputAccessoryView];
+    _customAccessoryView = [[FormInputAccessoryView alloc] init];
+    [_customAccessoryView setUpWithNavigationDelegate:navigationDelegate
+                                           customView:view];
+    [self addCustomAccessoryViewIfNeeded];
   }
 }
 
+- (void)restoreInputAccessoryView {
+  [_customAccessoryView removeFromSuperview];
+  [self.grayBackgroundView removeFromSuperview];
+  _customAccessoryView = nil;
+}
+
+- (void)restoreKeyboardView {
+  [self restoreInputAccessoryView];
+  [self.keyboardReplacementView removeFromSuperview];
+  self.keyboardReplacementView = nil;
+}
+
+- (void)removeAnimationsOnKeyboardView {
+  // Work Around. On focus event, keyboardReplacementView is animated but the
+  // keyboard isn't. Cancel the animation to match the keyboard behavior
+  if (self.keyboardReplacementView.superview) {
+    [self.keyboardReplacementView.layer removeAllAnimations];
+  }
+}
+
+#pragma mark - Private
+
 // This searches in a keyboard view hierarchy for the best candidate to
 // constrain a view to the keyboard.
 - (UIView*)recursiveGetKeyboardConstraintView:(UIView*)view {
@@ -177,15 +231,12 @@
   if (!IsIPadIdiom()) {
     [self addCustomAccessoryViewIfNeeded];
   }
+  if (self.keyboardReplacementView) {
+    [self presentView:self.keyboardReplacementView];
+  }
 }
 
 - (void)keyboardWillOrDidChangeFrame:(NSNotification*)notification {
-  // Work Around. On focus event, keyboardReplacementView is animated but the
-  // keyboard isn't. Cancel the animation to match the keyboard behavior
-  if (!IsIPadIdiom()) {
-    [self.keyboardReplacementView.layer removeAllAnimations];
-  }
-
   CGRect keyboardFrame =
       [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
   UIView* keyboardView = [self getKeyboardView];
@@ -220,53 +271,6 @@
   }
 }
 
-#pragma mark - FormInputAccessoryConsumer
-
-- (void)showCustomInputAccessoryView:(UIView*)view
-                  navigationDelegate:
-                      (id<FormInputAccessoryViewDelegate>)navigationDelegate {
-  DCHECK(view);
-  if (IsIPadIdiom()) {
-    // On iPad, there's no inputAccessoryView available, so we attach the custom
-    // view directly to the keyboard view instead.
-    [_customAccessoryView removeFromSuperview];
-    [self.grayBackgroundView removeFromSuperview];
-
-    // If the keyboard isn't visible don't show the custom view.
-    if (CGRectIntersection([UIScreen mainScreen].bounds, _keyboardFrame)
-                .size.height == 0 ||
-        CGRectEqualToRect(_keyboardFrame, CGRectZero)) {
-      _customAccessoryView = nil;
-      return;
-    }
-
-    // If this is a form suggestion view and no suggestions have been triggered
-    // yet, don't show the custom view.
-    FormSuggestionView* formSuggestionView =
-        base::mac::ObjCCast<FormSuggestionView>(view);
-    if (formSuggestionView) {
-      int numSuggestions = [[formSuggestionView suggestions] count];
-      if (!_suggestionsHaveBeenShown && numSuggestions == 0) {
-        _customAccessoryView = nil;
-        return;
-      }
-    }
-    _suggestionsHaveBeenShown = YES;
-
-    _customAccessoryView = [[FormInputAccessoryView alloc] init];
-    [_customAccessoryView setUpWithCustomView:view];
-    [self addCustomAccessoryViewIfNeeded];
-  } else {
-    // On iPhone, the custom view replaces the default UI of the
-    // inputAccessoryView.
-    [self restoreInputAccessoryView];
-    _customAccessoryView = [[FormInputAccessoryView alloc] init];
-    [_customAccessoryView setUpWithNavigationDelegate:navigationDelegate
-                                           customView:view];
-    [self addCustomAccessoryViewIfNeeded];
-  }
-}
-
 // Adds the customAccessoryView and the backgroundView (on iPads), if those are
 // not already in the hierarchy.
 - (void)addCustomAccessoryViewIfNeeded {
@@ -304,7 +308,6 @@
       UIResponder* firstResponder = GetFirstResponder();
       UIView* inputAccessoryView = firstResponder.inputAccessoryView;
       if (inputAccessoryView) {
-        [self hideSubviewsInOriginalAccessoryView:inputAccessoryView];
         [inputAccessoryView addSubview:_customAccessoryView];
         AddSameConstraints(_customAccessoryView, inputAccessoryView);
       }
@@ -312,21 +315,4 @@
   }
 }
 
-- (void)restoreInputAccessoryView {
-  [_customAccessoryView removeFromSuperview];
-  [self.grayBackgroundView removeFromSuperview];
-
-  _customAccessoryView = nil;
-  for (UIView* subview in _hiddenOriginalSubviews) {
-    subview.hidden = NO;
-  }
-  [_hiddenOriginalSubviews removeAllObjects];
-}
-
-- (void)restoreKeyboardView {
-  [self restoreInputAccessoryView];
-  [self.keyboardReplacementView removeFromSuperview];
-  self.keyboardReplacementView = nil;
-}
-
 @end
diff --git a/ios/chrome/browser/download/browser_download_service.h b/ios/chrome/browser/download/browser_download_service.h
index ad8069c..de30fc76 100644
--- a/ios/chrome/browser/download/browser_download_service.h
+++ b/ios/chrome/browser/download/browser_download_service.h
@@ -34,7 +34,9 @@
   MicrosoftApplication = 4,
   // application/vnd.android.package-archive MIME type (.apk file).
   AndroidPackageArchive = 5,
-  kMaxValue = AndroidPackageArchive,
+  // text/vcard MIME type.
+  VirtualContactFile = 6,
+  kMaxValue = VirtualContactFile,
 };
 
 // Keyed Service which acts as web::DownloadController delegate and routes
diff --git a/ios/chrome/browser/download/browser_download_service.mm b/ios/chrome/browser/download/browser_download_service.mm
index f2e27ee..dbea2869 100644
--- a/ios/chrome/browser/download/browser_download_service.mm
+++ b/ios/chrome/browser/download/browser_download_service.mm
@@ -33,6 +33,9 @@
   if (mime_type == "application/vnd.android.package-archive")
     return DownloadMimeTypeResult::AndroidPackageArchive;
 
+  if (mime_type == "text/vcard")
+    return DownloadMimeTypeResult::VirtualContactFile;
+
   return DownloadMimeTypeResult::Other;
 }
 }  // namespace
diff --git a/ios/chrome/browser/experimental_flags.h b/ios/chrome/browser/experimental_flags.h
index 5ff7de1..f8565e8 100644
--- a/ios/chrome/browser/experimental_flags.h
+++ b/ios/chrome/browser/experimental_flags.h
@@ -62,10 +62,6 @@
 // TODO (crbug.com/884720): Remove all use of this flag.
 bool IsReadingListUIRebootEnabled();
 
-// Whether the Settings UI Reboot is enabled.
-// TODO (crbug.com/884721): Remove all use of this flag.
-bool IsSettingsUIRebootEnabled();
-
 // Whether the application group sandbox must be cleared before starting.
 // Calling this method will reset the flag to false, so the sandbox is cleared
 // only once.
diff --git a/ios/chrome/browser/experimental_flags.mm b/ios/chrome/browser/experimental_flags.mm
index b401cb2..f9200d9 100644
--- a/ios/chrome/browser/experimental_flags.mm
+++ b/ios/chrome/browser/experimental_flags.mm
@@ -134,8 +134,4 @@
   return true;
 }
 
-bool IsSettingsUIRebootEnabled() {
-  return true;
-}
-
 }  // namespace experimental_flags
diff --git a/ios/chrome/browser/feature_engagement/BUILD.gn b/ios/chrome/browser/feature_engagement/BUILD.gn
index 64f79fb6..4628e7b6 100644
--- a/ios/chrome/browser/feature_engagement/BUILD.gn
+++ b/ios/chrome/browser/feature_engagement/BUILD.gn
@@ -45,7 +45,6 @@
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/browser/ui/tab_grid:egtest_support",
     "//ios/chrome/browser/ui/table_view",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
index fd4f788..7ea9178a 100644
--- a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
+++ b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
@@ -18,7 +18,6 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/history/OWNERS b/ios/chrome/browser/history/OWNERS
index 1c26985..b215c963 100644
--- a/ios/chrome/browser/history/OWNERS
+++ b/ios/chrome/browser/history/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 sczs@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index fa622a8a..4e87d19 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -34,11 +34,6 @@
     "When enabled, shows the Google Pay logo animation when showing payments"
     "credit card suggestions in downstream keyboard accessory";
 
-const char kAutofillEnableIFrameSupportOniOSName[] =
-    "Enable iFrame messaging for autofill.";
-const char kAutofillEnableIFrameSupportOniOSDescription[] =
-    "When enabled, autofill is available in secure iframes.";
-
 const char kEnableAutofillCreditCardUploadUpdatePromptExplanationName[] =
     "Enable updated prompt explanation when offering credit card upload";
 const char kEnableAutofillCreditCardUploadUpdatePromptExplanationDescription[] =
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index 6efd1f8..9258ffc 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -24,11 +24,6 @@
 extern const char kAutofillDownstreamUseGooglePayBrandingOniOSName[];
 extern const char kAutofillDownstreamUseGooglePayBrandingOniOSDescription[];
 
-// Title and description for the flag to control the usage of iframe messaging
-// for autofill on iOS.
-extern const char kAutofillEnableIFrameSupportOniOSName[];
-extern const char kAutofillEnableIFrameSupportOniOSDescription[];
-
 // Title and description for the flag to control the updated prompt explanation
 // when offering credit card upload.
 extern const char kEnableAutofillCreditCardUploadUpdatePromptExplanationName[];
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index db649ed..24bbd917 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -205,7 +205,6 @@
     "//ios/chrome/browser/ui/main",
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/browser/ui/tab_grid:egtest_support",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
diff --git a/ios/chrome/browser/metrics/OWNERS b/ios/chrome/browser/metrics/OWNERS
index e2a5d55..56360bb 100644
--- a/ios/chrome/browser/metrics/OWNERS
+++ b/ios/chrome/browser/metrics/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 olivierrobin@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm b/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
index dbec80a..b4ee33e 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/main/browser_view_information.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #include "ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/payments/OWNERS b/ios/chrome/browser/payments/OWNERS
index 2a262cc2..adccd5d 100644
--- a/ios/chrome/browser/payments/OWNERS
+++ b/ios/chrome/browser/payments/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 mahmadi@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
index ce57a45..8c6c598 100644
--- a/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
+++ b/ios/chrome/browser/payments/ios_payment_instrument_launcher.mm
@@ -20,7 +20,7 @@
 #include "ios/web/public/navigation_manager.h"
 #include "ios/web/public/ssl_status.h"
 #include "ios/web/public/web_state/web_state.h"
-#include "net/base/mac/url_conversions.mm"
+#include "net/base/mac/url_conversions.h"
 #include "net/base/url_util.h"
 #include "net/cert/x509_certificate.h"
 #include "net/cert/x509_util.h"
diff --git a/ios/chrome/browser/providers/images/chromium_branded_image_provider.h b/ios/chrome/browser/providers/images/chromium_branded_image_provider.h
index 1883490a..e317d87a 100644
--- a/ios/chrome/browser/providers/images/chromium_branded_image_provider.h
+++ b/ios/chrome/browser/providers/images/chromium_branded_image_provider.h
@@ -18,7 +18,6 @@
   UIImage* GetClearBrowsingDataSiteDataImage() override;
   UIImage* GetSigninConfirmationSyncSettingsImage() override;
   UIImage* GetSigninConfirmationPersonalizeServicesImage() override;
-  NSArray<UIImage*>* GetToolbarVoiceSearchButtonImages(bool incognito) override;
   UIImage* GetWhatsNewIconImage(WhatsNewIcon type) override;
   UIImage* GetDownloadGoogleDriveImage() override;
 
diff --git a/ios/chrome/browser/providers/images/chromium_branded_image_provider.mm b/ios/chrome/browser/providers/images/chromium_branded_image_provider.mm
index 82a0415..c26d7f7 100644
--- a/ios/chrome/browser/providers/images/chromium_branded_image_provider.mm
+++ b/ios/chrome/browser/providers/images/chromium_branded_image_provider.mm
@@ -45,23 +45,6 @@
   return rb.GetNativeImageNamed(IDR_IOS_SETTINGS_INFO_24).ToUIImage();
 }
 
-NSArray<UIImage*>*
-ChromiumBrandedImageProvider::GetToolbarVoiceSearchButtonImages(
-    bool incognito) {
-  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  if (incognito) {
-    return @[
-      rb.GetNativeImageNamed(IDR_IOS_TOOLBAR_DARK_VOICE).ToUIImage(),
-      rb.GetNativeImageNamed(IDR_IOS_TOOLBAR_DARK_VOICE_PRESSED).ToUIImage()
-    ];
-  }
-
-  return @[
-    rb.GetNativeImageNamed(IDR_IOS_TOOLBAR_LIGHT_VOICE).ToUIImage(),
-    rb.GetNativeImageNamed(IDR_IOS_TOOLBAR_LIGHT_VOICE_PRESSED).ToUIImage()
-  ];
-}
-
 UIImage* ChromiumBrandedImageProvider::GetWhatsNewIconImage(WhatsNewIcon type) {
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   return rb.GetNativeImageNamed(IDR_IOS_PROMO_INFO).ToUIImage();
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn
index 8f9528cc..c1ff955 100644
--- a/ios/chrome/browser/tabs/BUILD.gn
+++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -118,7 +118,6 @@
     "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/overscroll_actions",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/voice",
     "//ios/chrome/browser/web",
diff --git a/ios/chrome/browser/ui/BUILD.gn b/ios/chrome/browser/ui/BUILD.gn
index d9f651b..ab58c5c 100644
--- a/ios/chrome/browser/ui/BUILD.gn
+++ b/ios/chrome/browser/ui/BUILD.gn
@@ -141,7 +141,6 @@
     "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/ntp:ntp_controller",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/test",
     "//ios/chrome/browser/web:web_internal",
@@ -398,19 +397,15 @@
     "//ios/chrome/browser/ui/tabs",
     "//ios/chrome/browser/ui/tabs:coordinator",
     "//ios/chrome/browser/ui/tabs/requirements",
+    "//ios/chrome/browser/ui/toolbar",
+    "//ios/chrome/browser/ui/toolbar:toolbar_model_delegate",
     "//ios/chrome/browser/ui/toolbar:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar:toolbar_ui_broadcasting_util",
-    "//ios/chrome/browser/ui/toolbar/adaptive",
-    "//ios/chrome/browser/ui/toolbar/adaptive:adaptive_ui",
     "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
+    "//ios/chrome/browser/ui/toolbar/fullscreen",
+    "//ios/chrome/browser/ui/toolbar/fullscreen:fullscreen_broadcasting_util",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/toolbar_container:feature_flags",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu:configuration",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/translate",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/voice",
@@ -442,14 +437,12 @@
   public_deps = [
     ":external_files",
     "//ios/chrome/browser/ui/side_swipe",
-    "//ios/chrome/browser/ui/toolbar",
   ]
   allow_circular_includes_from = [
     "//ios/chrome/browser/ui/ntp:ntp_internal",
     "//ios/chrome/browser/ui/overscroll_actions",
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/tabs:coordinator",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/web:web_internal",
   ]
   libs = [
@@ -504,7 +497,6 @@
     "//ios/chrome/browser/ui/ntp:ntp_controller",
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/browser/ui/table_view",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/third_party/earl_grey:earl_grey+link",
@@ -540,8 +532,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
     "//ios/chrome/browser/ui/toolbar",
-    "//ios/chrome/browser/ui/toolbar/adaptive",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
+    "//ios/chrome/browser/ui/toolbar:toolbar_model_delegate",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list:test_support",
diff --git a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm
index b236d4e..303df5b 100644
--- a/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm
+++ b/ios/chrome/browser/ui/autofill/cells/autofill_edit_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/rtl_geometry.h"
@@ -171,8 +170,7 @@
 }
 
 - (void)updateForStyle:(CollectionViewCellStyle)cellStyle {
-  if (cellStyle == CollectionViewCellStyle::kUIKit &&
-      experimental_flags::IsSettingsUIRebootEnabled()) {
+  if (cellStyle == CollectionViewCellStyle::kUIKit) {
     self.textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
     self.textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     self.textField.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
index 63f84af..b86d500 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory_mediator.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/browser/autofill/form_suggestion_tab_helper.h"
 #import "ios/chrome/browser/autofill/form_suggestion_view.h"
 #import "ios/chrome/browser/passwords/password_generation_utils.h"
+#import "ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h"
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.h"
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 #include "ios/chrome/browser/ui/ui_util.h"
@@ -31,6 +32,7 @@
 
 @interface FormInputAccessoryMediator ()<FormActivityObserver,
                                          CRWWebStateObserver,
+                                         KeyboardObserverHelperDelegate,
                                          WebStateListObserving>
 
 // The JS manager for interacting with the underlying form.
@@ -46,6 +48,9 @@
 @property(nonatomic, strong)
     FormInputAccessoryViewHandler* formInputAccessoryHandler;
 
+// The observer to determine when the keyboard dissapears and when it stays.
+@property(nonatomic, strong) KeyboardObserverHelper* keyboardObserver;
+
 // Last seen provider. Used to reenable suggestions.
 @property(nonatomic, weak) id<FormInputAccessoryViewProvider> lastProvider;
 
@@ -84,18 +89,6 @@
   BOOL _suggestionsHaveBeenShown;
 }
 
-@synthesize consumer = _consumer;
-@synthesize currentProvider = _currentProvider;
-@synthesize formInputAccessoryHandler = _formInputAccessoryHandler;
-@synthesize JSSuggestionManager = _JSSuggestionManager;
-@synthesize lastProvider = _lastProvider;
-@synthesize lastSuggestionView = _lastSuggestionView;
-@synthesize manualFillAccessoryViewController =
-    _manualFillAccessoryViewController;
-@synthesize providers = _providers;
-@synthesize suggestionsDisabled = _suggestionsDisabled;
-@synthesize webState = _webState;
-
 - (instancetype)initWithConsumer:(id<FormInputAccessoryConsumer>)consumer
                     webStateList:(WebStateList*)webStateList {
   self = [super init];
@@ -131,6 +124,8 @@
                       selector:@selector(handleTextInputDidBeginEditing:)
                           name:UITextFieldTextDidBeginEditingNotification
                         object:nil];
+    _keyboardObserver = [[KeyboardObserverHelper alloc] init];
+    _keyboardObserver.delegate = self;
   }
   return self;
 }
@@ -160,6 +155,16 @@
   }
 }
 
+#pragma mark - KeyboardObserverHelperDelegate
+
+- (void)keyboardDidStayOnScreen {
+  [self.consumer removeAnimationsOnKeyboardView];
+}
+
+- (void)keyboardDidHide {
+  [self reset];
+}
+
 #pragma mark - FormActivityObserver
 
 - (void)webState:(web::WebState*)webState
@@ -277,11 +282,11 @@
 // well as reenables suggestions.
 - (void)reset {
   [self.consumer restoreKeyboardView];
-  self.suggestionsDisabled = NO;
-
-  self.currentProvider = nil;
-
+  [self.manualFillAccessoryViewController reset];
   [self.formInputAccessoryHandler reset];
+
+  self.suggestionsDisabled = NO;
+  self.currentProvider = nil;
 }
 
 // Asynchronously queries the providers for an accessory view. Sends it to
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
index 056cd39b..d9b0f76 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -46,6 +46,8 @@
     "action_cell.mm",
     "credential.h",
     "credential.mm",
+    "keyboard_observer_helper.h",
+    "keyboard_observer_helper.mm",
     "manual_fill_accessory_view_controller.h",
     "manual_fill_accessory_view_controller.mm",
     "manual_fill_content_delegate.h",
@@ -103,3 +105,24 @@
     "//url:url",
   ]
 }
+
+source_set("eg_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "keyboard_observer_egtest.mm",
+  ]
+  deps = [
+    ":manual_fill",
+    ":manual_fill_ui",
+    "//base",
+    "//base/test:test_support",
+    "//ios/chrome/test/app:test_support",
+    "//ios/chrome/test/earl_grey:test_support",
+    "//ios/testing/earl_grey:earl_grey_support",
+    "//ios/third_party/earl_grey:earl_grey+link",
+    "//ios/web:earl_grey_test_support",
+    "//ios/web/public/test/http_server",
+    "//third_party/ocmock:ocmock",
+  ]
+}
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
new file mode 100644
index 0000000..56866a20
--- /dev/null
+++ b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
@@ -0,0 +1,170 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <EarlGrey/EarlGrey.h>
+
+#include "base/mac/foundation_util.h"
+#include "base/strings/sys_string_conversions.h"
+#import "base/test/ios/wait_util.h"
+#import "ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "ios/chrome/test/app/tab_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/web/public/test/earl_grey/web_view_actions.h"
+#import "ios/web/public/test/earl_grey/web_view_matchers.h"
+#include "ios/web/public/test/element_selector.h"
+#import "ios/web/public/test/http_server/http_server.h"
+#include "ios/web/public/test/http_server/http_server_util.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using web::test::ElementSelector;
+
+namespace {
+
+const std::string kFormElementID1 = "username";
+const std::string kFormElementID2 = "otherstuff";
+const std::string kFormElementSubmit = "submit";
+
+// If an element is focused in the webview, returns its ID. Returns an empty
+// NSString otherwise.
+NSString* GetFocusedElementID() {
+  NSString* js =
+      @"(function() {"
+       "  return document.activeElement.id;"
+       "})();";
+  NSError* error = nil;
+  NSString* result = chrome_test_util::ExecuteJavaScript(js, &error);
+  GREYAssertNil(error, @"Unexpected error when executing JavaScript.");
+  return result;
+}
+
+// Verifies that |elementId| is the selected element in the web page.
+void AssertElementIsFocused(const std::string& element_id) {
+  NSString* description =
+      [NSString stringWithFormat:
+                    @"Timeout waiting for the focused element in "
+                    @"the webview to be \"%@\"",
+                    base::SysUTF8ToNSString(element_id.c_str())];
+  ConditionBlock condition = ^{
+    return base::SysNSStringToUTF8(GetFocusedElementID()) == element_id;
+  };
+  GREYAssert(base::test::ios::WaitUntilConditionOrTimeout(10, condition),
+             description);
+}
+
+// Helper to tap a web element.
+void TapOnWebElementWithID(const std::string& elementID) {
+  [[EarlGrey
+      selectElementWithMatcher:web::WebViewInWebState(
+                                   chrome_test_util::GetCurrentWebState())]
+      performAction:web::WebViewTapElement(
+                        chrome_test_util::GetCurrentWebState(),
+                        ElementSelector::ElementSelectorId(elementID))];
+}
+
+}  // namespace
+
+// Tests Mannual Fallback keyboard observer for form handling.
+@interface KeyboardObserverTestCase : ChromeTestCase
+
+// Observer to be tested.
+@property(nonatomic, strong) KeyboardObserverHelper* keyboardObserver;
+
+// Delegate mock to confirm the observer callbacks.
+@property(nonatomic, strong)
+    OCMockObject<KeyboardObserverHelperDelegate>* keyboardObserverDelegateMock;
+
+@end
+
+@implementation KeyboardObserverTestCase
+
+- (void)setUp {
+  [super setUp];
+  self.keyboardObserver = [[KeyboardObserverHelper alloc] init];
+  self.keyboardObserverDelegateMock =
+      OCMProtocolMock(@protocol(KeyboardObserverHelperDelegate));
+  self.keyboardObserver.delegate = self.keyboardObserverDelegateMock;
+
+  web::test::SetUpFileBasedHttpServer();
+  GURL URL = web::test::HttpServer::MakeUrl(
+      "http://ios/testing/data/http_server_files/multi_field_form.html");
+  [ChromeEarlGrey loadURL:URL];
+  [ChromeEarlGrey waitForWebViewContainingText:"hello!"];
+
+  // Opening the keyboard from a webview blocks EarlGrey's synchronization.
+  [[GREYConfiguration sharedInstance]
+          setValue:@NO
+      forConfigKey:kGREYConfigKeySynchronizationEnabled];
+}
+
+- (void)tearDown {
+  self.keyboardObserverDelegateMock = nil;
+  self.keyboardObserver = nil;
+
+  // |setUp| disables synchronization.  Reenable here.
+  [[GREYConfiguration sharedInstance]
+          setValue:@YES
+      forConfigKey:kGREYConfigKeySynchronizationEnabled];
+  [super tearDown];
+}
+
+// Tests the observer correctly identifies when the keyboard stays on screen.
+- (void)testKeyboardDidStayOnScreen {
+  // Brings up the keyboard by tapping on one of the form's field.
+  TapOnWebElementWithID(kFormElementID1);
+
+  // Verifies that the taped element is focused.
+  AssertElementIsFocused(kFormElementID1);
+
+  // Create the callback expectation.
+  OCMExpect([self.keyboardObserverDelegateMock keyboardDidStayOnScreen]);
+
+  // Tap the second field.
+  TapOnWebElementWithID(kFormElementID2);
+
+  // Verifies that the taped element is focused.
+  AssertElementIsFocused(kFormElementID2);
+
+  // Verify the delegate call was made.
+  [self.keyboardObserverDelegateMock verify];
+
+  // Add another callback expectation.
+  OCMExpect([self.keyboardObserverDelegateMock keyboardDidStayOnScreen]);
+
+  // Tap the first field.
+  TapOnWebElementWithID(kFormElementID1);
+
+  // Verifies that the taped element is focused.
+  AssertElementIsFocused(kFormElementID1);
+
+  // Verify the delegate call was made.
+  [self.keyboardObserverDelegateMock verify];
+}
+
+// Tests that when the keyboard actually dismiss the right callback is done.
+- (void)testKeyboardDidHide {
+  // Brings up the keyboard by tapping on one of the form's field.
+  TapOnWebElementWithID(kFormElementID1);
+
+  // Verifies that the taped element is focused.
+  AssertElementIsFocused(kFormElementID1);
+
+  // Create the callback expectation.
+  OCMExpect([self.keyboardObserverDelegateMock keyboardDidHide]);
+
+  // Tap the "Submit" button, and let the run loop spin.
+  TapOnWebElementWithID(kFormElementSubmit);
+  base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSeconds(1));
+
+  // Verify the delegate call was made.
+  [self.keyboardObserverDelegateMock verify];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h
new file mode 100644
index 0000000..549764f
--- /dev/null
+++ b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_KEYBOARD_OBSERVER_HELPER_H_
+#define IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_KEYBOARD_OBSERVER_HELPER_H_
+
+#import <UIKit/UIKit.h>
+
+// Delegate informed about the visible/hidden state of the keyboard.
+@protocol KeyboardObserverHelperDelegate<NSObject>
+
+// Indicates that |UIKeyboardWillHideNotification| was posted but the keyboard
+// was not hidden. For example, this can happen when jumping between fields.
+- (void)keyboardDidStayOnScreen;
+
+// Indicates that |UIKeyboardWillHideNotification| was posted and the keyboard
+// was actually dismissed.
+- (void)keyboardDidHide;
+
+@end
+
+// Helper to observe the keyboard and report updates.
+@interface KeyboardObserverHelper : NSObject
+
+// The delegate to inform of the keyboard state changes.
+@property(nonatomic, weak) id<KeyboardObserverHelperDelegate> delegate;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_AUTOFILL_MANUAL_FILL_KEYBOARD_OBSERVER_HELPER_H_
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.mm b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.mm
new file mode 100644
index 0000000..c51cd2a
--- /dev/null
+++ b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.mm
@@ -0,0 +1,63 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_helper.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface KeyboardObserverHelper ()
+
+// Boolean to check if the keyboard was actually dismissed.
+@property(nonatomic) BOOL keyboardOnScreen;
+
+@end
+
+@implementation KeyboardObserverHelper
+
+- (instancetype)init {
+  self = [super init];
+  if (self) {
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(keyboardWillShow:)
+               name:UIKeyboardWillShowNotification
+             object:nil];
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(keyboardWillHide:)
+               name:UIKeyboardWillHideNotification
+             object:nil];
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(keyboardDidHide:)
+               name:UIKeyboardDidHideNotification
+             object:nil];
+  }
+  return self;
+}
+
+- (void)keyboardWillShow:(NSNotification*)notification {
+  self.keyboardOnScreen = YES;
+}
+
+- (void)keyboardWillHide:(NSNotification*)notification {
+  self.keyboardOnScreen = NO;
+  dispatch_async(dispatch_get_main_queue(), ^{
+    if (self.keyboardOnScreen) {
+      [self.delegate keyboardDidStayOnScreen];
+    }
+  });
+}
+
+- (void)keyboardDidHide:(NSNotification*)notification {
+  dispatch_async(dispatch_get_main_queue(), ^{
+    if (!self.keyboardOnScreen) {
+      [self.delegate keyboardDidHide];
+    }
+  });
+}
+
+@end
diff --git a/ios/chrome/browser/ui/background_generator.h b/ios/chrome/browser/ui/background_generator.h
index b612c51..d9e9ad9 100644
--- a/ios/chrome/browser/ui/background_generator.h
+++ b/ios/chrome/browser/ui/background_generator.h
@@ -21,7 +21,4 @@
                            UIImage* tileImage,
                            UIImage* logoImage);
 
-// Installs the stack view/empty tab view background in |view|.
-void InstallBackgroundInView(UIView* view);
-
 #endif  // IOS_CHROME_BROWSER_UI_BACKGROUND_GENERATOR_H_
diff --git a/ios/chrome/browser/ui/background_generator.mm b/ios/chrome/browser/ui/background_generator.mm
index b254bdc..fd1a603 100644
--- a/ios/chrome/browser/ui/background_generator.mm
+++ b/ios/chrome/browser/ui/background_generator.mm
@@ -49,13 +49,3 @@
   UIGraphicsEndImageContext();
   return background;
 }
-
-void InstallBackgroundInView(UIView* view) {
-  // TODO(crbug.com/800266): This function should be removed.
-  UIImageView* imageView = [[UIImageView alloc] initWithFrame:view.bounds];
-  imageView.image = [UIImage imageNamed:@"stack_view_background_noise"];
-  imageView.contentMode = UIViewContentModeScaleAspectFill;
-  imageView.autoresizingMask =
-      UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-  [view insertSubview:imageView atIndex:0];
-}
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index f3b50cf..a9313e58 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -192,7 +192,6 @@
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/public/provider/chrome/browser/signin:test_support",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 56920b9..2a02d9c 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -29,7 +29,6 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/browser_view_controller.h b/ios/chrome/browser/ui/browser_view_controller.h
index 4412f5c..94d23cd5 100644
--- a/ios/chrome/browser/ui/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view_controller.h
@@ -12,8 +12,7 @@
 #import "base/ios/block_types.h"
 #import "ios/chrome/browser/ui/settings/sync_utils/sync_presenter.h"
 #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/public/provider/chrome/browser/voice/logo_animation_controller.h"
 
@@ -40,7 +39,6 @@
     : UIViewController<LogoAnimationControllerOwnerOwner,
                        SyncPresenter,
                        ToolbarCoordinatorDelegate,
-                       ToolbarOwner,
                        UrlLoader>
 
 // Initializes a new BVC from its nib. |model| must not be nil. The
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index b814ba4..0331322 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -195,19 +195,18 @@
 #import "ios/chrome/browser/ui/tabs/requirements/tab_strip_constants.h"
 #import "ios/chrome/browser/ui/tabs/requirements/tab_strip_presentation.h"
 #import "ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#import "ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/public/features.h"
 #import "ios/chrome/browser/ui/toolbar/public/primary_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h"
 #import "ios/chrome/browser/ui/translate/language_selection_coordinator.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/ui_util.h"
@@ -2621,18 +2620,6 @@
 }
 
 - (CGFloat)headerHeightForTab:(Tab*)tab {
-  id nativeController = [self nativeControllerForTab:tab];
-  if ([nativeController conformsToProtocol:@protocol(ToolbarOwner)] &&
-      [nativeController respondsToSelector:@selector(toolbarFrame)] &&
-      CGRectGetHeight([nativeController toolbarFrame]) > 0.0 &&
-      ![self canShowTabStrip]) {
-    // On iPhone, don't add any header height for ToolbarOwner native
-    // controllers when they're displaying their own toolbar.
-    if (self.usesFullscreenContainer)
-      return StatusBarHeight();
-    return 0;
-  }
-
   NSArray<HeaderDefinition*>* views = [self headerViews];
 
   CGFloat height = self.headerOffset;
@@ -3124,9 +3111,6 @@
   DCHECK([self.tabModel indexOfTab:tab] != NSNotFound);
 
   CGFloat headerHeight = [self headerHeightForTab:tab];
-  id nativeController = [self nativeControllerForTab:tab];
-  if ([nativeController respondsToSelector:@selector(toolbarFrame)])
-    headerHeight += CGRectGetHeight([nativeController toolbarFrame]);
   return UIEdgeInsetsMake(headerHeight, 0.0, 0.0, 0.0);
 }
 
@@ -4501,10 +4485,6 @@
                                                    self.currentWebState]];
 }
 
-- (void)openNewTab:(OpenNewTabCommand*)command {
-  [self.dispatcher openURLInNewTab:command];
-}
-
 - (void)printTab {
   Tab* currentTab = [_model currentTab];
   // The UI should prevent users from printing non-printable pages. However,
@@ -4808,22 +4788,6 @@
   [nativeController focusFakebox];
 }
 
-#pragma mark - ToolbarOwner (Public)
-
-- (CGRect)toolbarFrame {
-  // TODO(crbug.com/800266): Check when it is possible to remove the
-  // ToolbarOwner protocol.
-  NOTREACHED();
-  return CGRectZero;
-}
-
-- (id<ToolbarSnapshotProviding>)toolbarSnapshotProvider {
-  // TODO(crbug.com/800266): Check when it is possible to remove the
-  // ToolbarOwner protocol.
-  NOTREACHED();
-  return nil;
-}
-
 #pragma mark - TabModelObserver methods
 
 // Observer method, tab inserted.
diff --git a/ios/chrome/browser/ui/collection_view/OWNERS b/ios/chrome/browser/ui/collection_view/OWNERS
index c984591..b127701 100644
--- a/ios/chrome/browser/ui/collection_view/OWNERS
+++ b/ios/chrome/browser/ui/collection_view/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
index 2a48412..7dabb0c 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.h"
 
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
@@ -153,8 +152,7 @@
   _imageView.layer.masksToBounds = YES;
   _imageView.contentMode = UIViewContentModeScaleAspectFit;
 
-  if (cellStyle == CollectionViewCellStyle::kUIKit &&
-      experimental_flags::IsSettingsUIRebootEnabled()) {
+  if (cellStyle == CollectionViewCellStyle::kUIKit) {
     _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
     _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _detailTextLabel.font =
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
index d204665..8993e0d6 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -144,8 +143,7 @@
                action:^(const GURL& URL) {
                  [weakSelf.linkDelegate cell:weakSelf didTapLinkURL:URL];
                }];
-    if (cellStyle == CollectionViewCellStyle::kUIKit &&
-        experimental_flags::IsSettingsUIRebootEnabled()) {
+    if (cellStyle == CollectionViewCellStyle::kUIKit) {
       [_linkController setLinkColor:UIColorFromRGB(kUIKitFooterLinkColor)];
     } else {
       [_linkController setLinkColor:[[MDCPalette cr_bluePalette] tint500]];
@@ -155,8 +153,7 @@
 }
 
 - (void)updateForStyle:(CollectionViewCellStyle)cellStyle {
-  if (cellStyle == CollectionViewCellStyle::kUIKit &&
-      experimental_flags::IsSettingsUIRebootEnabled()) {
+  if (cellStyle == CollectionViewCellStyle::kUIKit) {
     self.textLabel.font = [UIFont systemFontOfSize:kUIKitFooterFontSize];
     self.textLabel.textColor = UIColorFromRGB(kUIKitFooterTextColor);
   } else {
diff --git a/ios/chrome/browser/ui/colors/OWNERS b/ios/chrome/browser/ui/colors/OWNERS
deleted file mode 100644
index a188a478..0000000
--- a/ios/chrome/browser/ui/colors/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-lpromero@chromium.org
-
-# TEAM: ios-directory-owners@chromium.org
-# OS: iOS
diff --git a/ios/chrome/browser/ui/commands/BUILD.gn b/ios/chrome/browser/ui/commands/BUILD.gn
index 9efbdb85b..df6a0a6 100644
--- a/ios/chrome/browser/ui/commands/BUILD.gn
+++ b/ios/chrome/browser/ui/commands/BUILD.gn
@@ -26,7 +26,6 @@
     "show_signin_command.mm",
     "snackbar_commands.h",
     "toolbar_commands.h",
-    "tools_menu_commands.h",
   ]
   deps = [
     "//base",
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h
index f35f24db..8e91139 100644
--- a/ios/chrome/browser/ui/commands/browser_commands.h
+++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/commands/popup_menu_commands.h"
 #import "ios/chrome/browser/ui/commands/qr_scanner_commands.h"
 #import "ios/chrome/browser/ui/commands/snackbar_commands.h"
-#import "ios/chrome/browser/ui/commands/tools_menu_commands.h"
 
 @class OpenNewTabCommand;
 @class ReadingListAddCommand;
@@ -26,8 +25,7 @@
                           PageInfoCommands,
                           PopupMenuCommands,
                           QRScannerCommands,
-                          SnackbarCommands,
-                          ToolsMenuCommands>
+                          SnackbarCommands>
 
 // Closes the current tab.
 - (void)closeCurrentTab;
@@ -47,12 +45,6 @@
 // Bookmarks the current page.
 - (void)bookmarkPage;
 
-// TODO(crbug.com/800266): Remove this command when the StackView and
-// TabSwitcher are removed.
-// Opens a new tab as specified by |newTabCommand|.
-// DEPRECATED: Don't add uses for this command.
-- (void)openNewTab:(OpenNewTabCommand*)newTabCommand;
-
 // Prints the currently active tab.
 - (void)printTab;
 
diff --git a/ios/chrome/browser/ui/commands/tools_menu_commands.h b/ios/chrome/browser/ui/commands/tools_menu_commands.h
deleted file mode 100644
index 63fdf44..0000000
--- a/ios/chrome/browser/ui/commands/tools_menu_commands.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_COMMANDS_TOOLS_MENU_COMMANDS_H_
-#define IOS_CHROME_BROWSER_UI_COMMANDS_TOOLS_MENU_COMMANDS_H_
-
-#import <Foundation/Foundation.h>
-
-// Protocol that describes the commands that may trigger the presentation
-// and dismissal of the Tools menu.
-// TODO(crbug.com/800266): Remove this protocol once Phase 1 is enabled.
-@protocol ToolsMenuCommands
-// Display the tools menu.
-- (void)showToolsMenu;
-
-// Dismiss the tools menu.
-- (void)dismissToolsMenu;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_COMMANDS_TOOLS_MENU_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 33daaec..672b8ac 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -63,11 +63,7 @@
     "//ios/chrome/browser/ui/overscroll_actions",
     "//ios/chrome/browser/ui/reading_list",
     "//ios/chrome/browser/ui/settings/utils:utils",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/adaptive:adaptive_ui",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
@@ -125,8 +121,7 @@
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/ntp",
     "//ios/chrome/browser/ui/overscroll_actions",
-    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/buttons:buttons",
+    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/util:util",
     "//ios/chrome/common/favicon",
     "//ios/web/public",
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
index a511cdde..853a196 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -35,10 +35,6 @@
 #import "ios/chrome/browser/ui/ntp/notification_promo_whats_new.h"
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
 #import "ios/chrome/browser/ui/settings/utils/pref_backed_boolean.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
-#import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.h
index cf00b87..a3452fe 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.h
@@ -7,12 +7,10 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
-
 // Header view for the NTP. The header view contains all views that are
 // displayed above the list of most visited sites, which includes the
 // primary toolbar, doodle, and fake omnibox.
-@interface ContentSuggestionsHeaderView : UIView<ToolbarOwner>
+@interface ContentSuggestionsHeaderView : UIView
 
 // Returns the toolbar view.
 @property(nonatomic, readonly) UIView* toolBarView;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
index 9f76b9d..2f34a3e 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/named_guide_util.h"
@@ -38,7 +37,7 @@
 
 }  // namespace
 
-@interface ContentSuggestionsHeaderView ()<ToolbarSnapshotProviding>
+@interface ContentSuggestionsHeaderView ()
 
 // Layout constraints for fake omnibox background image and blur.
 @property(nonatomic, strong) NSLayoutConstraint* backgroundHeightConstraint;
@@ -265,30 +264,4 @@
   hintLabel.transform = CGAffineTransformMakeScale(scaleValue, scaleValue);
 }
 
-#pragma mark - ToolbarOwner
-
-- (CGRect)toolbarFrame {
-  return CGRectZero;
-}
-
-- (id<ToolbarSnapshotProviding>)toolbarSnapshotProvider {
-  return self;
-}
-
-#pragma mark - ToolbarSnapshotProviding
-
-- (UIView*)snapshotForTabSwitcher {
-  return nil;
-}
-
-- (UIView*)snapshotForStackViewWithWidth:(CGFloat)width
-                          safeAreaInsets:(UIEdgeInsets)safeAreaInsets {
-  NOTREACHED();
-  return nil;
-}
-
-- (UIColor*)toolbarBackgroundColor {
-  return nil;
-}
-
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h
index 548291b..2735b7d 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.h
@@ -10,7 +10,6 @@
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_controlling.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_provider.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_consumer.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
 #import "ios/public/provider/chrome/browser/voice/logo_animation_controller.h"
 
 @protocol ApplicationCommands;
@@ -32,7 +31,6 @@
     : UIViewController<ContentSuggestionsHeaderControlling,
                        ContentSuggestionsHeaderProvider,
                        NTPHomeConsumer,
-                       ToolbarOwner,
                        LogoAnimationControllerOwnerOwner>
 
 // Whether |voiceSearchIsEnabled|.
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
index 4dfd07f..9a0d468 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -19,8 +19,8 @@
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller_delegate.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/public/fakebox_focuser.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -480,16 +480,6 @@
   [self.collectionSynchronizer shiftTilesUpWithCompletionBlock:completionBlock];
 }
 
-#pragma mark - ToolbarOwner
-
-- (CGRect)toolbarFrame {
-  return [self.headerView toolbarFrame];
-}
-
-- (id<ToolbarSnapshotProviding>)toolbarSnapshotProvider {
-  return self.headerView.toolbarSnapshotProvider;
-}
-
 #pragma mark - LogoAnimationControllerOwnerOwner
 
 - (id<LogoAnimationControllerOwner>)logoAnimationControllerOwner {
diff --git a/ios/chrome/browser/ui/dialogs/BUILD.gn b/ios/chrome/browser/ui/dialogs/BUILD.gn
index ee1693c..6e48d9d 100644
--- a/ios/chrome/browser/ui/dialogs/BUILD.gn
+++ b/ios/chrome/browser/ui/dialogs/BUILD.gn
@@ -93,7 +93,6 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
index 0e9a401..5c6cb651 100644
--- a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
+++ b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
@@ -12,7 +12,6 @@
 #import "base/test/ios/wait_util.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/dialogs/dialog_presenter.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator.mm b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
index 2c975782..2c42ee93 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator.mm
@@ -4,11 +4,13 @@
 
 #import "ios/chrome/browser/ui/download/download_manager_coordinator.h"
 
+#import <MobileCoreServices/MobileCoreServices.h>
 #import <StoreKit/StoreKit.h>
 
 #include <memory>
 
 #import "base/logging.h"
+#include "base/mac/scoped_cftyperef.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
@@ -338,6 +340,12 @@
   NSURL* URL = [NSURL fileURLWithPath:base::SysUTF8ToNSString(path.value())];
   _openInController =
       [UIDocumentInteractionController interactionControllerWithURL:URL];
+
+  base::ScopedCFTypeRef<CFStringRef> MIMEType(
+      base::SysUTF8ToCFStringRef(_downloadTask->GetMimeType()));
+  CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(
+      kUTTagClassMIMEType, MIMEType.get(), nullptr);
+  _openInController.UTI = CFBridgingRelease(UTI);
   _openInController.delegate = self;
 
   BOOL menuShown =
diff --git a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
index df66ba578..3c664341 100644
--- a/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_coordinator_unittest.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/download/download_manager_coordinator.h"
 
+#import <MobileCoreServices/MobileCoreServices.h>
 #import <StoreKit/StoreKit.h>
 #import <UIKit/UIKit.h>
 
@@ -406,6 +407,8 @@
     [viewController.delegate downloadManagerViewController:viewController
                           presentOpenInMenuWithLayoutGuide:guide];
   }
+  ASSERT_NSEQ((__bridge NSString*)kUTTypeHTML,
+              document_interaction_controller.UTI);
   ASSERT_TRUE(document_interaction_controller.presentedOpenInMenu);
   ASSERT_TRUE(CGRectEqualToRect(
       CGRectZero, document_interaction_controller.presentedOpenInMenu.rect));
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn
index 36634ae0..758a714 100644
--- a/ios/chrome/browser/ui/find_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -46,7 +46,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/find_in_page",
     "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/web/public/test/http_server",
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
index f38c6d6..ce97c0f0 100644
--- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
+++ b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
@@ -11,7 +11,6 @@
 #import "ios/chrome/browser/ui/find_bar/find_bar_constants.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index e7962c77..2fc683c1 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -152,8 +152,6 @@
     "//ios/chrome/browser/ui/settings",
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view/cells",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/history/OWNERS b/ios/chrome/browser/ui/history/OWNERS
index 1c26985..b215c963 100644
--- a/ios/chrome/browser/ui/history/OWNERS
+++ b/ios/chrome/browser/ui/history/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 sczs@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index cb97c38c..d02ad9f 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -22,7 +22,6 @@
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/util/transparent_link_button.h"
 #include "ios/chrome/common/string_util.h"
diff --git a/ios/chrome/browser/ui/keyboard/OWNERS b/ios/chrome/browser/ui/keyboard/OWNERS
deleted file mode 100644
index a188a478..0000000
--- a/ios/chrome/browser/ui/keyboard/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-lpromero@chromium.org
-
-# TEAM: ios-directory-owners@chromium.org
-# OS: iOS
diff --git a/ios/chrome/browser/ui/keyboard_commands_egtest.mm b/ios/chrome/browser/ui/keyboard_commands_egtest.mm
index 3e05a023..d85e4aa 100644
--- a/ios/chrome/browser/ui/keyboard_commands_egtest.mm
+++ b/ios/chrome/browser/ui/keyboard_commands_egtest.mm
@@ -12,7 +12,6 @@
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/list_model/OWNERS b/ios/chrome/browser/ui/list_model/OWNERS
index e0e75c0..da52dbd 100644
--- a/ios/chrome/browser/ui/list_model/OWNERS
+++ b/ios/chrome/browser/ui/list_model/OWNERS
@@ -1,6 +1,6 @@
 sczs@chromium.org
 rohitrao@chromium.org
-gambard@chromiumg.org
+gambard@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
 # OS: iOS
diff --git a/ios/chrome/browser/ui/location_bar/BUILD.gn b/ios/chrome/browser/ui/location_bar/BUILD.gn
index 067db7c..1f296ca2c 100644
--- a/ios/chrome/browser/ui/location_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/location_bar/BUILD.gn
@@ -122,7 +122,7 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
+    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar/test",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list:test_support",
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
index 9931bed0..b437e9f 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
@@ -34,7 +34,7 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h"
 #include "ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller_impl.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/chrome/browser/ui/util/pasteboard_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm
index e55887a..9c178f7 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator_unittest.mm
@@ -14,7 +14,7 @@
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_opener.h"
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm
index b6794d1..cf4fabab 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_legacy_coordinator.mm
@@ -30,9 +30,9 @@
 #include "ios/chrome/browser/ui/omnibox/location_bar_delegate.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_views.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/url_loader.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn
index b4d50b2..24da136 100644
--- a/ios/chrome/browser/ui/main/BUILD.gn
+++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -10,10 +10,6 @@
     "browser_view_wrangler.mm",
     "bvc_container_view_controller.h",
     "bvc_container_view_controller.mm",
-    "main_coordinator.h",
-    "main_coordinator.mm",
-    "main_presenting_view_controller.h",
-    "main_presenting_view_controller.mm",
     "view_controller_swapping.h",
   ]
   deps = [
@@ -29,7 +25,6 @@
     "//ios/chrome/browser/sessions:serialisation",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/tabs:tabs_internal",
-    "//ios/chrome/browser/ui/main/transitions",
     "//ios/public/provider/chrome/browser",
   ]
   public_deps = [
@@ -57,13 +52,10 @@
   testonly = true
   sources = [
     "browser_view_wrangler_unittest.mm",
-    "main_coordinator_unittest.mm",
-    "main_presenting_view_controller_unittest.mm",
   ]
   deps = [
     ":main",
     ":tab_switcher",
-    ":test_support",
     "//base",
     "//base/test:test_support",
     "//components/bookmarks/test",
@@ -76,17 +68,3 @@
     "//testing/gtest",
   ]
 }
-
-source_set("test_support") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  sources = [
-    "main_view_controller_test.h",
-    "main_view_controller_test.mm",
-  ]
-  deps = [
-    ":tab_switcher",
-    "//base",
-    "//ios/chrome/test:test_support",
-  ]
-}
diff --git a/ios/chrome/browser/ui/main/main_coordinator.h b/ios/chrome/browser/ui/main/main_coordinator.h
deleted file mode 100644
index c93d200..0000000
--- a/ios/chrome/browser/ui/main/main_coordinator.h
+++ /dev/null
@@ -1,27 +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 IOS_CHROME_BROWSER_UI_MAIN_MAIN_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_MAIN_MAIN_COORDINATOR_H_
-
-#import "ios/chrome/browser/chrome_root_coordinator.h"
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/main/view_controller_swapping.h"
-
-@interface MainCoordinator : ChromeRootCoordinator
-
-// The view controller this coordinator creates and manages.
-// (This is only public while the view controller architecture is being
-// refactored).
-@property(nonatomic, weak, readonly, nullable)
-    UIViewController* mainViewController;
-
-@property(nonatomic, weak, readonly, nullable) id<ViewControllerSwapping>
-    viewControllerSwapper;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_MAIN_MAIN_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/main/main_coordinator.mm b/ios/chrome/browser/ui/main/main_coordinator.mm
deleted file mode 100644
index 4aa690c..0000000
--- a/ios/chrome/browser/ui/main/main_coordinator.mm
+++ /dev/null
@@ -1,43 +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.
-
-#import "ios/chrome/browser/ui/main/main_coordinator.h"
-
-#include "base/logging.h"
-#import "ios/chrome/browser/ui/main/main_presenting_view_controller.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface MainCoordinator () {
-  // Instance variables backing properties of the same name.
-  // |_mainViewController| will be owned by |self.window|.
-  __weak UIViewController<ViewControllerSwapping>* _mainViewController;
-}
-
-@end
-
-@implementation MainCoordinator
-
-#pragma mark - property implementation.
-
-- (UIViewController*)mainViewController {
-  return _mainViewController;
-}
-
-- (id<ViewControllerSwapping>)viewControllerSwapper {
-  return _mainViewController;
-}
-
-#pragma mark - ChromeCoordinator implementation.
-
-- (void)start {
-  UIViewController<ViewControllerSwapping>* mainViewController =
-      [[MainPresentingViewController alloc] init];
-  _mainViewController = mainViewController;
-  self.window.rootViewController = self.mainViewController;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/main/main_coordinator_unittest.mm b/ios/chrome/browser/ui/main/main_coordinator_unittest.mm
deleted file mode 100644
index f5207ba..0000000
--- a/ios/chrome/browser/ui/main/main_coordinator_unittest.mm
+++ /dev/null
@@ -1,26 +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.
-
-#import "ios/chrome/browser/ui/main/main_coordinator.h"
-
-#import <UIKit/UIKit.h>
-
-#include "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using MainCoordinatorTest = PlatformTest;
-
-TEST_F(MainCoordinatorTest, SizeViewController) {
-  CGRect rect = [UIScreen mainScreen].bounds;
-  UIWindow* window = [UIApplication sharedApplication].keyWindow;
-  MainCoordinator* coordinator =
-      [[MainCoordinator alloc] initWithWindow:window];
-  [coordinator start];
-  EXPECT_TRUE(
-      CGRectEqualToRect(rect, coordinator.mainViewController.view.frame));
-}
diff --git a/ios/chrome/browser/ui/main/main_presenting_view_controller.h b/ios/chrome/browser/ui/main/main_presenting_view_controller.h
deleted file mode 100644
index 82247a6..0000000
--- a/ios/chrome/browser/ui/main/main_presenting_view_controller.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_MAIN_MAIN_PRESENTING_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_MAIN_MAIN_PRESENTING_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/ui/main/view_controller_swapping.h"
-
-#import <UIKit/UIKit.h>
-
-@protocol TabSwitcher;
-
-// A UIViewController that uses presentation to display TabSwitchers and
-// BrowserViewControllers..
-@interface MainPresentingViewController
-    : UIViewController<ViewControllerSwapping>
-
-@property(nonatomic, readonly, weak) id<TabSwitcher> tabSwitcher;
-
-// If this property is YES, calls to |showTabSwitcher:completion:| and
-// |showTabViewController:completion:| will present the given view controllers
-// without animation.  This should only be used by unittests.
-@property(nonatomic, readwrite, assign) BOOL animationsDisabledForTesting;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_MAIN_MAIN_PRESENTING_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/main/main_presenting_view_controller.mm b/ios/chrome/browser/ui/main/main_presenting_view_controller.mm
deleted file mode 100644
index cd6214d9..0000000
--- a/ios/chrome/browser/ui/main/main_presenting_view_controller.mm
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/main/main_presenting_view_controller.h"
-
-#import "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#include "base/mac/foundation_util.h"
-#import "ios/chrome/browser/ui/main/bvc_container_view_controller.h"
-#import "ios/chrome/browser/ui/main/tab_switcher.h"
-#import "ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.h"
-#import "ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface MainPresentingViewController ()<
-    UIViewControllerTransitioningDelegate>
-
-@property(nonatomic, strong) BVCContainerViewController* bvcContainer;
-
-// A copy of the launch screen view used to mask flicker at startup.
-@property(nonatomic, strong) UIView* launchScreen;
-
-// Redeclared as readwrite.
-@property(nonatomic, readwrite, weak) id<TabSwitcher> tabSwitcher;
-
-@end
-
-@implementation MainPresentingViewController
-@synthesize animationsDisabledForTesting = _animationsDisabledForTesting;
-@synthesize tabSwitcher = _tabSwitcher;
-@synthesize bvcContainer = _bvcContainer;
-@synthesize launchScreen = _launchScreen;
-
-- (void)viewDidLoad {
-  // Set a white background color to avoid flickers of black during startup.
-  self.view.backgroundColor = [UIColor whiteColor];
-  // In some circumstances (such as when uploading a crash report), there may
-  // be no other view controller visible for a few seconds. To prevent a
-  // white screen from appearing in that case, the startup view is added to
-  // the view hierarchy until another view controller is added.
-  NSBundle* mainBundle = base::mac::FrameworkBundle();
-  NSArray* topObjects =
-      [mainBundle loadNibNamed:@"LaunchScreen" owner:self options:nil];
-  UIViewController* launchScreenController =
-      base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
-  self.launchScreen = launchScreenController.view;
-  self.launchScreen.userInteractionEnabled = NO;
-  self.launchScreen.frame = self.view.bounds;
-  [self.view addSubview:self.launchScreen];
-}
-
-- (UIViewController*)activeViewController {
-  if (self.bvcContainer) {
-    DCHECK_EQ(self.bvcContainer, self.presentedViewController);
-    DCHECK(self.bvcContainer.currentBVC);
-    return self.bvcContainer.currentBVC;
-  } else if (self.tabSwitcher) {
-    DCHECK_EQ(self.tabSwitcher, [self.childViewControllers firstObject]);
-    return [self.tabSwitcher viewController];
-  }
-
-  return nil;
-}
-
-- (UIViewController*)viewController {
-  return self;
-}
-
-- (void)showTabSwitcher:(id<TabSwitcher>)tabSwitcher
-             completion:(ProceduralBlock)completion {
-  DCHECK(tabSwitcher);
-
-  // Before any child view controller would be added, remove the launch screen.
-  if (self.launchScreen) {
-    [self.launchScreen removeFromSuperview];
-    self.launchScreen = nil;
-  }
-
-  // Don't remove and re-add the tabSwitcher if it hasn't changed.
-  if (self.tabSwitcher != tabSwitcher) {
-    // Remove any existing tab switchers first.
-    if (self.tabSwitcher) {
-      UIViewController* tabSwitcherViewController =
-          [tabSwitcher viewController];
-      [tabSwitcherViewController willMoveToParentViewController:nil];
-      [tabSwitcherViewController.view removeFromSuperview];
-      [tabSwitcherViewController removeFromParentViewController];
-    }
-
-    // Reset the background color of the container view.  The tab switcher does
-    // not draw anything below the status bar, so those pixels fall through to
-    // display the container's background.
-    self.view.backgroundColor = [UIColor clearColor];
-
-    UIViewController* tabSwitcherViewController = [tabSwitcher viewController];
-    // Add the new tab switcher as a child VC.
-    [self addChildViewController:tabSwitcherViewController];
-    tabSwitcherViewController.view.translatesAutoresizingMaskIntoConstraints =
-        NO;
-    [self.view addSubview:tabSwitcherViewController.view];
-
-    [NSLayoutConstraint activateConstraints:@[
-      [tabSwitcherViewController.view.topAnchor
-          constraintEqualToAnchor:self.view.topAnchor],
-      [tabSwitcherViewController.view.bottomAnchor
-          constraintEqualToAnchor:self.view.bottomAnchor],
-      [tabSwitcherViewController.view.leadingAnchor
-          constraintEqualToAnchor:self.view.leadingAnchor],
-      [tabSwitcherViewController.view.trailingAnchor
-          constraintEqualToAnchor:self.view.trailingAnchor],
-    ]];
-
-    [tabSwitcherViewController didMoveToParentViewController:self];
-    self.tabSwitcher = tabSwitcher;
-  }
-
-  // If a BVC is currently being presented, dismiss it.  This will trigger any
-  // necessary animations.
-  if (self.bvcContainer) {
-    // Pre-size the tab switcher's view if necessary.
-    [self.tabSwitcher
-        prepareForDisplayAtSize:self.bvcContainer.view.bounds.size];
-    self.bvcContainer.transitioningDelegate = self;
-    self.bvcContainer = nil;
-    BOOL animated = !self.animationsDisabledForTesting;
-    [super dismissViewControllerAnimated:animated completion:completion];
-  } else {
-    if (completion) {
-      completion();
-    }
-  }
-}
-
-- (void)showTabViewController:(UIViewController*)viewController
-                   completion:(ProceduralBlock)completion {
-  DCHECK(viewController);
-
-  // If another BVC is already being presented, swap this one into the
-  // container.
-  if (self.bvcContainer) {
-    self.bvcContainer.currentBVC = viewController;
-    if (completion) {
-      completion();
-    }
-    return;
-  }
-
-  self.bvcContainer = [[BVCContainerViewController alloc] init];
-  self.bvcContainer.currentBVC = viewController;
-  self.bvcContainer.transitioningDelegate = self;
-  BOOL animated = !self.animationsDisabledForTesting && self.tabSwitcher != nil;
-  [super presentViewController:self.bvcContainer
-                      animated:animated
-                    completion:completion];
-}
-
-#pragma mark - UIViewController methods
-
-- (void)presentViewController:(UIViewController*)viewControllerToPresent
-                     animated:(BOOL)flag
-                   completion:(void (^)())completion {
-  // If there is no activeViewController then this call will get inadvertently
-  // dropped.
-  DCHECK(self.activeViewController);
-  [self.activeViewController presentViewController:viewControllerToPresent
-                                          animated:flag
-                                        completion:completion];
-}
-
-- (void)dismissViewControllerAnimated:(BOOL)flag
-                           completion:(void (^)())completion {
-  // If there is no activeViewController then this call will get inadvertently
-  // dropped.
-  DCHECK(self.activeViewController);
-  [self.activeViewController dismissViewControllerAnimated:flag
-                                                completion:completion];
-}
-
-- (UIViewController*)childViewControllerForStatusBarHidden {
-  return self.activeViewController;
-}
-
-- (UIViewController*)childViewControllerForStatusBarStyle {
-  return self.activeViewController;
-}
-
-- (BOOL)shouldAutorotate {
-  return self.activeViewController
-             ? [self.activeViewController shouldAutorotate]
-             : [super shouldAutorotate];
-}
-
-#pragma mark - Transitioning Delegate
-
-- (id<UIViewControllerAnimatedTransitioning>)
-animationControllerForPresentedController:(UIViewController*)presented
-                     presentingController:(UIViewController*)presenting
-                         sourceController:(UIViewController*)source {
-  TabSwitcherToBVCContainerAnimator* animator =
-      [[TabSwitcherToBVCContainerAnimator alloc] init];
-  animator.tabSwitcher = self.tabSwitcher;
-  return animator;
-}
-
-- (id<UIViewControllerAnimatedTransitioning>)
-animationControllerForDismissedController:(UIViewController*)dismissed {
-  // Verify that the presenting and dismissed view controllers are of the
-  // expected types.
-  DCHECK([dismissed isKindOfClass:[BVCContainerViewController class]]);
-  DCHECK([dismissed.presentingViewController
-      isKindOfClass:[MainPresentingViewController class]]);
-
-  BVCContainerToTabSwitcherAnimator* animator =
-      [[BVCContainerToTabSwitcherAnimator alloc] init];
-  animator.tabSwitcher = self.tabSwitcher;
-  return animator;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/main/main_presenting_view_controller_unittest.mm b/ios/chrome/browser/ui/main/main_presenting_view_controller_unittest.mm
deleted file mode 100644
index fd51858c..0000000
--- a/ios/chrome/browser/ui/main/main_presenting_view_controller_unittest.mm
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/main/main_presenting_view_controller.h"
-
-#import <UIKit/UIKit.h>
-
-#import "base/test/ios/wait_util.h"
-#include "base/test/scoped_feature_list.h"
-#import "ios/chrome/browser/ui/main/main_view_controller_test.h"
-#import "ios/chrome/browser/ui/main/tab_switcher.h"
-#import "ios/chrome/test/block_cleanup_test.h"
-#include "testing/gtest_mac.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-class MainPresentingViewControllerTest : public MainViewControllerTest {
- public:
-  MainPresentingViewControllerTest() {
-    main_view_controller_ = [[MainPresentingViewController alloc] init];
-    main_view_controller_.animationsDisabledForTesting = YES;
-
-    SetRootViewController(main_view_controller_);
-    CGRect windowRect = CGRectMake(0, 0, 200, 200);
-    main_view_controller_.view.frame = windowRect;
-
-    tab_switcher_ = CreateTestTabSwitcher();
-    [tab_switcher_ viewController].view.frame = CGRectMake(0, 0, 10, 10);
-
-    normal_tab_view_controller_ = [[UIViewController alloc] init];
-    normal_tab_view_controller_.view.frame = CGRectMake(20, 20, 10, 10);
-
-    incognito_tab_view_controller_ = [[UIViewController alloc] init];
-    incognito_tab_view_controller_.view.frame = CGRectMake(40, 40, 10, 10);
-  }
-
-  ~MainPresentingViewControllerTest() override {}
-
- protected:
-  // The MainPresentingViewController that is under test.  The test fixture sets
-  // this VC as the root VC for the window.
-  MainPresentingViewController* main_view_controller_;
-
-  // A tab switcher is created by the text fixture and is available for use in
-  // tests.
-  id<TabSwitcher> tab_switcher_;
-
-  // The following view controllers are created by the test fixture and are
-  // available for use in tests.
-  UIViewController* normal_tab_view_controller_;
-  UIViewController* incognito_tab_view_controller_;
-};
-
-// Tests that there is no activeViewController for a newly constructed instance.
-TEST_F(MainPresentingViewControllerTest, NoActiveViewController) {
-  EXPECT_EQ(nil, main_view_controller_.activeViewController);
-}
-
-// Tests that it is possible to set a TabViewController without first setting a
-// TabSwitcher.
-TEST_F(MainPresentingViewControllerTest, TabViewControllerBeforeTabSwitcher) {
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(normal_tab_view_controller_,
-            main_view_controller_.activeViewController);
-
-  // Now setting a TabSwitcher will make the switcher active.
-  [main_view_controller_ showTabSwitcher:tab_switcher_ completion:nil];
-  EXPECT_EQ([tab_switcher_ viewController],
-            main_view_controller_.activeViewController);
-}
-
-// Tests that it is possible to set a TabViewController after setting a
-// TabSwitcher.
-TEST_F(MainPresentingViewControllerTest, TabViewControllerAfterTabSwitcher) {
-  [main_view_controller_ showTabSwitcher:tab_switcher_ completion:nil];
-  EXPECT_EQ([tab_switcher_ viewController],
-            main_view_controller_.activeViewController);
-
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(normal_tab_view_controller_,
-            main_view_controller_.activeViewController);
-
-  // Showing the TabSwitcher again will make it active.
-  [main_view_controller_ showTabSwitcher:tab_switcher_ completion:nil];
-  EXPECT_EQ([tab_switcher_ viewController],
-            main_view_controller_.activeViewController);
-}
-
-// Tests swapping between two TabViewControllers.
-TEST_F(MainPresentingViewControllerTest, SwapTabViewControllers) {
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(normal_tab_view_controller_,
-            main_view_controller_.activeViewController);
-
-  [main_view_controller_ showTabViewController:incognito_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(incognito_tab_view_controller_,
-            main_view_controller_.activeViewController);
-}
-
-// Tests calling showTabSwitcher twice in a row with the same VC.
-TEST_F(MainPresentingViewControllerTest, ShowTabSwitcherTwice) {
-  [main_view_controller_ showTabSwitcher:tab_switcher_ completion:nil];
-  EXPECT_EQ([tab_switcher_ viewController],
-            main_view_controller_.activeViewController);
-
-  [main_view_controller_ showTabSwitcher:tab_switcher_ completion:nil];
-  EXPECT_EQ([tab_switcher_ viewController],
-            main_view_controller_.activeViewController);
-}
-
-// Tests calling showTabViewController twice in a row with the same VC.
-TEST_F(MainPresentingViewControllerTest, ShowTabViewControllerTwice) {
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(normal_tab_view_controller_,
-            main_view_controller_.activeViewController);
-
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:nil];
-  EXPECT_EQ(normal_tab_view_controller_,
-            main_view_controller_.activeViewController);
-}
-
-// Tests that setting the active view controller work and that completion
-// handlers are called properly after the new view controller is made active.
-TEST_F(MainPresentingViewControllerTest, CompletionHandlers) {
-  // Tests that the completion handler is called when showing the switcher.
-  __block BOOL completion_handler_was_called = false;
-  [main_view_controller_ showTabSwitcher:tab_switcher_
-                              completion:^{
-                                completion_handler_was_called = YES;
-                              }];
-  base::test::ios::WaitUntilCondition(^bool() {
-    return completion_handler_was_called;
-  });
-  ASSERT_TRUE(completion_handler_was_called);
-
-  // Tests that the completion handler is called when showing a tab view
-  // controller.
-  completion_handler_was_called = NO;
-  [main_view_controller_ showTabViewController:normal_tab_view_controller_
-                                    completion:^{
-                                      completion_handler_was_called = YES;
-                                    }];
-  base::test::ios::WaitUntilCondition(^bool() {
-    return completion_handler_was_called;
-  });
-  ASSERT_TRUE(completion_handler_was_called);
-
-  // Tests that the completion handler is called when replacing an existing tab
-  // view controller.
-  completion_handler_was_called = NO;
-  [main_view_controller_ showTabViewController:incognito_tab_view_controller_
-                                    completion:^{
-                                      completion_handler_was_called = YES;
-                                    }];
-  base::test::ios::WaitUntilCondition(^bool() {
-    return completion_handler_was_called;
-  });
-  ASSERT_TRUE(completion_handler_was_called);
-}
-
-}  // namespace
diff --git a/ios/chrome/browser/ui/main/main_view_controller_test.h b/ios/chrome/browser/ui/main/main_view_controller_test.h
deleted file mode 100644
index 4bcd81b..0000000
--- a/ios/chrome/browser/ui/main/main_view_controller_test.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_TEST_H_
-#define IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_TEST_H_
-
-#include "base/macros.h"
-#import "ios/chrome/test/root_view_controller_test.h"
-
-@protocol TabSwitcher;
-
-class MainViewControllerTest : public RootViewControllerTest {
- public:
-  MainViewControllerTest() = default;
-  ~MainViewControllerTest() override = default;
-
- protected:
-  // Creates and returns an object that conforms to the TabSwitcher protocol.
-  id<TabSwitcher> CreateTestTabSwitcher();
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MainViewControllerTest);
-};
-
-#endif  // IOS_CHROME_BROWSER_UI_MAIN_MAIN_VIEW_CONTROLLER_TEST_H_
diff --git a/ios/chrome/browser/ui/main/main_view_controller_test.mm b/ios/chrome/browser/ui/main/main_view_controller_test.mm
deleted file mode 100644
index 24c353e8..0000000
--- a/ios/chrome/browser/ui/main/main_view_controller_test.mm
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/main/main_view_controller_test.h"
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/main/tab_switcher.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-// TestTabSwitcherViewController is a UIViewController subclass that provides an
-// empty implementation of the methods in the TabSwitcher protocol.  This is
-// useful for unittests.
-@interface TestTabSwitcherViewController : UIViewController<TabSwitcher>
-@end
-
-@implementation TestTabSwitcherViewController
-
-@synthesize animationDelegate = _animationDelegate;
-@synthesize delegate = _delegate;
-@synthesize dispatcher = _dispatcher;
-
-- (void)restoreInternalStateWithMainTabModel:(TabModel*)mainModel
-                                 otrTabModel:(TabModel*)otrModel
-                              activeTabModel:(TabModel*)activeModel {
-}
-
-- (UIViewController*)viewController {
-  return self;
-}
-
-- (void)showWithSelectedTabAnimation {
-}
-
-- (Tab*)dismissWithNewTabAnimationToModel:(TabModel*)targetModel
-                                  withURL:(const GURL&)url
-                                  atIndex:(NSUInteger)position
-                               transition:(ui::PageTransition)transition {
-  return nil;
-}
-
-- (void)setOtrTabModel:(TabModel*)otrModel {
-}
-
-- (void)prepareForDisplayAtSize:(CGSize)size {
-}
-
-@end
-
-id<TabSwitcher> MainViewControllerTest::CreateTestTabSwitcher() {
-  return [[TestTabSwitcherViewController alloc] init];
-}
diff --git a/ios/chrome/browser/ui/main/tab_switcher.h b/ios/chrome/browser/ui/main/tab_switcher.h
index 0a83b96..c8e5a29 100644
--- a/ios/chrome/browser/ui/main/tab_switcher.h
+++ b/ios/chrome/browser/ui/main/tab_switcher.h
@@ -17,7 +17,6 @@
 @class TabSwitcherTransitionContext;
 @protocol TabSwitcher;
 @protocol ToolbarCommands;
-@protocol ToolbarOwner;
 
 // This delegate is used to drive the TabSwitcher dismissal and execute code
 // when the presentation and dismmiss animations finishes. The main controller
@@ -34,10 +33,6 @@
 // dismissed.
 - (void)tabSwitcherDismissTransitionDidEnd:(id<TabSwitcher>)tabSwitcher;
 
-// Returns a reference to the owner of the toolbar that should be used in the
-// transition animations.
-- (id<ToolbarOwner>)tabSwitcherTransitionToolbarOwner;
-
 @end
 
 // This delegate is used to inform a transition animator object when the
diff --git a/ios/chrome/browser/ui/main/transitions/BUILD.gn b/ios/chrome/browser/ui/main/transitions/BUILD.gn
deleted file mode 100644
index 9bd9e361..0000000
--- a/ios/chrome/browser/ui/main/transitions/BUILD.gn
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("transitions") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [
-    "bvc_container_to_tab_switcher_animator.h",
-    "bvc_container_to_tab_switcher_animator.mm",
-    "tab_switcher_to_bvc_container_animator.h",
-    "tab_switcher_to_bvc_container_animator.mm",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/browser/ui/main:tab_switcher",
-  ]
-  libs = [ "UIKit.framework" ]
-}
diff --git a/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.h b/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.h
deleted file mode 100644
index 2fb3f31..0000000
--- a/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_BVC_CONTAINER_TO_TAB_SWITCHER_ANIMATOR_H_
-#define IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_BVC_CONTAINER_TO_TAB_SWITCHER_ANIMATOR_H_
-
-#import <UIKit/UIKit.h>
-
-@protocol TabSwitcher;
-
-@interface BVCContainerToTabSwitcherAnimator
-    : NSObject<UIViewControllerAnimatedTransitioning>
-
-// The TabSwitcher to animate.
-@property(nonatomic, readwrite, weak) id<TabSwitcher> tabSwitcher;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_BVC_CONTAINER_TO_TAB_SWITCHER_ANIMATOR_H_
diff --git a/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.mm b/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.mm
deleted file mode 100644
index 05b69c2..0000000
--- a/ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.mm
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/main/transitions/bvc_container_to_tab_switcher_animator.h"
-
-#import "base/mac/foundation_util.h"
-#import "ios/chrome/browser/ui/main/tab_switcher.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface BVCContainerToTabSwitcherAnimator ()<TabSwitcherAnimationDelegate>
-
-@property(nonatomic, readwrite, weak) id<UIViewControllerContextTransitioning>
-    transitionContext;
-
-@end
-
-@implementation BVCContainerToTabSwitcherAnimator
-
-@synthesize tabSwitcher = _tabSwitcher;
-@synthesize transitionContext = _transitionContext;
-
-- (NSTimeInterval)transitionDuration:
-    (id<UIViewControllerContextTransitioning>)transitionContext {
-  // This value is arbitrary, chosen to roughly match the visual length of the
-  // stack view animations.  The returned value does not appear to be used
-  // anywhere.  The actual transition does not complete until
-  // |tabSwitcherPresentationAnimationDidEnd:| is called, which happens as a
-  // result of a CoreAnimation completion block.
-  return 0.25;
-}
-
-- (void)animateTransition:
-    (id<UIViewControllerContextTransitioning>)transitionContext {
-  UIViewController* fromViewController = [transitionContext
-      viewControllerForKey:UITransitionContextFromViewControllerKey];
-  UIViewController* toViewController = [transitionContext
-      viewControllerForKey:UITransitionContextToViewControllerKey];
-
-  UIView* containerView = transitionContext.containerView;
-  // For a Dismissal:
-  //      fromView = The presented view.
-  //      toView   = The presenting view.
-  UIView* fromView =
-      [transitionContext viewForKey:UITransitionContextFromViewKey];
-  UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey];
-  fromView.frame =
-      [transitionContext initialFrameForViewController:fromViewController];
-  toView.frame =
-      [transitionContext finalFrameForViewController:toViewController];
-
-  // This animator is responsible for adding the incoming view to the
-  // containerView for the presentation/dismissal.
-  [containerView addSubview:toView];
-
-  DCHECK_EQ(toViewController,
-            [self.tabSwitcher viewController].parentViewController);
-  self.tabSwitcher.animationDelegate = self;
-  [self.tabSwitcher showWithSelectedTabAnimation];
-
-  self.transitionContext = transitionContext;
-}
-
-#pragma mark - TabSwitcherAnimationDelegate
-
-- (void)tabSwitcherPresentationAnimationDidEnd:(id<TabSwitcher>)tabSwitcher {
-  // Calling |completeTransition:| seems to deallocate |self|, so make any
-  // necessary changes to |self| here, and be sure not to access |self| after
-  // the call to |completeTransition:|.
-  id<UIViewControllerContextTransitioning> transitionContext =
-      self.transitionContext;
-  self.tabSwitcher = nil;
-  self.transitionContext = nil;
-
-  tabSwitcher.animationDelegate = nil;
-  BOOL wasCancelled = [transitionContext transitionWasCancelled];
-  [transitionContext completeTransition:!wasCancelled];
-}
-
-- (void)tabSwitcherDismissalAnimationDidEnd:(id<TabSwitcher>)tabSwitcher {
-  // This animator does not expect to participate in dismissal animations, so it
-  // is an error if this method ever gets called.
-  NOTREACHED();
-}
-
-@end
diff --git a/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.h b/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.h
deleted file mode 100644
index db53969a..0000000
--- a/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_TAB_SWITCHER_TO_BVC_CONTAINER_ANIMATOR_H_
-#define IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_TAB_SWITCHER_TO_BVC_CONTAINER_ANIMATOR_H_
-
-#import <UIKit/UIKit.h>
-
-@protocol TabSwitcher;
-
-// This class provides an animator that can animate the transition from the tab
-// switcher to the BVC container.
-@interface TabSwitcherToBVCContainerAnimator
-    : NSObject<UIViewControllerAnimatedTransitioning>
-
-// The TabSwitcher to animate.
-@property(nonatomic, readwrite, weak) id<TabSwitcher> tabSwitcher;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_MAIN_TRANSITIONS_TAB_SWITCHER_TO_BVC_CONTAINER_ANIMATOR_H_
diff --git a/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.mm b/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.mm
deleted file mode 100644
index 8151f8bd..0000000
--- a/ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.mm
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/main/transitions/tab_switcher_to_bvc_container_animator.h"
-
-#import "base/mac/foundation_util.h"
-#import "ios/chrome/browser/ui/main/tab_switcher.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface TabSwitcherToBVCContainerAnimator ()<TabSwitcherAnimationDelegate>
-
-@property(nonatomic, readwrite, weak) id<UIViewControllerContextTransitioning>
-    transitionContext;
-
-@end
-
-@implementation TabSwitcherToBVCContainerAnimator
-
-@synthesize tabSwitcher = _tabSwitcher;
-@synthesize transitionContext = _transitionContext;
-
-- (NSTimeInterval)transitionDuration:
-    (id<UIViewControllerContextTransitioning>)transitionContext {
-  // This value is arbitrary, chosen to roughly match the visual length of the
-  // stack view animations.  The returned value does not appear to be used
-  // anywhere.  The actual transition does not complete until
-  // |tabSwitcherDismissalAnimationDidEnd:| is called, which happens as a
-  // result of a CoreAnimation completion block.
-  return 0.25;
-}
-
-// Tab switcher dismissal animations are currently driven by the tab switcher
-// itself.  MainController and this animator object are notified of progress
-// through delegate callbacks, but they do not directly participate in the
-// animation.  As a result, this animator is largely along for the ride.  It
-// does not initiate or control any animations, and its main responsibility is
-// to call |completeTransition| when the tab switcher is finished animating.
-- (void)animateTransition:
-    (id<UIViewControllerContextTransitioning>)transitionContext {
-  UIViewController* fromViewController = [transitionContext
-      viewControllerForKey:UITransitionContextFromViewControllerKey];
-  UIViewController* toViewController = [transitionContext
-      viewControllerForKey:UITransitionContextToViewControllerKey];
-
-  UIView* containerView = transitionContext.containerView;
-  UIView* fromView =
-      [transitionContext viewForKey:UITransitionContextFromViewKey];
-  UIView* toView = [transitionContext viewForKey:UITransitionContextToViewKey];
-  fromView.frame =
-      [transitionContext initialFrameForViewController:fromViewController];
-  toView.frame =
-      [transitionContext finalFrameForViewController:toViewController];
-
-  // This animator is responsible for adding the incoming view to the
-  // containerView for the presentation/dismissal.  Since the animations run in
-  // the tab switcher's view, order the subviews to ensure that the tab
-  // switcher's view remains on top.
-  [containerView addSubview:toView];
-  [containerView sendSubviewToBack:toView];
-
-  DCHECK_EQ(fromViewController,
-            [self.tabSwitcher viewController].parentViewController);
-  self.tabSwitcher.animationDelegate = self;
-  self.transitionContext = transitionContext;
-}
-
-#pragma mark - TabSwitcherAnimationDelegate
-
-- (void)tabSwitcherPresentationAnimationDidEnd:(id<TabSwitcher>)tabSwitcher {
-  // This animator does not expect to participate in presentation animations, so
-  // it is an error if this method ever gets called.
-  NOTREACHED();
-}
-
-- (void)tabSwitcherDismissalAnimationDidEnd:(id<TabSwitcher>)tabSwitcher {
-  // Calling |completeTransition:| seems to deallocate |self|, so make any
-  // necessary changes to |self| here, and be sure not to access |self| after
-  // the call to |completeTransition:|.
-  id<UIViewControllerContextTransitioning> transitionContext =
-      self.transitionContext;
-  self.tabSwitcher = nil;
-  self.transitionContext = nil;
-
-  tabSwitcher.animationDelegate = nil;
-  BOOL wasCancelled = [transitionContext transitionWasCancelled];
-  [transitionContext completeTransition:!wasCancelled];
-}
-
-@end
diff --git a/ios/chrome/browser/ui/main/view_controller_swapping.h b/ios/chrome/browser/ui/main/view_controller_swapping.h
index 8fcfb08c..ae7c5a93b 100644
--- a/ios/chrome/browser/ui/main/view_controller_swapping.h
+++ b/ios/chrome/browser/ui/main/view_controller_swapping.h
@@ -34,8 +34,6 @@
 - (void)showTabViewController:(UIViewController*)viewController
                    completion:(ProceduralBlock)completion;
 
-@optional
-
 // Perform any initial setup required for the appearance of |tabSwitcher|.
 - (void)prepareToShowTabSwitcher:(id<TabSwitcher>)tabSwitcher;
 
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn
index ace9d67..af5e786 100644
--- a/ios/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -42,8 +42,6 @@
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui_util",
     "//ios/chrome/browser/ui/ntp/recent_tabs",
-    "//ios/chrome/browser/ui/toolbar",
-    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
     "//ios/public/provider/chrome/browser/voice",
     "//ui/base",
   ]
@@ -123,7 +121,6 @@
     "//ios/chrome/browser/ui/context_menu",
     "//ios/chrome/browser/ui/favicon",
     "//ios/chrome/browser/ui/overscroll_actions",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller.h b/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
index ac752d1..5691fa8 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.h
@@ -10,7 +10,6 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/native_content_controller.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
 #import "ios/public/provider/chrome/browser/voice/logo_animation_controller.h"
 
 namespace ios {
@@ -41,7 +40,6 @@
 //
 @interface NewTabPageController
     : NativeContentController<LogoAnimationControllerOwnerOwner,
-                              ToolbarOwner,
                               UIGestureRecognizerDelegate,
                               UIScrollViewDelegate>
 
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
index fe0e59d..980b921 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_controller.mm
@@ -73,7 +73,7 @@
     ContentSuggestionsCoordinator* contentSuggestionsCoordinator;
 
 // Controller for the header of the Home panel.
-@property(nonatomic, strong) id<LogoAnimationControllerOwnerOwner, ToolbarOwner>
+@property(nonatomic, strong) id<LogoAnimationControllerOwnerOwner>
     headerController;
 
 @end
@@ -243,27 +243,6 @@
   return [self.headerController logoAnimationControllerOwner];
 }
 
-#pragma mark -
-#pragma mark ToolbarOwner
-
-- (CGRect)toolbarFrame {
-  return [self.headerController toolbarFrame];
-}
-
-- (id<ToolbarSnapshotProviding>)toolbarSnapshotProvider {
-  return self.headerController.toolbarSnapshotProvider;
-}
-
-- (CGFloat)toolbarHeight {
-  BOOL isRegularXRegular =
-      content_suggestions::IsRegularXRegularSizeClass(self.view);
-  // If the google landing controller is nil, there is no toolbar visible in the
-  // native content view, finally there is no toolbar on iPad.
-  return self.headerController && !isRegularXRegular
-             ? ntp_header::ToolbarHeight()
-             : 0.0;
-}
-
 @end
 
 @implementation NewTabPageController (TestSupport)
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
index c51e271c..6a82776 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
@@ -350,8 +350,6 @@
 
   [animator addAnimations:^{
     self.clearButtonView.alpha = 0;
-    self.clearButtonView.frame = CGRectLayoutOffset(
-        self.clearButtonView.frame, kToolbarButtonAnimationOffset);
   }];
   [animator addCompletion:^(UIViewAnimatingPosition finalPosition) {
     [self resetClearButton];
@@ -1088,12 +1086,7 @@
 
 - (CGFloat)clearButtonAnimationOffset {
   DCHECK(!IsRefreshLocationBarEnabled());
-
-  if ([self isTextFieldLTR]) {
-    return kToolbarButtonAnimationOffset;
-  } else {
-    return -kToolbarButtonAnimationOffset;
-  }
+  return 0;
 }
 
 // Calculates editing rect from |bounds| rect by adjusting for in-bounds
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_presenter.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_presenter.mm
index 2aba2c8..cce8aa4 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_presenter.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_legacy_presenter.mm
@@ -64,8 +64,7 @@
         ChromeDirectionalEdgeInsetsMake(0, 0, BottomPadding(), 0));
 
     // Add a shadow.
-    UIImageView* shadowView = [[UIImageView alloc]
-        initWithImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)];
+    UIImageView* shadowView = nil;
     [shadowView setUserInteractionEnabled:NO];
     [shadowView setTranslatesAutoresizingMaskIntoConstraints:NO];
     [popupContainer addSubview:shadowView];
diff --git a/ios/chrome/browser/ui/omnibox_perftest.mm b/ios/chrome/browser/ui/omnibox_perftest.mm
index a6c96082..64298e90 100644
--- a/ios/chrome/browser/ui/omnibox_perftest.mm
+++ b/ios/chrome/browser/ui/omnibox_perftest.mm
@@ -15,8 +15,8 @@
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #include "ios/chrome/browser/ui/toolbar/toolbar_model_delegate_ios.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/named_guide_util.h"
diff --git a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
index dd793b18..fcf66c2 100644
--- a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
+++ b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
@@ -31,7 +31,6 @@
     "//ios/chrome/browser/ui/page_info:coordinator",
     "//ios/chrome/browser/ui/static_content",
     "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/voice",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index 06b243e..292ef1d 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -20,7 +20,6 @@
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.h"
 #import "ios/chrome/browser/ui/page_info/page_info_legacy_coordinator.h"
 #include "ios/chrome/browser/ui/rtl_geometry.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h"
 #include "ios/web/public/features.h"
@@ -287,7 +286,6 @@
     _lockIncrementNotifications = [[NSMutableSet alloc] init];
     _lockNotificationsCounterparts = @{
       UIKeyboardWillHideNotification : UIKeyboardWillShowNotification,
-      kToolsMenuWillHideNotification : kToolsMenuWillShowNotification,
       kVoiceSearchWillHideNotification : kVoiceSearchWillShowNotification,
       kPageInfoWillHideNotification : kPageInfoWillShowNotification,
       kLocationBarResignsFirstResponderNotification :
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
index b5dd552..abb57d4 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
@@ -68,8 +68,6 @@
 const CGFloat kActionLabelFadeDuration = 0.1;
 // The final scale of the animation played when an action is triggered.
 const CGFloat kDisplayActionAnimationScale = 20;
-// The height of the shadow view.
-const CGFloat kShadowHeight = 2;
 // This controls how much the selection needs to be moved from the action center
 // in order to be snapped to the next action.
 // This value must stay in the interval [0,1].
@@ -189,8 +187,6 @@
 @property(nonatomic, assign) CGFloat horizontalOffset;
 // The internal state of the OverscrollActionsView.
 @property(nonatomic, assign) OverscrollViewState overscrollState;
-// A shadow image view displayed at the bottom.
-@property(nonatomic, strong) UIImageView* shadowView;
 // Redefined to readwrite.
 @property(nonatomic, strong, readwrite) UIView* backgroundView;
 // Snapshot view added on top of the background image view.
@@ -269,7 +265,6 @@
 @synthesize verticalOffset = _verticalOffset;
 @synthesize horizontalOffset = _horizontalOffset;
 @synthesize overscrollState = _overscrollState;
-@synthesize shadowView = _shadowView;
 @synthesize backgroundView = _backgroundView;
 @synthesize snapshotView = _snapshotView;
 @synthesize selectionCircleCroppingLayer = _selectionCircleCroppingLayer;
@@ -361,10 +356,6 @@
       [self addSubview:_closeTabLabel];
     }
 
-    _shadowView =
-        [[UIImageView alloc] initWithImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)];
-    [self addSubview:_shadowView];
-
     _backgroundView = [[UIView alloc] initWithFrame:CGRectZero];
     [self addSubview:_backgroundView];
 
@@ -497,10 +488,6 @@
   _selectionCircleCroppingLayer.frame = self.bounds;
   _highlightMaskLayer.frame = self.bounds;
 
-  CGRect shadowFrame = self.bounds;
-  shadowFrame.origin.y = self.bounds.size.height;
-  shadowFrame.size.height = kShadowHeight;
-  self.shadowView.frame = shadowFrame;
   [CATransaction commit];
 
   const BOOL disableActionsOnInitialLayout =
@@ -962,22 +949,18 @@
 - (void)setStyle:(OverscrollStyle)style {
   switch (style) {
     case OverscrollStyle::NTP_NON_INCOGNITO:
-      [self.shadowView setHidden:YES];
       self.backgroundColor = ntp_home::kNTPBackgroundColor();
       break;
     case OverscrollStyle::NTP_INCOGNITO:
-      [self.shadowView setHidden:YES];
       self.backgroundColor = [UIColor colorWithWhite:0 alpha:0];
       break;
     case OverscrollStyle::REGULAR_PAGE_NON_INCOGNITO:
-      [self.shadowView setHidden:NO];
       self.backgroundColor = [UIColor colorWithRed:242.0 / 256
                                              green:242.0 / 256
                                               blue:242.0 / 256
                                              alpha:1.0];
       break;
     case OverscrollStyle::REGULAR_PAGE_INCOGNITO:
-      [self.shadowView setHidden:NO];
       self.backgroundColor = [UIColor colorWithRed:80.0 / 256
                                              green:80.0 / 256
                                               blue:80.0 / 256
diff --git a/ios/chrome/browser/ui/payments/BUILD.gn b/ios/chrome/browser/ui/payments/BUILD.gn
index ce5578c..64aa0fd 100644
--- a/ios/chrome/browser/ui/payments/BUILD.gn
+++ b/ios/chrome/browser/ui/payments/BUILD.gn
@@ -268,7 +268,6 @@
     "//ios/chrome/browser/ui/autofill",
     "//ios/chrome/browser/ui/payments/cells",
     "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index c0be14d6..e86f6bff 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -33,7 +33,6 @@
     "//ios/chrome/browser/ui/popup_menu/public",
     "//ios/chrome/browser/ui/presenters",
     "//ios/chrome/browser/ui/reading_list",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
     "//ios/public/provider/chrome/browser",
@@ -48,21 +47,16 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
     "popup_menu_consumer.h",
-    "popup_menu_controller.h",
-    "popup_menu_controller.mm",
     "popup_menu_presenter.h",
     "popup_menu_presenter.mm",
     "popup_menu_table_view_controller.h",
     "popup_menu_table_view_controller.mm",
     "popup_menu_table_view_controller_commands.h",
-    "popup_menu_view.h",
-    "popup_menu_view.mm",
     "popup_menu_view_controller.h",
     "popup_menu_view_controller.mm",
   ]
   deps = [
     ":constants",
-    "resources:popup_background",
     "resources:popup_menu_add_bookmark",
     "resources:popup_menu_bookmarks",
     "resources:popup_menu_close_tab",
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_controller.h b/ios/chrome/browser/ui/popup_menu/popup_menu_controller.h
deleted file mode 100644
index 81503ed..0000000
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_controller.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 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 IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONTROLLER_H_
-
-#import <UIKit/UIKit.h>
-
-#include "base/ios/block_types.h"
-
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
-@class PopupMenuController;
-@class PopupMenuView;
-
-// A protocol required by delegates of the PopupMenuController.
-@protocol PopupMenuDelegate
-// Instructs the delegate the PopupMenuController is done and should be
-// dismissed.
-- (void)dismissPopupMenu:(PopupMenuController*)controller;
-@end
-
-// TODO(crbug.com/800266): Remove this class.
-// The base view controller for popup menus within the top toolbar like the
-// Tools menu.
-@interface PopupMenuController : NSObject
-
-// View that contains all subviews. Subclasses should add their views to
-// |containerView_|.
-@property(nonatomic, readonly, strong) UIView* containerView;
-// Displays the background and border of the popup.
-@property(nonatomic, readonly, strong) PopupMenuView* popupContainer;
-// Button used to dismiss the popup. Covers the entire window behind the popup
-// menu. Catches any touch events outside of the popup and invokes
-// |-tappedBehindPopup:| if there are any.
-@property(nonatomic, readonly, strong) UIButton* backgroundButton;
-// Delegate for the popup menu.
-@property(nonatomic, weak) id<PopupMenuDelegate> delegate;
-// Dispatcher for browser commands.
-@property(nonatomic, weak) id<ApplicationCommands, BrowserCommands> dispatcher;
-
-// Initializes the PopupMenuController and adds its views inside of parent.
-- (id)initWithParentView:(UIView*)parent;
-
-// The designated initializer.
-// Initializes the PopupMenuController and adds its views inside of parent.
-// Additional backgroundButton params are used to change the look and behavior
-// of |backgroundButton_|.
-// backgroundButtonParent is the view to add |backgroundButton_| to. If nil,
-// |backgroundButton_| is added to |containerView_|.
-// backgroundButtonColor is the backgroundColor to set for |backgroundButton_|.
-// backgroundButtonAlpha is the alpha to set for |backgroundButton_|.
-// backgroundButtonTag is the tag to set for |backgroundButton_|.
-// backgroundButtonSelector is the action to add for touch down events on
-// |backgroundButton_|.
-- (id)initWithParentView:(UIView*)parent
-      backgroundButtonParent:(UIView*)backgroundButtonParent
-       backgroundButtonColor:(UIColor*)backgroundButtonColor
-       backgroundButtonAlpha:(CGFloat)backgroundButtonAlpha
-         backgroundButtonTag:(NSInteger)backgroundButtonTag
-    backgroundButtonSelector:(SEL)backgroundButtonSelector;
-
-// Sets the optimal size of the popup needed to display its contents without
-// exceeding the bounds of the window. Also positions the arrow to point at
-// |origin|.
-- (void)setOptimalSize:(CGSize)optimalSize atOrigin:(CGPoint)origin;
-
-// Called when the user taps outside of the popup.
-- (void)tappedBehindPopup:(id)sender;
-
-// Called to display the popup with a fade in animation. |completion| is
-// executed once the fade animation is complete.
-- (void)fadeInPopupFromSource:(CGPoint)source
-                toDestination:(CGPoint)destination
-                   completion:(ProceduralBlock)completion;
-
-- (void)dismissAnimatedWithCompletion:(ProceduralBlock)completion;
-
-// Called to display the popup with a fade in animation. |completionBlock| is
-// executed once the fade animation is complete.
-- (void)fadeInPopup:(void (^)(BOOL finished))completionBlock;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_controller.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_controller.mm
deleted file mode 100644
index 08fdd87..0000000
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_controller.mm
+++ /dev/null
@@ -1,292 +0,0 @@
-// Copyright 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.
-
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_controller.h"
-
-#include "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#import "ios/chrome/browser/ui/animation_util.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_view.h"
-#include "ios/chrome/browser/ui/rtl_geometry.h"
-#import "ios/chrome/browser/ui/uikit_ui_util.h"
-#import "ios/chrome/common/material_timing.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using ios::material::TimingFunction;
-
-namespace {
-// Inset for the shadows of the contained views.
-static const CGFloat kPopupMenuVerticalInset = 11.0;
-// Duration for the Popup Menu Fade In animation
-static const CGFloat kFadeInAnimationDuration = 0.2;
-// Value to pass in for backgroundButtonTag to not set a tag value for
-// |backgroundButton_|.
-static const NSInteger kBackgroundButtonNoTag = -1;
-// Default width of the popup container.
-static const CGFloat kPopupContainerWidth = 236.0;
-// Default height of the popup container.
-static const CGFloat kPopupContainerHeight = 280.0;
-static const CGFloat kPopoverScaleFactor = 0.03;
-
-static void SetAnchorPoint(CGPoint anchorPoint, UIView* view) {
-  CGPoint oldOrigin = view.frame.origin;
-  view.layer.anchorPoint = anchorPoint;
-  CGPoint newOrigin = view.frame.origin;
-
-  CGPoint transition;
-  transition.x = newOrigin.x - oldOrigin.x;
-  transition.y = newOrigin.y - oldOrigin.y;
-
-  view.center =
-      CGPointMake(view.center.x - transition.x, view.center.y - transition.y);
-}
-
-static CGPoint AnimateInIntermediaryPoint(CGPoint source, CGPoint destination) {
-  CGPoint midPoint = CGPointZero;
-  midPoint.x = destination.x;
-  midPoint.y = source.y - 0.8 * fabs(destination.y - source.y);
-  return midPoint;
-}
-
-}  // anonymous namespace
-
-@interface PopupMenuController ()<PopupMenuViewDelegate> {
-  CGPoint sourceAnimationPoint_;
-}
-@end
-
-@implementation PopupMenuController
-
-@synthesize containerView = containerView_;
-@synthesize backgroundButton = backgroundButton_;
-@synthesize popupContainer = popupContainer_;
-@synthesize delegate = delegate_;
-@synthesize dispatcher = dispatcher_;
-
-- (id)initWithParentView:(UIView*)parent {
-  return [self initWithParentView:parent
-           backgroundButtonParent:nil
-            backgroundButtonColor:nil
-            backgroundButtonAlpha:1.0
-              backgroundButtonTag:kBackgroundButtonNoTag
-         backgroundButtonSelector:nil];
-}
-
-- (id)initWithParentView:(UIView*)parent
-      backgroundButtonParent:(UIView*)backgroundButtonParent
-       backgroundButtonColor:(UIColor*)backgroundButtonColor
-       backgroundButtonAlpha:(CGFloat)backgroundButtonAlpha
-         backgroundButtonTag:(NSInteger)backgroundButtonTag
-    backgroundButtonSelector:(SEL)backgroundButtonSelector {
-  DCHECK(parent);
-  self = [super init];
-  if (self) {
-    popupContainer_ = [[PopupMenuView alloc]
-        initWithFrame:CGRectMake(0, 0, kPopupContainerWidth,
-                                 kPopupContainerHeight)];
-
-    containerView_ = [[UIView alloc] initWithFrame:[parent bounds]];
-    containerView_.backgroundColor = [UIColor clearColor];
-    [containerView_ setAccessibilityViewIsModal:YES];
-    [popupContainer_ setDelegate:self];
-    // All views are added to the |containerView_| that in turn is added to the
-    // parent view. The Container View is needed to have a simple alpha
-    // transition when the menu is displayed or hidden.
-    [containerView_ addSubview:popupContainer_];
-    [parent addSubview:containerView_];
-
-    // Initialize backgroundButton_.
-    UIView* buttonParent =
-        backgroundButtonParent == nil ? containerView_ : backgroundButtonParent;
-    backgroundButton_ = [[UIButton alloc] initWithFrame:[buttonParent bounds]];
-    [buttonParent addSubview:backgroundButton_];
-    if (buttonParent == containerView_)
-      [buttonParent sendSubviewToBack:backgroundButton_];
-
-    backgroundButton_.autoresizingMask =
-        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth |
-        UIViewAutoresizingFlexibleBottomMargin |
-        UIViewAutoresizingFlexibleLeadingMargin();
-    backgroundButton_.alpha = backgroundButtonAlpha;
-    if (backgroundButtonTag != kBackgroundButtonNoTag)
-      backgroundButton_.tag = backgroundButtonTag;
-    if (backgroundButtonColor != nil) {
-      backgroundButton_.backgroundColor = backgroundButtonColor;
-    }
-    if (backgroundButtonSelector != nil) {
-      [backgroundButton_ addTarget:nil
-                            action:backgroundButtonSelector
-                  forControlEvents:UIControlEventTouchDown];
-    } else {
-      [backgroundButton_ addTarget:self
-                            action:@selector(tappedBehindPopup:)
-                  forControlEvents:UIControlEventTouchDown];
-    }
-    [backgroundButton_ setAccessibilityLabel:l10n_util::GetNSString(
-                                                 IDS_IOS_TOOLBAR_CLOSE_MENU)];
-  }
-  return self;
-}
-
-- (void)setOptimalSize:(CGSize)optimalSize atOrigin:(CGPoint)origin {
-  CGRect popupFrame = [popupContainer_ bounds];
-  popupFrame.size.width = optimalSize.width;
-  popupFrame.size.height = 2 * kPopupMenuVerticalInset + optimalSize.height;
-
-  // If the origin is on the right half of the screen, treat origin as the top-
-  // right coordinate instead of top-left.
-  CGFloat xOffset = origin.x > [containerView_ bounds].size.width / 2
-                        ? origin.x - popupFrame.size.width
-                        : origin.x;
-  [popupContainer_ setFrame:CGRectOffset(popupFrame, xOffset, origin.y)];
-}
-
-- (void)fadeInPopupFromSource:(CGPoint)source
-                toDestination:(CGPoint)destination
-                   completion:(ProceduralBlock)completion {
-  [self animateInFromPoint:source toPoint:destination completion:completion];
-  UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
-                                  containerView_);
-}
-
-- (void)dismissAnimatedWithCompletion:(void (^)(void))completion {
-  [self animateOutToPoint:sourceAnimationPoint_ completion:completion];
-  UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
-                                  nil);
-}
-
-// Animate the view on screen (Fade in).
-- (void)fadeInPopup:(void (^)(BOOL finished))completionBlock {
-  [UIView animateWithDuration:kFadeInAnimationDuration
-                        delay:0.0
-                      options:UIViewAnimationOptionAllowUserInteraction
-                   animations:^{
-                     [containerView_ setAlpha:1.0];
-                   }
-                   completion:completionBlock];
-}
-
-- (void)dealloc {
-  [popupContainer_ removeFromSuperview];
-  [backgroundButton_ removeFromSuperview];
-  [containerView_ removeFromSuperview];
-}
-
-- (void)tappedBehindPopup:(id)sender {
-  [self dismissPopupMenu];
-}
-
-- (void)animateInFromPoint:(CGPoint)source
-                   toPoint:(CGPoint)destination
-                completion:(ProceduralBlock)completion {
-  sourceAnimationPoint_ = source;
-
-  // Set anchor to top right for top right destinations.
-  NSUInteger anchorX =
-      destination.x > [containerView_ bounds].size.width / 2 ? 1 : 0;
-  SetAnchorPoint(CGPointMake(anchorX, 0), popupContainer_);
-
-  CGPoint midPoint = AnimateInIntermediaryPoint(source, destination);
-
-  CATransform3D scaleTransform =
-      CATransform3DMakeScale(kPopoverScaleFactor, kPopoverScaleFactor, 1);
-
-  NSValue* destinationScaleValue =
-      [NSValue valueWithCATransform3D:CATransform3DIdentity];
-
-  [CATransaction begin];
-  [CATransaction setCompletionBlock:^{
-    if (completion)
-      completion();
-  }];
-  CABasicAnimation* scaleAnimation =
-      [CABasicAnimation animationWithKeyPath:@"transform"];
-  CAMediaTimingFunction* easeOut = TimingFunction(ios::material::CurveEaseOut);
-  [scaleAnimation setFromValue:[NSValue valueWithCATransform3D:scaleTransform]];
-  [scaleAnimation setToValue:destinationScaleValue];
-  [scaleAnimation setTimingFunction:easeOut];
-  [scaleAnimation setDuration:ios::material::kDuration1];
-
-  CAKeyframeAnimation* positionAnimation =
-      [CAKeyframeAnimation animationWithKeyPath:@"position"];
-  [positionAnimation setValues:@[
-    [NSValue valueWithCGPoint:source], [NSValue valueWithCGPoint:source],
-    [NSValue valueWithCGPoint:midPoint], [NSValue valueWithCGPoint:destination]
-  ]];
-  [positionAnimation setTimingFunction:easeOut];
-  [positionAnimation setDuration:ios::material::kDuration1];
-  [positionAnimation setKeyTimes:@[ @0, @0.2, @0.5, @1 ]];
-
-  CAMediaTimingFunction* linear = TimingFunction(ios::material::CurveLinear);
-  CAAnimation* fadeAnimation = OpacityAnimationMake(0, 1);
-  [fadeAnimation setDuration:ios::material::kDuration2];
-  [fadeAnimation setTimingFunction:linear];
-  [fadeAnimation setBeginTime:ios::material::kDuration2];
-
-  CALayer* layer = [popupContainer_ layer];
-  [layer addAnimation:AnimationGroupMake(
-                          @[ scaleAnimation, positionAnimation, fadeAnimation ])
-               forKey:@"popup-in"];
-  [CATransaction commit];
-}
-
-- (void)animateOutToPoint:(CGPoint)destination
-               completion:(void (^)(void))completion {
-  CGPoint source = [[popupContainer_ layer] position];
-
-  CGPoint midPoint = CGPointZero;
-  midPoint.x = destination.x;
-  midPoint.y = source.y - 0.8 * fabs(destination.x - source.x);
-
-  CATransform3D scaleTransform =
-      CATransform3DMakeScale(kPopoverScaleFactor, kPopoverScaleFactor, 1);
-
-  CAMediaTimingFunction* easeIn = TimingFunction(ios::material::CurveEaseIn);
-  [CATransaction begin];
-  [CATransaction setAnimationTimingFunction:easeIn];
-  [CATransaction setAnimationDuration:ios::material::kDuration2];
-  [CATransaction setCompletionBlock:^{
-    if (completion)
-      completion();
-  }];
-
-  NSValue* sourceScaleValue =
-      [NSValue valueWithCATransform3D:CATransform3DIdentity];
-
-  CABasicAnimation* scaleAnimation =
-      [CABasicAnimation animationWithKeyPath:@"transform"];
-  [scaleAnimation setFromValue:sourceScaleValue];
-  [scaleAnimation setToValue:[NSValue valueWithCATransform3D:scaleTransform]];
-
-  CABasicAnimation* positionAnimation =
-      [CABasicAnimation animationWithKeyPath:@"position"];
-  [positionAnimation setFromValue:[NSValue valueWithCGPoint:source]];
-  [positionAnimation setToValue:[NSValue valueWithCGPoint:destination]];
-
-  CABasicAnimation* fadeAnimation =
-      [CABasicAnimation animationWithKeyPath:@"opacity"];
-  [fadeAnimation setFromValue:@1];
-  [fadeAnimation setToValue:@0];
-
-  CALayer* layer = [popupContainer_ layer];
-  [layer addAnimation:AnimationGroupMake(
-                          @[ scaleAnimation, positionAnimation, fadeAnimation ])
-               forKey:@"out"];
-
-  [CATransaction commit];
-}
-
-#pragma mark -
-#pragma mark PopupMenuViewDelegate
-
-- (void)dismissPopupMenu {
-  [delegate_ dismissPopupMenu:self];
-}
-
-@end
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index 3cd4c9774..62bf64a 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -23,7 +23,6 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_table_view_controller_commands.h"
 #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h"
 #import "ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
@@ -431,10 +430,6 @@
   [self.popupMenu itemsHaveChanged:@[ self.readingListItem ]];
 }
 
-- (void)unseenStateChanged:(BOOL)unseenItemsExist {
-  // TODO(crbug.com/800266): Remove this method.
-}
-
 #pragma mark - Popup updates (Private)
 
 // Updates the popup menu to have its state in sync with the current page
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_view.h b/ios/chrome/browser/ui/popup_menu/popup_menu_view.h
deleted file mode 100644
index 8775e4a..0000000
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_view.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 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 IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_VIEW_H_
-#define IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_VIEW_H_
-
-#import <UIKit/UIKit.h>
-
-// A protocol required by delegates of the PopupMenuController.
-@protocol PopupMenuViewDelegate
-// Instructs the delegate the popup menu view is done and should be
-// dismissed.
-- (void)dismissPopupMenu;
-@end
-
-// TODO(crbug.com/800266): Remove this class.
-@interface PopupMenuView : UIView
-@property(nonatomic, weak) id<PopupMenuViewDelegate> delegate;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_VIEW_H_
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_view.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_view.mm
deleted file mode 100644
index 7b08dcc..0000000
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_view.mm
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 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.
-
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_view.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-// The image edge insets for popup_background.png.
-NS_INLINE UIEdgeInsets PopupBackgroundInsets() {
-  return UIEdgeInsetsMake(28, 28, 28, 28);
-}
-};
-
-@implementation PopupMenuView {
-  UIImageView* imageView_;
-}
-
-@synthesize delegate = delegate_;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  self = [super initWithFrame:frame];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder*)aDecoder {
-  self = [super initWithCoder:aDecoder];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (void)commonInitialization {
-  UIImage* image = [UIImage imageNamed:@"popup_background"];
-  image = [image resizableImageWithCapInsets:PopupBackgroundInsets()];
-
-  imageView_ = [[UIImageView alloc] initWithImage:image];
-  [self addSubview:imageView_];
-}
-
-- (void)layoutSubviews {
-  [super layoutSubviews];
-  [imageView_ setFrame:[self bounds]];
-}
-
-- (BOOL)accessibilityPerformEscape {
-  if (delegate_) {
-    [delegate_ dismissPopupMenu];
-    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
-                                    nil);
-    return YES;
-  }
-  return NO;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
index 8c534fb..e152c0c 100644
--- a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
@@ -103,15 +103,6 @@
   ]
 }
 
-imageset("popup_background") {
-  sources = [
-    "popup_background.imageset/Contents.json",
-    "popup_background.imageset/popup_background.png",
-    "popup_background.imageset/popup_background@2x.png",
-    "popup_background.imageset/popup_background@3x.png",
-  ]
-}
-
 imageset("popup_menu_new_incognito_tab") {
   sources = [
     "popup_menu_new_incognito_tab.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/Contents.json
deleted file mode 100644
index 435d8198..0000000
--- a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "1x",
-            "filename": "popup_background.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "popup_background@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "popup_background@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background.png b/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background.png
deleted file mode 100644
index aad68d9..0000000
--- a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@2x.png
deleted file mode 100644
index aa987e9e..0000000
--- a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@3x.png
deleted file mode 100644
index e32e427..0000000
--- a/ios/chrome/browser/ui/popup_menu/resources/popup_background.imageset/popup_background@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/print/print_controller_egtest.mm b/ios/chrome/browser/ui/print/print_controller_egtest.mm
index 3f2ab2f..882b9c67 100644
--- a/ios/chrome/browser/ui/print/print_controller_egtest.mm
+++ b/ios/chrome/browser/ui/print/print_controller_egtest.mm
@@ -123,10 +123,7 @@
 - (void)printCurrentPage {
   // EarlGrey does not have the ability to interact with the share menu in
   // iOS11, so use the dispatcher to trigger the print view controller instead.
-  if (base::ios::IsRunningOnIOS11OrLater()) {
-    DCHECK(!IsUIRefreshPhase1Enabled());
-    [chrome_test_util::DispatcherForActiveViewController() printTab];
-  } else {
+  if (!base::ios::IsRunningOnIOS11OrLater()) {
     [ChromeEarlGreyUI openShareMenu];
     id<GREYMatcher> printButton =
         chrome_test_util::ButtonWithAccessibilityLabel(@"Print");
diff --git a/ios/chrome/browser/ui/qr_scanner/BUILD.gn b/ios/chrome/browser/ui/qr_scanner/BUILD.gn
index debaa4ff..2bfefd9 100644
--- a/ios/chrome/browser/ui/qr_scanner/BUILD.gn
+++ b/ios/chrome/browser/ui/qr_scanner/BUILD.gn
@@ -90,7 +90,6 @@
     "//ios/chrome/browser/ui/location_bar",
     "//ios/chrome/browser/ui/omnibox",
     "//ios/chrome/browser/ui/toolbar",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/base",
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn
index c60bf44..743e610 100644
--- a/ios/chrome/browser/ui/reading_list/BUILD.gn
+++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -210,7 +210,6 @@
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view:views",
     "//ios/chrome/browser/ui/table_view/cells",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
index 08c80676a0..63bb324 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -27,7 +27,6 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_url_cell_favicon_badge_view.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h"
 #import "ios/chrome/browser/ui/table_view/table_view_empty_view.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h b/ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h
index 4b635314..bb54f8c 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h
+++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h
@@ -14,9 +14,6 @@
 // Called when the reading list menu unread count has changed.
 - (void)unreadCountChanged:(NSInteger)unreadCount;
 
-// Called when the reading list menu seen state has changed.
-- (void)unseenStateChanged:(BOOL)unseenItemsExist;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_MENU_NOTIFICATION_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h
index b4630f5..08ca02e 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h
+++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h
@@ -22,9 +22,6 @@
 // The number of unread items in the reading list.
 - (NSInteger)readingListUnreadCount;
 
-// Whether the reading list has unseen items.
-- (BOOL)readingListUnseenItemsExist;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_MENU_NOTIFIER_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm
index 7b717fc..1ce0d55 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.mm
@@ -86,15 +86,10 @@
 
 - (void)readingListModelCompletedBatchUpdates:(const ReadingListModel*)model {
   [_delegate unreadCountChanged:model->unread_size()];
-  [_delegate unseenStateChanged:[self readingListUnseenItemsExist]];
 }
 
 - (NSInteger)readingListUnreadCount {
   return _readingListModel->unread_size();
 }
 
-- (BOOL)readingListUnseenItemsExist {
-  return _readingListModel->unseen_size() > 0;
-}
-
 @end
diff --git a/ios/chrome/browser/ui/sad_tab/BUILD.gn b/ios/chrome/browser/ui/sad_tab/BUILD.gn
index 2dc0f720..a87cbcb 100644
--- a/ios/chrome/browser/ui/sad_tab/BUILD.gn
+++ b/ios/chrome/browser/ui/sad_tab/BUILD.gn
@@ -56,7 +56,6 @@
     "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 2e773e2..50d039d 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -411,7 +411,6 @@
     "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings:test_support",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/ui/util:util",
     "//ios/chrome/test:test_support",
     "//ios/chrome/test/app:test_support",
diff --git a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
index 9c1a157..00f57ae 100644
--- a/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
+++ b/ios/chrome/browser/ui/settings/accounts_collection_egtest.mm
@@ -20,7 +20,6 @@
 #import "ios/chrome/browser/ui/authentication/account_control_item.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/ui/settings/autofill_credit_card_collection_view_controller.mm b/ios/chrome/browser/ui/settings/autofill_credit_card_collection_view_controller.mm
index ffca254..2483dd9 100644
--- a/ios/chrome/browser/ui/settings/autofill_credit_card_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill_credit_card_collection_view_controller.mm
@@ -16,7 +16,6 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h"
@@ -154,13 +153,8 @@
       initWithType:ItemTypeAutofillCardSwitchSubtitle];
   textItem.text =
       l10n_util::GetNSString(IDS_AUTOFILL_ENABLE_CREDIT_CARDS_TOGGLE_SUBLABEL);
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    textItem.textFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-    textItem.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
-  } else {
-    textItem.textFont = [[MDCTypography fontLoader] regularFontOfSize:14];
-    textItem.textColor = [[MDCPalette greyPalette] tint500];
-  }
+  textItem.textFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
+  textItem.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
   textItem.numberOfTextLines = 0;
   return textItem;
 }
diff --git a/ios/chrome/browser/ui/settings/autofill_credit_card_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill_credit_card_settings_egtest.mm
index e4edc19..abaedb4 100644
--- a/ios/chrome/browser/ui/settings/autofill_credit_card_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill_credit_card_settings_egtest.mm
@@ -11,7 +11,6 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/autofill_profile_collection_view_controller.mm b/ios/chrome/browser/ui/settings/autofill_profile_collection_view_controller.mm
index 80c524b..9a289f3 100644
--- a/ios/chrome/browser/ui/settings/autofill_profile_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill_profile_collection_view_controller.mm
@@ -15,7 +15,6 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h"
@@ -153,13 +152,8 @@
       initWithType:ItemTypeAutofillAddressSwitchSubtitle];
   textItem.text =
       l10n_util::GetNSString(IDS_AUTOFILL_ENABLE_PROFILES_TOGGLE_SUBLABEL);
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    textItem.textFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-    textItem.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
-  } else {
-    textItem.textFont = [[MDCTypography fontLoader] regularFontOfSize:14];
-    textItem.textColor = [[MDCPalette greyPalette] tint500];
-  }
+  textItem.textFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
+  textItem.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
   textItem.numberOfTextLines = 0;
   return textItem;
 }
diff --git a/ios/chrome/browser/ui/settings/autofill_profile_settings_egtest.mm b/ios/chrome/browser/ui/settings/autofill_profile_settings_egtest.mm
index 9d21872..707877a 100644
--- a/ios/chrome/browser/ui/settings/autofill_profile_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill_profile_settings_egtest.mm
@@ -10,7 +10,6 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/block_popups_egtest.mm b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
index 6f755768..2b0486d 100644
--- a/ios/chrome/browser/ui/settings/block_popups_egtest.mm
+++ b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
@@ -10,7 +10,6 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #include "ios/chrome/test/app/navigation_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn
index 4fbac99..680f868a6 100644
--- a/ios/chrome/browser/ui/settings/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -52,7 +52,6 @@
     "//components/autofill/core/browser",
     "//components/strings",
     "//ios/chrome/app/strings",
-    "//ios/chrome/browser",
     "//ios/chrome/browser/browsing_data",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/collection_view/cells",
diff --git a/ios/chrome/browser/ui/settings/cells/account_signin_item.mm b/ios/chrome/browser/ui/settings/cells/account_signin_item.mm
index 60146dd..2322b4c 100644
--- a/ios/chrome/browser/ui/settings/cells/account_signin_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/account_signin_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/account_signin_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
@@ -101,17 +100,11 @@
   _imageView.layer.masksToBounds = YES;
   _imageView.contentMode = UIViewContentModeScaleAspectFit;
 
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    _textLabel.font = [UIFont systemFontOfSize:kMainTextFontSize];
-    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    _detailTextLabel.font = [UIFont systemFontOfSize:kDetailTextFontSize];
-    _detailTextLabel.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
-  } else {
-    _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-    _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    _detailTextLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14];
-    _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-  }
+  _textLabel.font = [UIFont systemFontOfSize:kMainTextFontSize];
+  _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
+
+  _detailTextLabel.font = [UIFont systemFontOfSize:kDetailTextFontSize];
+  _detailTextLabel.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
 }
 
 - (void)setViewConstraints {
diff --git a/ios/chrome/browser/ui/settings/cells/autofill_data_item.mm b/ios/chrome/browser/ui/settings/cells/autofill_data_item.mm
index 734113be..03f6dece 100644
--- a/ios/chrome/browser/ui/settings/cells/autofill_data_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/autofill_data_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/autofill_data_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -92,31 +91,19 @@
 - (void)setDefaultViewStyling {
   _textLabel.numberOfLines = 0;
   _textLabel.lineBreakMode = NSLineBreakByWordWrapping;
+  _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+  _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
 
   _leadingDetailTextLabel.numberOfLines = 0;
   _leadingDetailTextLabel.lineBreakMode = NSLineBreakByWordWrapping;
+  _leadingDetailTextLabel.font =
+      [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
+  _leadingDetailTextLabel.textColor =
+      UIColorFromRGB(kUIKitMultilineDetailTextColor);
 
-  // Fonts and colors vary when UI reboot is enabled.
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    _leadingDetailTextLabel.font =
-        [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-    _leadingDetailTextLabel.textColor =
-        UIColorFromRGB(kUIKitMultilineDetailTextColor);
-    _trailingDetailTextLabel.font =
-        [UIFont systemFontOfSize:kUIKitDetailFontSize];
-    _trailingDetailTextLabel.textColor = UIColorFromRGB(kUIKitDetailTextColor);
-  } else {
-    _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-    _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    _leadingDetailTextLabel.font =
-        [[MDCTypography fontLoader] regularFontOfSize:14];
-    _leadingDetailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-    _trailingDetailTextLabel.font =
-        [[MDCTypography fontLoader] regularFontOfSize:12];
-    _trailingDetailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-  }
+  _trailingDetailTextLabel.font =
+      [UIFont systemFontOfSize:kUIKitDetailFontSize];
+  _trailingDetailTextLabel.textColor = UIColorFromRGB(kUIKitDetailTextColor);
 }
 
 // Sets constraints on subviews.
diff --git a/ios/chrome/browser/ui/settings/cells/card_multiline_item.mm b/ios/chrome/browser/ui/settings/cells/card_multiline_item.mm
index 7d83fb14..71597a3 100644
--- a/ios/chrome/browser/ui/settings/cells/card_multiline_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/card_multiline_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/card_multiline_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
@@ -56,17 +55,10 @@
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
     _textLabel.numberOfLines = 0;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     [contentView addSubview:_textLabel];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    }
-
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_textLabel.leadingAnchor
diff --git a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
index 64874f3..08651196 100644
--- a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.h"
 
 #include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -54,27 +53,17 @@
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
     _textLabel.text =
         l10n_util::GetNSString(IDS_IOS_AUTOFILL_DESCRIBE_LOCAL_COPY);
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     [_textLabel
         setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
                                         forAxis:
                                             UILayoutConstraintAxisHorizontal];
     [contentView addSubview:_textLabel];
 
-    // Fonts, colors, and buttons vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-
-      _button = [UIButton buttonWithType:UIButtonTypeCustom];
-      [_button setTitleColor:UIColorFromRGB(kUIKitFooterLinkColor)
-                    forState:UIControlStateNormal];
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-      _button = [[MDCFlatButton alloc] init];
-      [_button setTitleColor:[[MDCPalette cr_bluePalette] tint600]
-                    forState:UIControlStateNormal];
-    }
+    _button = [UIButton buttonWithType:UIButtonTypeCustom];
+    [_button setTitleColor:UIColorFromRGB(kUIKitFooterLinkColor)
+                  forState:UIControlStateNormal];
 
     _button.translatesAutoresizingMaskIntoConstraints = NO;
     [_button
diff --git a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item_unittest.mm b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item_unittest.mm
index 2dbb424..db322da 100644
--- a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item_unittest.mm
+++ b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item_unittest.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.h"
 
 #include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -34,9 +33,6 @@
 
   NSString* buttonText =
       l10n_util::GetNSString(IDS_AUTOFILL_CLEAR_LOCAL_COPY_BUTTON);
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    buttonText = [buttonText uppercaseString];
-  }
   EXPECT_NSEQ(buttonText,
               [copiedToChromeCell.button titleForState:UIControlStateNormal]);
 }
diff --git a/ios/chrome/browser/ui/settings/cells/encryption_item.mm b/ios/chrome/browser/ui/settings/cells/encryption_item.mm
index cee76c0..f31666f1 100644
--- a/ios/chrome/browser/ui/settings/cells/encryption_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/encryption_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/encryption_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -74,15 +73,10 @@
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
     _textLabel.numberOfLines = 0;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     [self.contentView addSubview:_textLabel];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-    }
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_textLabel.leadingAnchor
diff --git a/ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_item.mm b/ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_item.mm
index 73ff1a69..925aafa4 100644
--- a/ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/import_data_multiline_detail_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -62,28 +61,18 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     [contentView addSubview:_textLabel];
 
     _detailTextLabel = [[UILabel alloc] init];
     _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
     _detailTextLabel.numberOfLines = 0;
+    _detailTextLabel.font =
+        [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
+    _detailTextLabel.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
     [contentView addSubview:_detailTextLabel];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-      _detailTextLabel.font =
-          [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-      _detailTextLabel.textColor =
-          UIColorFromRGB(kUIKitMultilineDetailTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-      _detailTextLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14];
-      _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-    }
-
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_textLabel.leadingAnchor
diff --git a/ios/chrome/browser/ui/settings/cells/passphrase_error_item.mm b/ios/chrome/browser/ui/settings/cells/passphrase_error_item.mm
index 055dc5cb..b96a5ae 100644
--- a/ios/chrome/browser/ui/settings/cells/passphrase_error_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/passphrase_error_item.mm
@@ -6,7 +6,6 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
@@ -56,6 +55,7 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
     _textLabel.textColor = [[MDCPalette cr_redPalette] tint500];
     [contentView addSubview:_textLabel];
 
@@ -64,13 +64,6 @@
     _errorImageView.image = [UIImage imageNamed:@"encryption_error"];
     [contentView addSubview:_errorImageView];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-    }
-
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_errorImageView.leadingAnchor
diff --git a/ios/chrome/browser/ui/settings/cells/password_details_item.mm b/ios/chrome/browser/ui/settings/cells/password_details_item.mm
index 6209169e..bf89cc9 100644
--- a/ios/chrome/browser/ui/settings/cells/password_details_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/password_details_item.mm
@@ -7,7 +7,6 @@
 #import <CoreGraphics/CoreGraphics.h>
 #import <UIKit/UIKit.h>
 
-#include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/common/ui_util/constraints_ui_util.h"
@@ -69,18 +68,11 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _textLabel.numberOfLines = 0;
     [contentView addSubview:_textLabel];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    }
-
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_textLabel.leadingAnchor
diff --git a/ios/chrome/browser/ui/settings/cells/settings_detail_item.mm b/ios/chrome/browser/ui/settings/cells/settings_detail_item.mm
index 8e4f013..adb849162 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_detail_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_detail_item.mm
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -102,27 +101,18 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _textLabel.backgroundColor = [UIColor clearColor];
     [contentView addSubview:_textLabel];
 
     _detailTextLabel = [[UILabel alloc] init];
     _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _detailTextLabel.font = [UIFont systemFontOfSize:kUIKitDetailFontSize];
+    _detailTextLabel.textColor = UIColorFromRGB(kUIKitDetailTextColor);
     _detailTextLabel.backgroundColor = [UIColor clearColor];
     [contentView addSubview:_detailTextLabel];
 
-    // Fonts and colors vary based on whether the settings reboot is enabled.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-      _detailTextLabel.font = [UIFont systemFontOfSize:kUIKitDetailFontSize];
-      _detailTextLabel.textColor = UIColorFromRGB(kUIKitDetailTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-      _detailTextLabel.font = [[MDCTypography fontLoader] regularFontOfSize:14];
-      _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-    }
-
     // Set up the width constraints. They are activated here and updated in
     // layoutSubviews.
     _textLabelWidthConstraint =
@@ -176,12 +166,6 @@
 
 - (void)setIconImage:(UIImage*)image {
   BOOL hidden = (image == nil);
-
-  // If the settings reboot is not enabled, the icon must always be hidden.
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    hidden = YES;
-  }
-
   if (hidden == _iconImageView.hidden) {
     return;
   }
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm b/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm
index 6854e48..f28b337 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_switch_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -99,26 +98,18 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _textLabel.numberOfLines = 0;
     [self.contentView addSubview:_textLabel];
 
     _switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
     _switchView.translatesAutoresizingMaskIntoConstraints = NO;
+    _switchView.onTintColor = UIColorFromRGB(kUIKitSwitchTintColor);
     _switchView.accessibilityHint = l10n_util::GetNSString(
         IDS_IOS_TOGGLE_SETTING_SWITCH_ACCESSIBILITY_HINT);
     [self.contentView addSubview:_switchView];
 
-    // Fonts and colors vary depending on whether UIRefresh is enabled.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-      _switchView.onTintColor = UIColorFromRGB(kUIKitSwitchTintColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-      _switchView.onTintColor = [[MDCPalette cr_bluePalette] tint500];
-    }
-
     // Set up the constraints assuming that the icon image is hidden..
     _iconVisibleConstraint = [_textLabel.leadingAnchor
         constraintEqualToAnchor:_iconImageView.trailingAnchor
@@ -157,24 +148,13 @@
 }
 
 + (UIColor*)defaultTextColorForState:(UIControlState)state {
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    return (state & UIControlStateDisabled)
-               ? UIColorFromRGB(kUIKitDetailTextColor)
-               : UIColorFromRGB(kUIKitMainTextColor);
-  } else {
-    MDCPalette* grey = [MDCPalette greyPalette];
-    return (state & UIControlStateDisabled) ? grey.tint500 : grey.tint900;
-  }
+  return (state & UIControlStateDisabled)
+             ? UIColorFromRGB(kUIKitDetailTextColor)
+             : UIColorFromRGB(kUIKitMainTextColor);
 }
 
 - (void)setIconImage:(UIImage*)image {
   BOOL hidden = (image == nil);
-
-  // If the settings reboot is not enabled, the icon must always be hidden.
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    hidden = YES;
-  }
-
   if (hidden == self.iconImageView.hidden) {
     return;
   }
diff --git a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm b/ios/chrome/browser/ui/settings/cells/settings_text_item.mm
index a18b378e..77ae02c8 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_text_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_text_item.mm
@@ -8,7 +8,6 @@
 #error "This file requires ARC support."
 #endif
 
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -67,44 +66,28 @@
 
 - (UIFont*)textFont {
   if (!_textFont) {
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textFont = [UIFont systemFontOfSize:kUIKitMainFontSize];
-    } else {
-      _textFont = [[MDCTypography fontLoader] mediumFontOfSize:14];
-    }
+    _textFont = [UIFont systemFontOfSize:kUIKitMainFontSize];
   }
   return _textFont;
 }
 
 - (UIColor*)textColor {
   if (!_textColor) {
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textColor = UIColorFromRGB(kUIKitMainTextColor);
-    } else {
-      _textColor = [[MDCPalette greyPalette] tint900];
-    }
+    _textColor = UIColorFromRGB(kUIKitMainTextColor);
   }
   return _textColor;
 }
 
 - (UIFont*)detailTextFont {
   if (!_detailTextFont) {
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _detailTextFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-    } else {
-      _detailTextFont = [[MDCTypography fontLoader] regularFontOfSize:14];
-    }
+    _detailTextFont = [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
   }
   return _detailTextFont;
 }
 
 - (UIColor*)detailTextColor {
   if (!_detailTextColor) {
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _detailTextColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
-    } else {
-      _detailTextColor = [[MDCPalette greyPalette] tint500];
-    }
+    _detailTextColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
   }
   return _detailTextColor;
 }
diff --git a/ios/chrome/browser/ui/settings/cells/sync_switch_item.mm b/ios/chrome/browser/ui/settings/cells/sync_switch_item.mm
index 901e1e4..a28697ea 100644
--- a/ios/chrome/browser/ui/settings/cells/sync_switch_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/sync_switch_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/sync_switch_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
@@ -83,11 +82,16 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _textLabel.numberOfLines = 0;
     [self.contentView addSubview:_textLabel];
 
     _detailTextLabel = [[UILabel alloc] init];
     _detailTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _detailTextLabel.font =
+        [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
+    _detailTextLabel.textColor = UIColorFromRGB(kUIKitMultilineDetailTextColor);
     _detailTextLabel.numberOfLines = 0;
     [self.contentView addSubview:_detailTextLabel];
 
@@ -95,26 +99,9 @@
     _switchView.translatesAutoresizingMaskIntoConstraints = NO;
     _switchView.accessibilityHint = l10n_util::GetNSString(
         IDS_IOS_TOGGLE_SETTING_SWITCH_ACCESSIBILITY_HINT);
+    _switchView.onTintColor = UIColorFromRGB(kUIKitSwitchTintColor);
     [self.contentView addSubview:_switchView];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-      _detailTextLabel.font =
-          [UIFont systemFontOfSize:kUIKitMultilineDetailFontSize];
-      _detailTextLabel.textColor =
-          UIColorFromRGB(kUIKitMultilineDetailTextColor);
-      ;
-      _switchView.onTintColor = UIColorFromRGB(kUIKitSwitchTintColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-      _detailTextLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _detailTextLabel.textColor = [[MDCPalette greyPalette] tint500];
-      _switchView.onTintColor = [[MDCPalette cr_bluePalette] tint500];
-    }
-
     [self setConstraints];
   }
 
diff --git a/ios/chrome/browser/ui/settings/cells/text_and_error_item.mm b/ios/chrome/browser/ui/settings/cells/text_and_error_item.mm
index 7fab370..893e88b9 100644
--- a/ios/chrome/browser/ui/settings/cells/text_and_error_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/text_and_error_item.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/ui/settings/cells/text_and_error_item.h"
 
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
@@ -93,20 +92,14 @@
     self.contentView.clipsToBounds = YES;
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
     _textLabel.numberOfLines = 0;
     [self.contentView addSubview:_textLabel];
     _errorIcon = [[UIImageView alloc] init];
     _errorIcon.translatesAutoresizingMaskIntoConstraints = NO;
     [self.contentView addSubview:_errorIcon];
 
-    // Fonts and colors vary based on the UI reboot experiment.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitMainFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitMainTextColor);
-    } else {
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    }
     [self setConstraints];
   }
   return self;
diff --git a/ios/chrome/browser/ui/settings/cells/version_item.mm b/ios/chrome/browser/ui/settings/cells/version_item.mm
index fcd2ef8e..4ba799fb 100644
--- a/ios/chrome/browser/ui/settings/cells/version_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/version_item.mm
@@ -4,7 +4,6 @@
 
 #import "ios/chrome/browser/ui/settings/cells/version_item.h"
 
-#import "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -51,21 +50,12 @@
 
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _textLabel.font = [UIFont systemFontOfSize:kUIKitFooterFontSize];
+    _textLabel.textColor = UIColorFromRGB(kUIKitFooterTextColor);
     _textLabel.backgroundColor = [UIColor clearColor];
     _textLabel.textAlignment = NSTextAlignmentCenter;
     [self addSubview:_textLabel];
 
-    // Fonts and colors vary when the UI reboot experiment is enabled.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      _textLabel.font = [UIFont systemFontOfSize:kUIKitFooterFontSize];
-      _textLabel.textColor = UIColorFromRGB(kUIKitFooterTextColor);
-    } else {
-      _textLabel.shadowOffset = CGSizeMake(1, 0);
-      _textLabel.shadowColor = [UIColor whiteColor];
-      _textLabel.font = [[MDCTypography fontLoader] mediumFontOfSize:14];
-      _textLabel.textColor = [[MDCPalette greyPalette] tint900];
-    }
-
     // Set up the constraints.
     [NSLayoutConstraint activateConstraints:@[
       [_textLabel.centerXAnchor constraintEqualToAnchor:self.centerXAnchor],
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_egtest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_egtest.mm
index 7b6aaf5a0..12aa1c1 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_egtest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_egtest.mm
@@ -7,7 +7,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
index 2c3917c1..0fa936f 100644
--- a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
@@ -23,7 +23,6 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
 #import "ios/chrome/browser/ui/settings/reauthentication_module.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm
index ad3f395..9578d54 100644
--- a/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_collection_view_controller.mm
@@ -416,15 +416,6 @@
 
   // Basics section
   [model addSectionWithIdentifier:SectionIdentifierBasics];
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    SettingsTextItem* basicsHeader =
-        [[SettingsTextItem alloc] initWithType:ItemTypeHeader];
-    basicsHeader.text =
-        l10n_util::GetNSString(IDS_IOS_OPTIONS_GENERAL_TAB_LABEL);
-    basicsHeader.textColor = [[MDCPalette greyPalette] tint500];
-    [model setHeader:basicsHeader
-        forSectionWithIdentifier:SectionIdentifierBasics];
-  }
   [model addItem:[self searchEngineDetailItem]
       toSectionWithIdentifier:SectionIdentifierBasics];
   [model addItem:[self savePasswordsDetailItem]
@@ -436,15 +427,6 @@
 
   // Advanced Section
   [model addSectionWithIdentifier:SectionIdentifierAdvanced];
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    SettingsTextItem* advancedHeader =
-        [[SettingsTextItem alloc] initWithType:ItemTypeHeader];
-    advancedHeader.text =
-        l10n_util::GetNSString(IDS_IOS_OPTIONS_ADVANCED_TAB_LABEL);
-    advancedHeader.textColor = [[MDCPalette greyPalette] tint500];
-    [model setHeader:advancedHeader
-        forSectionWithIdentifier:SectionIdentifierAdvanced];
-  }
   [model addItem:[self voiceSearchDetailItem]
       toSectionWithIdentifier:SectionIdentifierAdvanced];
   [model addItem:[self privacyDetailItem]
@@ -469,14 +451,6 @@
   // Debug Section
   if ([self hasDebugSection]) {
     [model addSectionWithIdentifier:SectionIdentifierDebug];
-    if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-      SettingsTextItem* debugHeader =
-          [[SettingsTextItem alloc] initWithType:ItemTypeHeader];
-      debugHeader.text = @"Debug";
-      debugHeader.textColor = [[MDCPalette greyPalette] tint500];
-      [model setHeader:debugHeader
-          forSectionWithIdentifier:SectionIdentifierDebug];
-    }
   }
 
   if (experimental_flags::IsMemoryDebuggingEnabled()) {
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm
index bf91cba..b1c3bf9 100644
--- a/ios/chrome/browser/ui/settings/settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -23,7 +23,6 @@
 #include "ios/chrome/browser/pref_names.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/browser_view_controller.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
index 5551c51..63bbf351 100644
--- a/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_navigation_controller.mm
@@ -7,7 +7,6 @@
 #include "base/mac/foundation_util.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/experimental_flags.h"
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
@@ -570,12 +569,9 @@
     ConfigureAppBarViewControllerWithCardStyle(
         appBarContainer.appBarViewController);
 
-    // Override the header view's background color if the UIRefresh experiment
-    // is enabled.
-    if (experimental_flags::IsSettingsUIRebootEnabled()) {
-      appBarContainer.appBarViewController.headerView.backgroundColor =
-          [UIColor groupTableViewBackgroundColor];
-    }
+    // Override the header view's background color.
+    appBarContainer.appBarViewController.headerView.backgroundColor =
+        [UIColor groupTableViewBackgroundColor];
 
     // Register the app bar container and return it.
     [self registerAppBarContainer:appBarContainer];
diff --git a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
index ea4072f..50541e78 100644
--- a/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_root_collection_view_controller.mm
@@ -8,7 +8,6 @@
 #import "base/mac/foundation_util.h"
 
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
@@ -56,16 +55,11 @@
       self.collectionViewAccessibilityIdentifier;
 
   // Customize collection view settings.
-  if (experimental_flags::IsSettingsUIRebootEnabled()) {
-    self.collectionView.backgroundColor =
-        [UIColor groupTableViewBackgroundColor];
-    self.styler.cellStyle = MDCCollectionViewCellStyleGrouped;
-    self.styler.separatorColor = UIColorFromRGB(kUIKitSeparatorColor);
-    self.appBarViewController.headerView.backgroundColor =
-        [UIColor groupTableViewBackgroundColor];
-  } else {
-    self.styler.cellStyle = MDCCollectionViewCellStyleCard;
-  }
+  self.collectionView.backgroundColor = [UIColor groupTableViewBackgroundColor];
+  self.styler.cellStyle = MDCCollectionViewCellStyleGrouped;
+  self.styler.separatorColor = UIColorFromRGB(kUIKitSeparatorColor);
+  self.appBarViewController.headerView.backgroundColor =
+      [UIColor groupTableViewBackgroundColor];
   self.styler.separatorInset = UIEdgeInsetsMake(0, 16, 0, 16);
 }
 
diff --git a/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm
index 6f729c6..7295678d 100644
--- a/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/sync_create_passphrase_collection_view_controller.mm
@@ -10,7 +10,6 @@
 #import "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "components/strings/grit/components_strings.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/settings/cells/byo_textfield_item.h"
@@ -87,9 +86,6 @@
 - (CollectionViewItem*)confirmPassphraseItem {
   if (!confirmPassphrase_) {
     confirmPassphrase_ = [[UITextField alloc] init];
-    if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-      [confirmPassphrase_ setFont:[MDCTypography body1Font]];
-    }
     [confirmPassphrase_ setSecureTextEntry:YES];
     [confirmPassphrase_ setBackgroundColor:[UIColor clearColor]];
     [confirmPassphrase_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
diff --git a/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm b/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm
index f212577..3cb47b2d 100644
--- a/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/sync_encryption_passphrase_collection_view_controller.mm
@@ -18,7 +18,6 @@
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
-#import "ios/chrome/browser/experimental_flags.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/signin/profile_oauth2_token_service_factory.h"
@@ -239,9 +238,6 @@
     [self unregisterTextField:passphrase_];
   }
   passphrase_ = [[UITextField alloc] init];
-  if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-    [passphrase_ setFont:[MDCTypography body1Font]];
-  }
   [passphrase_ setSecureTextEntry:YES];
   [passphrase_ setBackgroundColor:[UIColor clearColor]];
   [passphrase_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
@@ -317,29 +313,6 @@
   return MDCCellDefaultOneLineHeight;
 }
 
-#pragma mark - UICollectionViewDataSource
-
-- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
-                 cellForItemAtIndexPath:(NSIndexPath*)indexPath {
-  UICollectionViewCell* cell =
-      [super collectionView:collectionView cellForItemAtIndexPath:indexPath];
-  CollectionViewItem* item =
-      [self.collectionViewModel itemAtIndexPath:indexPath];
-  if (item.type == ItemTypeMessage) {
-    // Changing the font weight may reflow the text onto a different number of
-    // lines, but the collection view doesn't know that it needs to layout the
-    // cell again. Sidestep this bug by leaving the font at a normal weight
-    // under UIRefresh.
-    if (!experimental_flags::IsSettingsUIRebootEnabled()) {
-      CardMultilineCell* messageCell =
-          base::mac::ObjCCastStrict<CardMultilineCell>(cell);
-      messageCell.textLabel.font =
-          [[MDCTypography fontLoader] mediumFontOfSize:14];
-    }
-  }
-  return cell;
-}
-
 #pragma mark - UICollectionViewDelegate
 
 - (void)collectionView:(UICollectionView*)collectionView
diff --git a/ios/chrome/browser/ui/settings/sync_utils/BUILD.gn b/ios/chrome/browser/ui/settings/sync_utils/BUILD.gn
index cf8041694..a9a7087 100644
--- a/ios/chrome/browser/ui/settings/sync_utils/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync_utils/BUILD.gn
@@ -55,8 +55,6 @@
     "//ios/chrome/browser/ui/authentication:authentication_ui",
     "//ios/chrome/browser/ui/authentication:eg_test_support",
     "//ios/chrome/browser/ui/settings",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/public/provider/chrome/browser/signin:test_support",
diff --git a/ios/chrome/browser/ui/settings/sync_utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync_utils/sync_fake_server_egtest.mm
index 7051200..6582cf0 100644
--- a/ios/chrome/browser/ui/settings/sync_utils/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/settings/sync_utils/sync_fake_server_egtest.mm
@@ -21,8 +21,6 @@
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/bookmarks_test_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/browser/ui/settings/translate_ui_egtest.mm b/ios/chrome/browser/ui/settings/translate_ui_egtest.mm
index 77405bd..b57c03c 100644
--- a/ios/chrome/browser/ui/settings/translate_ui_egtest.mm
+++ b/ios/chrome/browser/ui/settings/translate_ui_egtest.mm
@@ -5,7 +5,6 @@
 #import <EarlGrey/EarlGrey.h>
 #import <XCTest/XCTest.h>
 
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/ui/side_swipe/BUILD.gn b/ios/chrome/browser/ui/side_swipe/BUILD.gn
index 5261ca7..8398562 100644
--- a/ios/chrome/browser/ui/side_swipe/BUILD.gn
+++ b/ios/chrome/browser/ui/side_swipe/BUILD.gn
@@ -56,7 +56,6 @@
     ":side_swipe",
     "//base",
     "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/ui/toolbar",
     "//ios/web/public/test",
     "//testing/gtest",
     "//third_party/ocmock",
@@ -75,7 +74,7 @@
     "//base",
     "//ios/chrome/browser",
     "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/ui/toolbar/adaptive:adaptive_ui",
+    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
diff --git a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
index 16a36ad..a0d9496 100644
--- a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
+++ b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
@@ -10,7 +10,6 @@
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
-#include "ios/chrome/browser/chrome_url_constants.h"
 #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
@@ -61,8 +60,6 @@
 
 @implementation SwipeView {
   UIImageView* _image;
-  // TODO(crbug.com/800266): Remove the shadow.
-  UIImageView* _shadowView;
 }
 
 @synthesize topToolbarSnapshot = _topToolbarSnapshot;
@@ -87,12 +84,6 @@
     _bottomToolbarSnapshot = [[UIImageView alloc] initWithFrame:CGRectZero];
     [self addSubview:_bottomToolbarSnapshot];
 
-    if (!IsUIRefreshPhase1Enabled()) {
-      _shadowView = [[UIImageView alloc] initWithFrame:self.bounds];
-      [_shadowView setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW)];
-      [self addSubview:_shadowView];
-    }
-
     // All subviews are as wide as the parent
     NSMutableArray* constraints = [NSMutableArray array];
     for (UIView* view in self.subviews) {
@@ -155,7 +146,7 @@
   [self updateImageBoundsAndZoom];
 }
 
-- (void)setTopToolbarImage:(UIImage*)image isNewTabPage:(BOOL)isNewTabPage {
+- (void)setTopToolbarImage:(UIImage*)image {
   [self.topToolbarSnapshot setImage:image];
   if (!base::FeatureList::IsEnabled(
           web::features::kBrowserContainerFullscreen)) {
@@ -163,7 +154,6 @@
     self.toolbarTopConstraint.constant = -StatusBarHeight();
   }
   [self.topToolbarSnapshot setNeedsLayout];
-  [_shadowView setHidden:isNewTabPage];
 }
 
 - (void)setBottomToolbarImage:(UIImage*)image {
@@ -231,11 +221,7 @@
       [[background bottomAnchor] constraintEqualToAnchor:self.bottomAnchor]
     ]];
 
-    if (IsUIRefreshPhase1Enabled()) {
-      background.backgroundColor = UIColorFromRGB(kGridBackgroundColor);
-    } else {
-      InstallBackgroundInView(background);
-    }
+    background.backgroundColor = UIColorFromRGB(kGridBackgroundColor);
 
     _rightCard =
         [[SwipeView alloc] initWithFrame:CGRectZero topMargin:topMargin];
@@ -302,11 +288,9 @@
   [card setHidden:NO];
 
   Tab* tab = [model_ tabAtIndex:index];
-  BOOL isNTP =
-      tab.webState->GetLastCommittedURL().host_piece() == kChromeUINewTabHost;
   UIImage* topToolbarSnapshot = [self.topToolbarSnapshotProvider
       toolbarSideSwipeSnapshotForWebState:tab.webState];
-  [card setTopToolbarImage:topToolbarSnapshot isNewTabPage:isNTP];
+  [card setTopToolbarImage:topToolbarSnapshot];
   UIImage* bottomToolbarSnapshot = [self.bottomToolbarSnapshotProvider
       toolbarSideSwipeSnapshotForWebState:tab.webState];
   [card setBottomToolbarImage:bottomToolbarSnapshot];
@@ -460,8 +444,8 @@
       completion:^(BOOL finished) {
         [_leftCard setImage:nil];
         [_rightCard setImage:nil];
-        [_leftCard setTopToolbarImage:nil isNewTabPage:NO];
-        [_rightCard setTopToolbarImage:nil isNewTabPage:NO];
+        [_leftCard setTopToolbarImage:nil];
+        [_rightCard setTopToolbarImage:nil];
         [_leftCard setBottomToolbarImage:nil];
         [_rightCard setBottomToolbarImage:nil];
         [_delegate sideSwipeViewDismissAnimationDidEnd:self];
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
index 882140e4..10873e2 100644
--- a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
+++ b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
@@ -5,8 +5,8 @@
 #import <EarlGrey/EarlGrey.h>
 #import <XCTest/XCTest.h>
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
diff --git a/ios/chrome/browser/ui/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/BUILD.gn
index 0595ac0d..951e06b5 100644
--- a/ios/chrome/browser/ui/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/BUILD.gn
@@ -137,7 +137,6 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui:ui_util",
     "//ios/chrome/browser/ui/ntp/recent_tabs",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/third_party/earl_grey:earl_grey+link",
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h
index 2388307..0b8239f6 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.h
@@ -8,14 +8,14 @@
 #import <Foundation/Foundation.h>
 
 #import "base/ios/block_types.h"
-#import "ios/chrome/browser/ui/main/main_coordinator.h"
+#import "ios/chrome/browser/chrome_root_coordinator.h"
 #import "ios/chrome/browser/ui/main/view_controller_swapping.h"
 
 @protocol ApplicationCommands;
 @class TabModel;
 @protocol TabSwitcher;
 
-@interface TabGridCoordinator : MainCoordinator<ViewControllerSwapping>
+@interface TabGridCoordinator : ChromeRootCoordinator<ViewControllerSwapping>
 
 - (instancetype)initWithWindow:(UIWindow*)window
     applicationCommandEndpoint:
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
index 24faa57..456826da 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator.mm
@@ -35,7 +35,7 @@
                                  HistoryPresentationDelegate,
                                  RecentTabsPresentationDelegate>
 // Superclass property specialized for the class that this coordinator uses.
-@property(nonatomic, weak) TabGridViewController* mainViewController;
+@property(nonatomic, weak) TabGridViewController* baseViewController;
 // Pointer to the masking view used to prevent the main view controller from
 // being shown at launch.
 @property(nonatomic, strong) UIView* launchMaskView;
@@ -64,7 +64,7 @@
 
 @implementation TabGridCoordinator
 // Superclass property.
-@synthesize mainViewController = _mainViewController;
+@synthesize baseViewController = _baseViewController;
 // Public properties.
 @synthesize animationsDisabledForTesting = _animationsDisabledForTesting;
 @synthesize regularTabModel = _regularTabModel;
@@ -138,7 +138,7 @@
 
 - (void)stopChildCoordinatorsWithCompletion:(ProceduralBlock)completion {
   // Recent tabs context menu may be presented on top of the tab grid.
-  [self.mainViewController.remoteTabsViewController dismissModals];
+  [self.baseViewController.remoteTabsViewController dismissModals];
   // History may be presented on top of the tab grid.
   if (self.historyCoordinator) {
     [self.historyCoordinator stopWithCompletion:completion];
@@ -147,35 +147,29 @@
   }
 }
 
-#pragma mark - MainCoordinator properties
-
-- (id<ViewControllerSwapping>)viewControllerSwapper {
-  return self;
-}
-
 #pragma mark - ChromeCoordinator
 
 - (void)start {
-  TabGridViewController* mainViewController =
+  TabGridViewController* baseViewController =
       [[TabGridViewController alloc] init];
-  mainViewController.dispatcher =
+  baseViewController.dispatcher =
       static_cast<id<ApplicationCommands>>(self.dispatcher);
   self.transitionHandler = [[TabGridTransitionHandler alloc] init];
-  self.transitionHandler.provider = mainViewController;
-  mainViewController.modalPresentationStyle = UIModalPresentationCustom;
-  mainViewController.transitioningDelegate = self.transitionHandler;
-  mainViewController.tabPresentationDelegate = self;
-  _mainViewController = mainViewController;
+  self.transitionHandler.provider = baseViewController;
+  baseViewController.modalPresentationStyle = UIModalPresentationCustom;
+  baseViewController.transitioningDelegate = self.transitionHandler;
+  baseViewController.tabPresentationDelegate = self;
+  _baseViewController = baseViewController;
 
   self.adaptor = [[TabGridAdaptor alloc] init];
-  self.adaptor.tabGridViewController = self.mainViewController;
+  self.adaptor.tabGridViewController = self.baseViewController;
   self.adaptor.adaptedDispatcher =
       static_cast<id<ApplicationCommands, OmniboxFocuser, ToolbarCommands>>(
           self.dispatcher);
-  self.adaptor.tabGridPager = mainViewController;
+  self.adaptor.tabGridPager = baseViewController;
 
   self.regularTabsMediator = [[TabGridMediator alloc]
-      initWithConsumer:mainViewController.regularTabsConsumer];
+      initWithConsumer:baseViewController.regularTabsConsumer];
   self.regularTabsMediator.tabModel = _regularTabModel;
   if (_regularTabModel.browserState) {
     self.regularTabsMediator.tabRestoreService =
@@ -183,29 +177,29 @@
             _regularTabModel.browserState);
   }
   self.incognitoTabsMediator = [[TabGridMediator alloc]
-      initWithConsumer:mainViewController.incognitoTabsConsumer];
+      initWithConsumer:baseViewController.incognitoTabsConsumer];
   self.incognitoTabsMediator.tabModel = _incognitoTabModel;
   self.adaptor.incognitoMediator = self.incognitoTabsMediator;
-  mainViewController.regularTabsDelegate = self.regularTabsMediator;
-  mainViewController.incognitoTabsDelegate = self.incognitoTabsMediator;
-  mainViewController.regularTabsImageDataSource = self.regularTabsMediator;
-  mainViewController.incognitoTabsImageDataSource = self.incognitoTabsMediator;
+  baseViewController.regularTabsDelegate = self.regularTabsMediator;
+  baseViewController.incognitoTabsDelegate = self.incognitoTabsMediator;
+  baseViewController.regularTabsImageDataSource = self.regularTabsMediator;
+  baseViewController.incognitoTabsImageDataSource = self.incognitoTabsMediator;
 
   // TODO(crbug.com/845192) : Remove RecentTabsTableViewController dependency on
   // ChromeBrowserState so that we don't need to expose the view controller.
-  mainViewController.remoteTabsViewController.browserState =
+  baseViewController.remoteTabsViewController.browserState =
       _regularTabModel.browserState;
   self.remoteTabsMediator = [[RecentTabsMediator alloc] init];
   self.remoteTabsMediator.browserState = _regularTabModel.browserState;
-  self.remoteTabsMediator.consumer = mainViewController.remoteTabsConsumer;
+  self.remoteTabsMediator.consumer = baseViewController.remoteTabsConsumer;
   // TODO(crbug.com/845636) : Currently, the image data source must be set
   // before the mediator starts updating its consumer. Fix this so that order of
   // calls does not matter.
-  mainViewController.remoteTabsViewController.imageDataSource =
+  baseViewController.remoteTabsViewController.imageDataSource =
       self.remoteTabsMediator;
-  mainViewController.remoteTabsViewController.delegate =
+  baseViewController.remoteTabsViewController.delegate =
       self.remoteTabsMediator;
-  mainViewController.remoteTabsViewController.dispatcher =
+  baseViewController.remoteTabsViewController.dispatcher =
       static_cast<id<ApplicationCommands>>(self.dispatcher);
   self.URLLoader = [[TabGridURLLoader alloc]
       initWithRegularWebStateList:self.regularTabModel.webStateList
@@ -213,11 +207,11 @@
               regularBrowserState:self.regularTabModel.browserState
             incognitoBrowserState:self.incognitoTabModel.browserState];
   self.adaptor.loader = self.URLLoader;
-  mainViewController.remoteTabsViewController.loader = self.URLLoader;
-  mainViewController.remoteTabsViewController.presentationDelegate = self;
+  baseViewController.remoteTabsViewController.loader = self.URLLoader;
+  baseViewController.remoteTabsViewController.presentationDelegate = self;
 
   // Insert the launch screen view in front of this view to hide it until after
-  // launch. This should happen before |mainViewController| is made the window's
+  // launch. This should happen before |baseViewController| is made the window's
   // root view controller.
   NSBundle* mainBundle = base::mac::FrameworkBundle();
   NSArray* topObjects =
@@ -225,14 +219,14 @@
   UIViewController* launchScreenController =
       base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
   self.launchMaskView = launchScreenController.view;
-  [mainViewController.view addSubview:self.launchMaskView];
+  [baseViewController.view addSubview:self.launchMaskView];
 
   // TODO(crbug.com/850387) : Currently, consumer calls from the mediator
   // prematurely loads the view in |RecentTabsTableViewController|. Fix this so
   // that the view is loaded only by an explicit placement in the view
   // hierarchy. As a workaround, the view controller hierarchy is loaded here
   // before |RecentTabsMediator| updates are started.
-  self.window.rootViewController = self.mainViewController;
+  self.window.rootViewController = self.baseViewController;
   if (self.remoteTabsMediator.browserState) {
     [self.remoteTabsMediator initObservers];
     [self.remoteTabsMediator refreshSessionsView];
@@ -252,7 +246,7 @@
 
   // TODO(crbug.com/845192) : RecentTabsTableViewController behaves like a
   // coordinator and that should be factored out.
-  [self.mainViewController.remoteTabsViewController dismissModals];
+  [self.baseViewController.remoteTabsViewController dismissModals];
   [self.remoteTabsMediator disconnect];
   self.remoteTabsMediator = nil;
 }
@@ -262,31 +256,31 @@
 - (UIViewController*)activeViewController {
   if (self.bvcContainer) {
     DCHECK_EQ(self.bvcContainer,
-              self.mainViewController.presentedViewController);
+              self.baseViewController.presentedViewController);
     DCHECK(self.bvcContainer.currentBVC);
     return self.bvcContainer.currentBVC;
   }
-  return self.mainViewController;
+  return self.baseViewController;
 }
 
 - (UIViewController*)viewController {
-  return self.mainViewController;
+  return self.baseViewController;
 }
 
 - (void)prepareToShowTabSwitcher:(id<TabSwitcher>)tabSwitcher {
   DCHECK(tabSwitcher);
-  DCHECK_EQ([tabSwitcher viewController], self.mainViewController);
+  DCHECK_EQ([tabSwitcher viewController], self.baseViewController);
   // No-op if the BVC isn't being presented.
   if (!self.bvcContainer)
     return;
-  [base::mac::ObjCCast<TabGridViewController>(self.mainViewController)
+  [base::mac::ObjCCast<TabGridViewController>(self.baseViewController)
       prepareForAppearance];
 }
 
 - (void)showTabSwitcher:(id<TabSwitcher>)tabSwitcher
              completion:(ProceduralBlock)completion {
   DCHECK(tabSwitcher);
-  DCHECK_EQ([tabSwitcher viewController], self.mainViewController);
+  DCHECK_EQ([tabSwitcher viewController], self.baseViewController);
   // It's also expected that |tabSwitcher| will be |self.tabSwitcher|, but that
   // may not be worth a DCHECK?
 
@@ -296,7 +290,7 @@
     self.bvcContainer.transitioningDelegate = self.transitionHandler;
     self.bvcContainer = nil;
     BOOL animated = !self.animationsDisabledForTesting;
-    [self.mainViewController dismissViewControllerAnimated:animated
+    [self.baseViewController dismissViewControllerAnimated:animated
                                                 completion:completion];
   } else {
     if (completion) {
@@ -348,7 +342,7 @@
     self.launchMaskView = nil;
   };
 
-  [self.mainViewController presentViewController:self.bvcContainer
+  [self.baseViewController presentViewController:self.bvcContainer
                                         animated:animated
                                       completion:extendedCompletion];
 }
@@ -390,7 +384,7 @@
   // tab grid. Using a local coordinator works better when hooked up with a
   // specialized URL loader and tab presentation delegate.
   self.historyCoordinator = [[HistoryCoordinator alloc]
-      initWithBaseViewController:self.mainViewController
+      initWithBaseViewController:self.baseViewController
                     browserState:self.regularTabModel.browserState];
   self.historyCoordinator.loader = self.URLLoader;
   self.historyCoordinator.presentationDelegate = self;
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator_unittest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator_unittest.mm
index 5c89622..0b74b468 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_coordinator_unittest.mm
@@ -31,10 +31,6 @@
 - (void)tabSwitcherDismissTransitionDidEnd:(id<TabSwitcher>)tabSwitcher {
   self.didEndCalled = YES;
 }
-
-- (id<ToolbarOwner>)tabSwitcherTransitionToolbarOwner {
-  return nil;
-}
 @end
 
 namespace {
@@ -96,7 +92,7 @@
 // Tests that the tab grid view controller is the initial active view
 // controller.
 TEST_F(TabGridCoordinatorTest, InitialActiveViewController) {
-  EXPECT_EQ(coordinator_.mainViewController, coordinator_.activeViewController);
+  EXPECT_EQ(coordinator_.baseViewController, coordinator_.activeViewController);
 }
 
 // Tests that it is possible to set a TabViewController without first setting a
@@ -210,7 +206,7 @@
   CGRect rect = [UIScreen mainScreen].bounds;
   [coordinator_ start];
   EXPECT_TRUE(
-      CGRectEqualToRect(rect, coordinator_.mainViewController.view.frame));
+      CGRectEqualToRect(rect, coordinator_.baseViewController.view.frame));
 }
 
 }  // namespace
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.mm
index 4476ddd..02b3d1a 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.mm
@@ -9,7 +9,6 @@
 #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_constants.h"
 #import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
index 2ef33f0..8e73910 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -642,7 +642,7 @@
                                                   toView:_buttonNewTab.window];
   OpenNewTabCommand* command =
       [OpenNewTabCommand commandWithIncognito:_isIncognito originPoint:center];
-  [self.dispatcher openNewTab:command];
+  [self.dispatcher openURLInNewTab:command];
 }
 
 - (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn
index 68b9daa0..690c36d 100644
--- a/ios/chrome/browser/ui/toolbar/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -1,133 +1,187 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
+# Copyright 2017 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
 source_set("toolbar") {
+  sources = [
+    "adaptive_toolbar_coordinator+subclassing.h",
+    "adaptive_toolbar_coordinator.h",
+    "adaptive_toolbar_coordinator.mm",
+    "primary_toolbar_coordinator.h",
+    "primary_toolbar_coordinator.mm",
+    "secondary_toolbar_coordinator.h",
+    "secondary_toolbar_coordinator.mm",
+    "toolbar_coordinatee.h",
+    "toolbar_coordinator_adaptor.h",
+    "toolbar_coordinator_adaptor.mm",
+    "toolbar_coordinator_delegate.h",
+    "toolbar_mediator.h",
+    "toolbar_mediator.mm",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+
+  deps = [
+    ":toolbar_ui",
+    "//base",
+    "//components/bookmarks/browser",
+    "//components/google/core/browser",
+    "//components/strings",
+    "//ios/chrome/browser",
+    "//ios/chrome/browser/autocomplete",
+    "//ios/chrome/browser/bookmarks",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/reading_list",
+    "//ios/chrome/browser/search_engines",
+    "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui/bookmarks",
+    "//ios/chrome/browser/ui/broadcaster",
+    "//ios/chrome/browser/ui/browser_list",
+    "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
+    "//ios/chrome/browser/ui/fullscreen",
+    "//ios/chrome/browser/ui/location_bar",
+    "//ios/chrome/browser/ui/ntp",
+    "//ios/chrome/browser/ui/ntp:util",
+    "//ios/chrome/browser/ui/omnibox",
+    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
+    "//ios/chrome/browser/ui/omnibox/popup",
+    "//ios/chrome/browser/ui/orchestrator",
+    "//ios/chrome/browser/ui/popup_menu/public",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/keyboard_assist",
+    "//ios/chrome/browser/ui/toolbar/public",
+    "//ios/chrome/browser/ui/voice",
+    "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/common",
+    "//ios/public/provider/chrome/browser",
+    "//ios/public/provider/chrome/browser/voice",
+    "//ios/web",
+  ]
+
+  allow_circular_includes_from = [ "//ios/chrome/browser/ui/location_bar" ]
+}
+
+source_set("toolbar_ui") {
+  sources = [
+    "adaptive_toolbar_view.h",
+    "adaptive_toolbar_view_controller+subclassing.h",
+    "adaptive_toolbar_view_controller.h",
+    "adaptive_toolbar_view_controller.mm",
+    "primary_toolbar_view.h",
+    "primary_toolbar_view.mm",
+    "primary_toolbar_view_controller.h",
+    "primary_toolbar_view_controller.mm",
+    "primary_toolbar_view_controller_delegate.h",
+    "secondary_toolbar_view.h",
+    "secondary_toolbar_view.mm",
+    "secondary_toolbar_view_controller.h",
+    "secondary_toolbar_view_controller.mm",
+    "toolbar_consumer.h",
+    "toolbar_progress_bar.h",
+    "toolbar_progress_bar.mm",
+  ]
+  deps = [
+    "//base",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser/ui:ui",
+    "//ios/chrome/browser/ui:ui_util",
+    "//ios/chrome/browser/ui/activity_services/requirements",
+    "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/fullscreen:ui",
+    "//ios/chrome/browser/ui/ntp:ntp",
+    "//ios/chrome/browser/ui/orchestrator",
+    "//ios/chrome/browser/ui/popup_menu/public",
+    "//ios/chrome/browser/ui/toolbar/buttons",
+    "//ios/chrome/browser/ui/toolbar/public",
+    "//ios/chrome/browser/ui/toolbar/public:feature_flags",
+    "//ios/chrome/browser/ui/util",
+    "//ios/chrome/common:timing",
+    "//ios/chrome/common/ui_util",
+    "//ios/third_party/material_components_ios",
+    "//ui/base",
+  ]
+  libs = [ "UIKit.framework" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
+source_set("toolbar_model_delegate") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
     "toolbar_model_delegate_ios.h",
     "toolbar_model_delegate_ios.mm",
   ]
   deps = [
-    ":toolbar_ui",
-    "resources:toolbar_dark_newtab",
-    "resources:toolbar_dark_newtab_active",
-    "resources:toolbar_dark_newtab_incognito",
-    "resources:toolbar_dark_newtab_incognito_active",
     "//base",
+    "//components/omnibox/browser",
     "//components/prefs",
     "//components/toolbar",
     "//ios/chrome/browser",
     "//ios/chrome/browser/autocomplete",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/ssl",
-    "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/ui/activity_services/requirements",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
-    "//ios/chrome/browser/ui/fullscreen",
-    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
-    "//ios/chrome/browser/ui/qr_scanner/requirements",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/browser/web_state_list",
-    "//ios/public/provider/chrome/browser/voice",
     "//ios/web/public",
   ]
   libs = [ "UIKit.framework" ]
 }
 
-source_set("toolbar_ui") {
-  sources = [
-    "legacy_toolbar_ui_updater.h",
-    "legacy_toolbar_ui_updater.mm",
-    "toolbar_owner.h",
-    "toolbar_snapshot_providing.h",
-    "toolbar_ui.h",
-    "toolbar_ui.mm",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/web_state_list",
-    "//ios/web",
-  ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-  libs = [ "UIKit.framework" ]
-}
-
-source_set("toolbar_ui_broadcasting_util") {
-  sources = [
-    "toolbar_ui_broadcasting_util.h",
-    "toolbar_ui_broadcasting_util.mm",
-  ]
-  deps = [
-    ":toolbar_ui",
-    "//ios/chrome/browser/ui/broadcaster",
-  ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
-
-source_set("resource_macros") {
-  sources = [
-    "toolbar_resource_macros.h",
-  ]
-  deps = [
-    "//ios/chrome/app/theme",
-  ]
-}
-
 source_set("unit_tests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
+
   sources = [
-    "legacy_toolbar_ui_updater_unittest.mm",
-    "toolbar_ui_broadcasting_util_unittest.mm",
+    "adaptive_toolbar_view_controller_unittest.mm",
+    "toolbar_mediator_unittest.mm",
   ]
   deps = [
     ":toolbar",
     ":toolbar_ui",
-    ":toolbar_ui_broadcasting_util",
     "//base",
+    "//base/test:test_support",
     "//components/bookmarks/browser",
     "//components/bookmarks/test",
-    "//components/toolbar:test_support",
-    "//ios/chrome/browser",
+    "//components/search_engines",
     "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/tabs",
-    "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/broadcaster",
+    "//ios/chrome/browser/search_engines",
+    "//ios/chrome/browser/ui:ui_util",
+    "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/popup_menu/public",
+    "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/test",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list:test_support",
     "//ios/chrome/test:test_support",
-    "//ios/testing:ocmock_support",
+    "//ios/public/provider/chrome/browser:test_support",
+    "//ios/public/provider/chrome/browser/images:test_support",
+    "//ios/public/provider/chrome/browser/voice",
+    "//ios/web",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
     "//third_party/ocmock",
   ]
+  configs += [ "//build/config/compiler:enable_arc" ]
 }
 
 source_set("eg_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
+    "adaptive_toolbar_egtest.mm",
     "toolbar_egtest.mm",
   ]
 
   deps = [
-    ":toolbar",
+    ":toolbar_ui",
     "//base",
     "//components/strings",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/infobars",
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
+    "//ios/chrome/browser/ui/infobars:test_support",
     "//ios/chrome/browser/ui/ntp:ntp_controller",
     "//ios/chrome/browser/ui/ntp:ntp_internal",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
@@ -135,12 +189,14 @@
     "//ios/chrome/browser/ui/omnibox/popup:popup_internal",
     "//ios/chrome/browser/ui/omnibox/popup:popup_internal",
     "//ios/chrome/browser/ui/popup_menu:constants",
+    "//ios/chrome/browser/ui/tab_grid:egtest_support",
     "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
+    "//ios/chrome/browser/ui/util",
     "//ios/chrome/test/app:test_support",
     "//ios/chrome/test/earl_grey:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
     "//ios/third_party/earl_grey:earl_grey+link",
+    "//ios/web:earl_grey_test_support",
     "//ios/web/public/test/http_server",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn b/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
deleted file mode 100644
index 100fef2f1..0000000
--- a/ios/chrome/browser/ui/toolbar/adaptive/BUILD.gn
+++ /dev/null
@@ -1,139 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("adaptive") {
-  sources = [
-    "adaptive_toolbar_coordinator+subclassing.h",
-    "adaptive_toolbar_coordinator.h",
-    "adaptive_toolbar_coordinator.mm",
-    "primary_toolbar_coordinator.h",
-    "primary_toolbar_coordinator.mm",
-    "secondary_toolbar_coordinator.h",
-    "secondary_toolbar_coordinator.mm",
-    "toolbar_coordinatee.h",
-    "toolbar_coordinator_adaptor.h",
-    "toolbar_coordinator_adaptor.mm",
-  ]
-  deps = [
-    ":adaptive_ui",
-    "//base",
-    "//components/google/core/browser",
-    "//ios/chrome/browser/bookmarks",
-    "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/reading_list",
-    "//ios/chrome/browser/search_engines",
-    "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
-    "//ios/chrome/browser/ui/fullscreen",
-    "//ios/chrome/browser/ui/location_bar",
-    "//ios/chrome/browser/ui/ntp",
-    "//ios/chrome/browser/ui/ntp:util",
-    "//ios/chrome/browser/ui/omnibox",
-    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
-    "//ios/chrome/browser/ui/omnibox/popup",
-    "//ios/chrome/browser/ui/orchestrator",
-    "//ios/chrome/browser/ui/popup_menu/public",
-    "//ios/chrome/browser/ui/toolbar",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/chrome/browser/web_state_list",
-    "//ios/public/provider/chrome/browser",
-    "//ios/web",
-  ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
-
-source_set("adaptive_ui") {
-  sources = [
-    "adaptive_toolbar_view.h",
-    "adaptive_toolbar_view_controller+subclassing.h",
-    "adaptive_toolbar_view_controller.h",
-    "adaptive_toolbar_view_controller.mm",
-    "primary_toolbar_view.h",
-    "primary_toolbar_view.mm",
-    "primary_toolbar_view_controller.h",
-    "primary_toolbar_view_controller.mm",
-    "primary_toolbar_view_controller_delegate.h",
-    "secondary_toolbar_view.h",
-    "secondary_toolbar_view.mm",
-    "secondary_toolbar_view_controller.h",
-    "secondary_toolbar_view_controller.mm",
-    "toolbar_progress_bar.h",
-    "toolbar_progress_bar.mm",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser/ui:ui",
-    "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/ui/activity_services/requirements",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/fullscreen:ui",
-    "//ios/chrome/browser/ui/ntp:ntp",
-    "//ios/chrome/browser/ui/orchestrator",
-    "//ios/chrome/browser/ui/popup_menu/public",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/clean:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/toolbar/public:feature_flags",
-    "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common:timing",
-    "//ios/chrome/common/ui_util",
-    "//ios/third_party/material_components_ios",
-    "//ui/base",
-  ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
-
-source_set("eg_tests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  sources = [
-    "adaptive_toolbar_egtest.mm",
-  ]
-
-  deps = [
-    ":adaptive_ui",
-    "//base",
-    "//components/strings",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser/infobars",
-    "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/ui/infobars:test_support",
-    "//ios/chrome/browser/ui/tab_grid:egtest_support",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/chrome/browser/ui/util",
-    "//ios/chrome/test/app:test_support",
-    "//ios/chrome/test/earl_grey:test_support",
-    "//ios/testing/earl_grey:earl_grey_support",
-    "//ios/web:earl_grey_test_support",
-    "//ui/base",
-  ]
-  libs = [ "XCTest.framework" ]
-}
-
-source_set("unit_tests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  sources = [
-    "adaptive_toolbar_view_controller_unittest.mm",
-  ]
-  deps = [
-    ":adaptive_ui",
-    "//base",
-    "//base/test:test_support",
-    "//ios/chrome/browser/ui:ui_util",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/popup_menu/public",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//testing/gtest",
-    "//third_party/ocmock",
-  ]
-}
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller+subclassing.h b/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller+subclassing.h
deleted file mode 100644
index bda27da..0000000
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller+subclassing.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
-
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
-
-// Protected interface of the AdaptiveToolbarViewController.
-@interface AdaptiveToolbarViewController (Subclassing)
-
-// Sets the progress of the progressBar to 1 then hides it.
-- (void)stopProgressBar;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h
deleted file mode 100644
index 8884f6f..0000000
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_COORDINATOR_H_
-
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h"
-
-// Coordinator for the secondary part of the adaptive toolbar. It is the part
-// containing the controls displayed only on specific size classes.
-@interface SecondaryToolbarCoordinator : AdaptiveToolbarCoordinator
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h
deleted file mode 100644
index 5c17a4b..0000000
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
-
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
-
-// ViewController for the secondary part of the adaptive toolbar. It is the part
-// containing the controls displayed only on specific size classes.
-@interface SecondaryToolbarViewController : AdaptiveToolbarViewController
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h
similarity index 63%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h
index 19bb368f..34ab9ca3 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
 
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h"
 
@@ -26,4 +26,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h
similarity index 84%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h
index 89a1577..40632e40 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_H_
 
 #import <UIKit/UIKit.h>
 
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinatee.h"
 #import "ios/chrome/browser/ui/toolbar/public/side_swipe_toolbar_snapshot_providing.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h"
 
 @class AdaptiveToolbarViewController;
 @protocol ApplicationCommands;
@@ -47,4 +47,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_COORDINATOR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm
similarity index 92%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm
index 47268e3..5c65aab5 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.mm
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
 
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/ui/ntp/ntp_util.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_visibility_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_mediator.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
similarity index 96%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
index 49f90fa..6eca573c 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -10,11 +10,10 @@
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/ui/infobars/test_infobar_delegate.h"
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
@@ -700,25 +699,6 @@
       assertWithMatcher:grey_not(grey_enabled())];
 }
 
-// Tests that it is possible to navigate to chrome://flags to disable it if
-// needed.
-// TODO(crbug.com/800266): Remove the test when the flag is enabled by default.
-- (void)testNavigationToFlags {
-  if (IsIPadIdiom()) {
-    // TODO(crbug.com/753098): grey_typeText() doesn't work on iPad.
-    return;
-  }
-  if (IsSplitToolbarMode()) {
-    [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                            kToolbarOmniboxButtonIdentifier)]
-        performAction:grey_tap()];
-  }
-  [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
-      performAction:grey_typeText(@"chrome://flags\n")];
-
-  [ChromeEarlGrey waitForWebViewContainingText:"Experiments"];
-}
-
 // Tests that tapping the omnibox button focuses the omnibox.
 - (void)testOmniboxButton {
   if (!IsSplitToolbarMode()) {
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h
similarity index 88%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h
index d7b65e0b..3315932 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_H_
 
 #import <UIKit/UIKit.h>
 
@@ -46,4 +46,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h
new file mode 100644
index 0000000..bd7e2f56
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
+
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
+
+// Protected interface of the AdaptiveToolbarViewController.
+@interface AdaptiveToolbarViewController (Subclassing)
+
+// Sets the progress of the progressBar to 1 then hides it.
+- (void)stopProgressBar;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_SUBCLASSING_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
similarity index 85%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
index 363b74b..9c577e0 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
 
 #import <UIKit/UIKit.h>
 
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller_delegate.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_type.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h"
 
 @protocol ApplicationCommands;
 @protocol BrowserCommands;
@@ -48,4 +48,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm
similarity index 98%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm
index fde08322..77e037fa 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
 
 #import "base/logging.h"
 #include "base/metrics/user_metrics.h"
 #include "ios/chrome/browser/ui/animation_util.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_long_press_delegate.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller_unittest.mm
similarity index 95%
rename from ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm
rename to ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller_unittest.mm
index 7ad3bfd..c24d1ef9 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
 
 #import <UIKit/UIGestureRecognizerSubclass.h>
 
@@ -11,10 +11,10 @@
 #include "base/test/scoped_task_environment.h"
 #import "ios/chrome/browser/ui/commands/popup_menu_commands.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_long_press_delegate.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
index 6741ca0e..349940b 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
@@ -41,7 +41,6 @@
     "//ios/chrome/browser/ui",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
-    "//ios/chrome/browser/ui/toolbar:resource_macros",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h
index 040936ee..e5148211 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h
@@ -45,9 +45,6 @@
 - (ToolbarButton*)forwardButton;
 // Tab Grid ToolbarButton.
 - (ToolbarTabGridButton*)tabGridButton;
-// StackView ToolbarButton.
-// TODO(crbug.com/800266): Remove this.
-- (ToolbarButton*)stackViewButton;
 // Tools Menu ToolbarButton.
 - (ToolbarToolsMenuButton*)toolsMenuButton;
 // Share ToolbarButton.
@@ -58,28 +55,11 @@
 - (ToolbarButton*)stopButton;
 // Bookmark ToolbarButton.
 - (ToolbarButton*)bookmarkButton;
-// VoiceSearch ToolbarButton.
-// TODO(crbug.com/800266): Remove this.
-- (ToolbarButton*)voiceSearchButton;
-// ContractToolbar ToolbarButton.
-// TODO(crbug.com/800266): Remove this.
-- (ToolbarButton*)contractButton;
 // ToolbarButton to focus the omnibox.
 - (ToolbarButton*)omniboxButton;
-// LocationBar LeadingButton. Currently used for the incognito icon when the
-// Toolbar is expanded on incognito mode. It can return nil.
-- (ToolbarButton*)locationBarLeadingButton;
 // Button to cancel the edit of the location bar.
 - (UIButton*)cancelButton;
 
-// Returns images for Voice Search in an array representing the NORMAL/PRESSED
-// state
-// TODO(crbug.com/800266): Remove this.
-- (NSArray<UIImage*>*)voiceSearchImages;
-// Returns images for TTS in an array representing the NORMAL/PRESSED states.
-// TODO(crbug.com/800266): Remove this.
-- (NSArray<UIImage*>*)TTSImages;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_BUTTONS_TOOLBAR_BUTTON_FACTORY_H_
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
index 35b78e7e..d15657e 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
@@ -17,7 +17,6 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/public/features.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
-#include "ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -103,11 +102,6 @@
   return tabGridButton;
 }
 
-- (ToolbarButton*)stackViewButton {
-  NOTREACHED();
-  return nil;
-}
-
 - (ToolbarToolsMenuButton*)toolsMenuButton {
   ToolbarToolsMenuButton* toolsMenuButton =
       [[ToolbarToolsMenuButton alloc] initWithFrame:CGRectZero];
@@ -188,16 +182,6 @@
   return bookmarkButton;
 }
 
-- (ToolbarButton*)voiceSearchButton {
-  NOTREACHED();
-  return nil;
-}
-
-- (ToolbarButton*)contractButton {
-  NOTREACHED();
-  return nil;
-}
-
 - (ToolbarButton*)omniboxButton {
   ToolbarSearchButton* omniboxButton = [ToolbarSearchButton
       toolbarButtonWithImage:[UIImage imageNamed:@"toolbar_search"]];
@@ -219,11 +203,6 @@
   return omniboxButton;
 }
 
-- (ToolbarButton*)locationBarLeadingButton {
-  NOTREACHED();
-  return nil;
-}
-
 - (UIButton*)cancelButton {
   UIButton* cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];
   cancelButton.titleLabel.font = [UIFont systemFontOfSize:kLocationBarFontSize];
@@ -264,14 +243,4 @@
   button.exclusiveTouch = YES;
 }
 
-- (NSArray<UIImage*>*)voiceSearchImages {
-  NOTREACHED();
-  return nil;
-}
-
-- (NSArray<UIImage*>*)TTSImages {
-  NOTREACHED();
-  return nil;
-}
-
 @end
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
index 7f62699..196e640 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h
@@ -50,10 +50,6 @@
 extern const CGFloat kToolbarSpotlightAlpha;
 extern const CGFloat kDimmedToolbarSpotlightAlpha;
 
-// Animation constants.
-// TODO(crbug.com/800266): Remove this.
-extern const LayoutOffset kToolbarButtonAnimationOffset;
-
 // Adaptive toolbar position constants.
 extern const CGFloat kExpandedLocationBarHorizontalMargin;
 extern const CGFloat kContractedLocationBarHorizontalMargin;
@@ -85,27 +81,9 @@
 // Accessibility identifier of the cancel omnibox edit button.
 extern NSString* const kToolbarCancelOmniboxEditButtonIdentifier;
 
-// The maximum number to display in the tab switcher button.
-// TODO(crbug.com/800266): Remove this.
-extern NSInteger const kStackButtonMaxTabCount;
-
 // Font size for the TabGrid button containing the tab count.
 extern const NSInteger kTabGridButtonFontSize;
 
-// TODO(crbug.com/800266): Remove those properties.
-// Font sizes for the button containing the tab count
-extern const NSInteger kFontSizeFewerThanTenTabs;
-extern const NSInteger kFontSizeTenTabsOrMore;
-
-// Toolbar style. Determines which button images are used.
-// TODO(crbug.com/800266): Remove those properties.
-enum ToolbarControllerStyle {
-  ToolbarControllerStyleLightMode = 0,
-  ToolbarControllerStyleDarkMode,
-  ToolbarControllerStyleIncognitoMode,
-  ToolbarControllerStyleMaxStyles
-};
-
 // Tint color for location bar and omnibox.
 extern const CGFloat kLocationBarTintBlue;
 
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
index a0cf58f..4e6a34ab 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.mm
@@ -34,8 +34,6 @@
 const CGFloat kToolbarSpotlightAlpha = 0.07;
 const CGFloat kDimmedToolbarSpotlightAlpha = 0.14;
 
-const LayoutOffset kToolbarButtonAnimationOffset = -10.0;
-
 const CGFloat kExpandedLocationBarHorizontalMargin = 8;
 const CGFloat kContractedLocationBarHorizontalMargin = 19;
 
@@ -61,13 +59,8 @@
 NSString* const kToolbarCancelOmniboxEditButtonIdentifier =
     @"kToolbarCancelOmniboxEditButtonIdentifier";
 
-const NSInteger kStackButtonMaxTabCount = 99;
-
 const NSInteger kTabGridButtonFontSize = 13;
 
-const NSInteger kFontSizeFewerThanTenTabs = 11;
-const NSInteger kFontSizeTenTabsOrMore = 9;
-
 const CGFloat kLocationBarTintBlue = 0x1A73E8;
 const CGFloat kLocationBarFontSize = 15.0f;
 const CGFloat kLocationBarRegularRegularFontSize = 17.0f;
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
index 856f092df..7b99d1a 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h
@@ -25,10 +25,6 @@
 
 - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
 
-// Informs the button that the Tools Menu's visibility is |toolsMenuVisible|.
-// TODO(crbug.com/800266): Remove this method.
-- (void)setToolsMenuIsVisible:(BOOL)toolsMenuVisible;
-
 // Triggers an animation on the button to draw the user's attention to the
 // button.
 - (void)triggerAnimation;
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.mm
index 479df11..9eb6196 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.mm
@@ -80,10 +80,6 @@
   return self;
 }
 
-- (void)setToolsMenuIsVisible:(BOOL)toolsMenuVisible {
-  NOTREACHED();
-}
-
 - (void)triggerAnimation {
   [self animateToColor:self.tintColor];
 }
diff --git a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn b/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
deleted file mode 100644
index 7ccdf88..0000000
--- a/ios/chrome/browser/ui/toolbar/clean/BUILD.gn
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("toolbar") {
-  sources = [
-    "toolbar_coordinator_delegate.h",
-    "toolbar_mediator.h",
-    "toolbar_mediator.mm",
-  ]
-
-  configs += [ "//build/config/compiler:enable_arc" ]
-
-  deps = [
-    ":toolbar_ui",
-    "//base",
-    "//components/bookmarks/browser",
-    "//components/strings",
-    "//ios/chrome/browser",
-    "//ios/chrome/browser/autocomplete",
-    "//ios/chrome/browser/bookmarks",
-    "//ios/chrome/browser/browser_state",
-    "//ios/chrome/browser/reading_list",
-    "//ios/chrome/browser/search_engines",
-    "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/bookmarks",
-    "//ios/chrome/browser/ui/broadcaster",
-    "//ios/chrome/browser/ui/browser_list",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/coordinators",
-    "//ios/chrome/browser/ui/fullscreen",
-    "//ios/chrome/browser/ui/location_bar",
-    "//ios/chrome/browser/ui/ntp:util",
-    "//ios/chrome/browser/ui/omnibox",
-    "//ios/chrome/browser/ui/omnibox:omnibox_internal",
-    "//ios/chrome/browser/ui/omnibox/popup",
-    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/keyboard_assist",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu:configuration",
-    "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/chrome/browser/ui/voice",
-    "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common",
-    "//ios/public/provider/chrome/browser",
-    "//ios/public/provider/chrome/browser/images",
-    "//ios/public/provider/chrome/browser/voice",
-    "//ios/third_party/material_components_ios",
-    "//ios/web",
-  ]
-
-  allow_circular_includes_from = [ "//ios/chrome/browser/ui/location_bar" ]
-}
-
-source_set("toolbar_ui") {
-  sources = [
-    "toolbar_consumer.h",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/app/theme",
-    "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/activity_services/requirements",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/fullscreen:ui",
-    "//ios/chrome/browser/ui/toolbar/buttons",
-    "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/toolbar/public:feature_flags",
-    "//ios/chrome/browser/ui/util",
-    "//ios/chrome/browser/ui/voice",
-    "//ios/chrome/common",
-    "//ios/third_party/material_components_ios",
-  ]
-  libs = [ "UIKit.framework" ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
-
-source_set("unit_tests") {
-  testonly = true
-
-  sources = [
-    "toolbar_mediator_unittest.mm",
-  ]
-  deps = [
-    ":toolbar",
-    ":toolbar_ui",
-    "//base",
-    "//base/test:test_support",
-    "//components/bookmarks/browser",
-    "//components/bookmarks/test",
-    "//components/search_engines",
-    "//ios/chrome/browser/bookmarks",
-    "//ios/chrome/browser/browser_state:test_support",
-    "//ios/chrome/browser/search_engines",
-    "//ios/chrome/browser/ui/toolbar/test",
-    "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/browser/web_state_list:test_support",
-    "//ios/chrome/test:test_support",
-    "//ios/public/provider/chrome/browser:test_support",
-    "//ios/public/provider/chrome/browser/images:test_support",
-    "//ios/public/provider/chrome/browser/voice",
-    "//ios/web",
-    "//ios/web/public/test",
-    "//ios/web/public/test/fakes",
-    "//testing/gtest",
-    "//third_party/ocmock",
-  ]
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
diff --git a/ios/chrome/browser/ui/toolbar/fullscreen/BUILD.gn b/ios/chrome/browser/ui/toolbar/fullscreen/BUILD.gn
new file mode 100644
index 0000000..cef32b15
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/BUILD.gn
@@ -0,0 +1,64 @@
+# 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.
+
+source_set("fullscreen") {
+  sources = [
+    "legacy_toolbar_ui_updater.h",
+    "legacy_toolbar_ui_updater.mm",
+    "toolbar_ui.h",
+    "toolbar_ui.mm",
+  ]
+  deps = [
+    "//base",
+    "//ios/chrome/browser/ui:ui_util",
+    "//ios/chrome/browser/web_state_list",
+    "//ios/web",
+  ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+  libs = [ "UIKit.framework" ]
+}
+
+source_set("fullscreen_broadcasting_util") {
+  sources = [
+    "toolbar_ui_broadcasting_util.h",
+    "toolbar_ui_broadcasting_util.mm",
+  ]
+  deps = [
+    ":fullscreen",
+    "//ios/chrome/browser/ui/broadcaster",
+  ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
+source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "legacy_toolbar_ui_updater_unittest.mm",
+    "toolbar_ui_broadcasting_util_unittest.mm",
+  ]
+  deps = [
+    ":fullscreen",
+    ":fullscreen_broadcasting_util",
+    "//base",
+    "//components/bookmarks/browser",
+    "//components/bookmarks/test",
+    "//components/toolbar:test_support",
+    "//ios/chrome/browser",
+    "//ios/chrome/browser/bookmarks",
+    "//ios/chrome/browser/browser_state:test_support",
+    "//ios/chrome/browser/tabs",
+    "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui/broadcaster",
+    "//ios/chrome/browser/ui/toolbar/test",
+    "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:test_support",
+    "//ios/chrome/test:test_support",
+    "//ios/testing:ocmock_support",
+    "//ios/web/public/test",
+    "//ios/web/public/test/fakes",
+    "//testing/gtest",
+    "//third_party/ocmock",
+  ]
+}
diff --git a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h
similarity index 80%
rename from ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h
rename to ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h
index 8a5f5a2..a52b016 100644
--- a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UI_UPDATER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UI_UPDATER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_LEGACY_TOOLBAR_UI_UPDATER_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_LEGACY_TOOLBAR_UI_UPDATER_H_
 
 #import <UIKit/UIKit.h>
 
-@protocol ToolbarOwner;
 @class ToolbarUIState;
 class WebStateList;
 
@@ -27,7 +26,7 @@
 @property(nonatomic, strong, readonly, nonnull) ToolbarUIState* toolbarUI;
 
 // Designated initializer that uses navigation events from |webStateList| and
-// the height provided by |toolbarOwner| to update |state|'s broadcast value.
+// the height provided by |owner| to update |state|'s broadcast value.
 - (nullable instancetype)
 initWithToolbarUI:(nonnull ToolbarUIState*)toolbarUI
      toolbarOwner:(nonnull id<ToolbarHeightProviderForFullscreen>)owner
@@ -45,4 +44,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_LEGACY_TOOLBAR_UI_UPDATER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_LEGACY_TOOLBAR_UI_UPDATER_H_
diff --git a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.mm b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.mm
similarity index 93%
rename from ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.mm
rename to ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.mm
index cdbdf98..6417662 100644
--- a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.mm
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.mm
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h"
 
 #include <memory>
 
 #include "base/logging.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #import "ios/web/public/web_state/navigation_context.h"
@@ -26,7 +25,7 @@
   // The bridge for WebState observation.
   std::unique_ptr<web::WebStateObserverBridge> _webStateObserver;
 }
-// The ToolbarOwner passed on initialization.
+// The owner passed on initialization.
 @property(nonatomic, readonly, strong) id<ToolbarHeightProviderForFullscreen>
     owner;
 // The WebStateList whose navigations are driving this updater.
@@ -34,7 +33,7 @@
 // The active WebState in |webStateList|.
 @property(nonatomic, assign) web::WebState* webState;
 
-// Updates |state| using |toolbarOwner|.
+// Updates |state| using |owner|.
 - (void)updateState;
 
 @end
diff --git a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater_unittest.mm b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater_unittest.mm
similarity index 97%
rename from ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater_unittest.mm
rename to ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater_unittest.mm
index 8cfa0d02..d346a31 100644
--- a/ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater_unittest.mm
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater_unittest.mm
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/legacy_toolbar_ui_updater.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/legacy_toolbar_ui_updater.h"
 
 #include <memory>
 
-#import "ios/chrome/browser/ui/toolbar/toolbar_owner.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_ui.h b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h
similarity index 86%
rename from ios/chrome/browser/ui/toolbar/toolbar_ui.h
rename to ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h
index af90249..4211fa6 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_ui.h
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_H_
 
 #import <UIKit/UIKit.h>
 
@@ -35,4 +35,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_ui.mm b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.mm
similarity index 87%
rename from ios/chrome/browser/ui/toolbar/toolbar_ui.mm
rename to ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.mm
index a7ebffa..fa2c4e4 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_ui.mm
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h
similarity index 68%
rename from ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h
rename to ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h
index 761ba3a..d39890a 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_BROADCASTING_UTIL_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_BROADCASTING_UTIL_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_BROADCASTING_UTIL_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_BROADCASTING_UTIL_H_
 
 @class ChromeBroadcaster;
 @protocol ToolbarUI;
@@ -15,4 +15,4 @@
 // Stops broadcasting MainContentUI properties using |broadcaster|.
 void StopBroadcastingToolbarUI(ChromeBroadcaster* broadcaster);
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_UI_BROADCASTING_UTIL_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_FULLSCREEN_TOOLBAR_UI_BROADCASTING_UTIL_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.mm b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.mm
similarity index 89%
rename from ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.mm
rename to ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.mm
index 5fa41166..17b1961 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.mm
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.mm
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h"
 
 #import "ios/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util_unittest.mm b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util_unittest.mm
similarity index 88%
rename from ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util_unittest.mm
rename to ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util_unittest.mm
index 0c07b9db6..c134446 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util_unittest.mm
+++ b/ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util_unittest.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui_broadcasting_util.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui_broadcasting_util.h"
 
 #import "ios/chrome/browser/ui/broadcaster/chrome_broadcaster.h"
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h
similarity index 70%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h
index f283d69..b68741e 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_COORDINATOR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_COORDINATOR_H_
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
 #import "ios/chrome/browser/ui/toolbar/public/primary_toolbar_coordinator.h"
 
 @protocol ToolbarCoordinatorDelegate;
@@ -25,4 +25,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_COORDINATOR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
similarity index 94%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
index 4447b29..f6b559c 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_coordinator.h"
 
 #import <CoreLocation/CoreLocation.h>
 
@@ -22,10 +22,10 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_positioner.h"
 #import "ios/chrome/browser/ui/orchestrator/omnibox_focus_orchestrator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/browser/ui/url_loader.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.h
similarity index 92%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_view.h
index 07ef687..efc4c94 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_H_
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h"
 
 @class ToolbarButtonFactory;
 
@@ -85,4 +85,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
similarity index 98%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.mm
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
index 18e4c245..a2340d0c 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
 
 #import "base/ios/ios_util.h"
 #include "base/logging.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
@@ -14,6 +13,7 @@
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tab_grid_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
 #import "ios/chrome/browser/ui/toolbar/public/features.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h
similarity index 76%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h
index 97a6351..0c6e9d1 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
 
 #import "ios/chrome/browser/ui/activity_services/requirements/activity_service_positioner.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_ui_element.h"
 #import "ios/chrome/browser/ui/orchestrator/toolbar_animatee.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
 
 @protocol PrimaryToolbarViewControllerDelegate;
 
@@ -29,4 +29,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
similarity index 95%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
index 04f673fe..5f8c4c5 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.h"
 
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/UIView+SizeClassSupport.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_animator.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view_controller+subclassing.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/public/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h
similarity index 65%
rename from ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h
rename to ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h
index 376bcaa..4b015f08 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/primary_toolbar_view_controller_delegate.h
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller_delegate.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
 
 #import <UIKit/UIKit.h>
 
@@ -19,4 +19,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_PRIMARY_TOOLBAR_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/toolbar/public/BUILD.gn b/ios/chrome/browser/ui/toolbar/public/BUILD.gn
index 76f876b..9cfa0aa 100644
--- a/ios/chrome/browser/ui/toolbar/public/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/public/BUILD.gn
@@ -21,7 +21,6 @@
     "//ios/chrome/browser/ui/fullscreen:ui",
     "//ios/chrome/browser/ui/ntp",
     "//ios/chrome/browser/ui/qr_scanner/requirements",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/public/provider/chrome/browser/voice",
   ]
 }
diff --git a/ios/chrome/browser/ui/toolbar/resources/BUILD.gn b/ios/chrome/browser/ui/toolbar/resources/BUILD.gn
deleted file mode 100644
index 9b0f8ca..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ios/asset_catalog.gni")
-
-imageset("toolbar_dark_newtab") {
-  sources = [
-    "toolbar_dark_newtab.imageset/Contents.json",
-    "toolbar_dark_newtab.imageset/toolbar_dark_newtab.png",
-    "toolbar_dark_newtab.imageset/toolbar_dark_newtab@2x.png",
-    "toolbar_dark_newtab.imageset/toolbar_dark_newtab@3x.png",
-  ]
-}
-
-imageset("toolbar_dark_newtab_incognito_active") {
-  sources = [
-    "toolbar_dark_newtab_incognito_active.imageset/Contents.json",
-    "toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active.png",
-    "toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@2x.png",
-    "toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@3x.png",
-  ]
-}
-
-imageset("toolbar_dark_newtab_incognito") {
-  sources = [
-    "toolbar_dark_newtab_incognito.imageset/Contents.json",
-    "toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito.png",
-    "toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@2x.png",
-    "toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@3x.png",
-  ]
-}
-
-imageset("toolbar_dark_newtab_active") {
-  sources = [
-    "toolbar_dark_newtab_active.imageset/Contents.json",
-    "toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active.png",
-    "toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@2x.png",
-    "toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@3x.png",
-  ]
-}
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/Contents.json b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/Contents.json
deleted file mode 100644
index b5a9dcc..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "1x",
-            "filename": "toolbar_dark_newtab.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "toolbar_dark_newtab@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "toolbar_dark_newtab@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab.png
deleted file mode 100644
index d825da8d..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@2x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@2x.png
deleted file mode 100644
index 11c0523..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@3x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@3x.png
deleted file mode 100644
index 5d0a3d6b..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab.imageset/toolbar_dark_newtab@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/Contents.json b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/Contents.json
deleted file mode 100644
index ea74413..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "1x",
-            "filename": "toolbar_dark_newtab_active.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "toolbar_dark_newtab_active@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "toolbar_dark_newtab_active@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active.png
deleted file mode 100644
index ec10702..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@2x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@2x.png
deleted file mode 100644
index ae7d893a..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@3x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@3x.png
deleted file mode 100644
index cb81f38..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_active.imageset/toolbar_dark_newtab_active@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/Contents.json b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/Contents.json
deleted file mode 100644
index ed69a14..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "1x",
-            "filename": "toolbar_dark_newtab_incognito.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "toolbar_dark_newtab_incognito@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "toolbar_dark_newtab_incognito@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito.png
deleted file mode 100644
index 0e34620..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@2x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@2x.png
deleted file mode 100644
index 5089ad5d..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@3x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@3x.png
deleted file mode 100644
index d15df59..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito.imageset/toolbar_dark_newtab_incognito@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/Contents.json b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/Contents.json
deleted file mode 100644
index b7a04f5..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "images": [
-        {
-            "idiom": "universal",
-            "scale": "1x",
-            "filename": "toolbar_dark_newtab_incognito_active.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "2x",
-            "filename": "toolbar_dark_newtab_incognito_active@2x.png"
-        },
-        {
-            "idiom": "universal",
-            "scale": "3x",
-            "filename": "toolbar_dark_newtab_incognito_active@3x.png"
-        }
-    ],
-    "info": {
-        "version": 1,
-        "author": "xcode"
-    }
-}
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active.png
deleted file mode 100644
index befee8e..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@2x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@2x.png
deleted file mode 100644
index ccd1f44b..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@2x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@3x.png b/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@3x.png
deleted file mode 100644
index eb1de90..0000000
--- a/ios/chrome/browser/ui/toolbar/resources/toolbar_dark_newtab_incognito_active.imageset/toolbar_dark_newtab_incognito_active@3x.png
+++ /dev/null
Binary files differ
diff --git a/ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h b/ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h
new file mode 100644
index 0000000..221171b
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_COORDINATOR_H_
+
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
+
+// Coordinator for the secondary part of the adaptive toolbar. It is the part
+// containing the controls displayed only on specific size classes.
+@interface SecondaryToolbarCoordinator : AdaptiveToolbarCoordinator
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.mm b/ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.mm
similarity index 74%
rename from ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.mm
rename to ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.mm
index 266ce16..0a41a7f 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.mm
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.mm
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_coordinator.h"
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_coordinator+subclassing.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator+subclassing.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h
similarity index 71%
rename from ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h
rename to ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h
index d7e0d1d..14e5052 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_H_
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/adaptive_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view.h"
 
 @class ToolbarButtonFactory;
 
@@ -25,4 +25,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_SECONDARY_TOOLBAR_VIEW_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.mm b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
similarity index 98%
rename from ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.mm
rename to ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
index 3f414c9..756ee8476 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.mm
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h"
 
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h"
diff --git a/ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.h
new file mode 100644
index 0000000..23d8db2
--- /dev/null
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.h
@@ -0,0 +1,16 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
+
+#import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h"
+
+// ViewController for the secondary part of the adaptive toolbar. It is the part
+// containing the controls displayed only on specific size classes.
+@interface SecondaryToolbarViewController : AdaptiveToolbarViewController
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_SECONDARY_TOOLBAR_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.mm
similarity index 86%
rename from ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm
rename to ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.mm
index 684d20a..1bd40ce6 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view_controller.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view_controller.h"
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/secondary_toolbar_view.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_tools_menu_button.h"
+#import "ios/chrome/browser/ui/toolbar/secondary_toolbar_view.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/toolbar/test/BUILD.gn b/ios/chrome/browser/ui/toolbar/test/BUILD.gn
index 8fbdc98..985d182 100644
--- a/ios/chrome/browser/ui/toolbar/test/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/test/BUILD.gn
@@ -20,8 +20,7 @@
   deps = [
     "//ios/chrome/browser/ui:ui_util",
     "//ios/chrome/browser/ui/broadcaster",
-    "//ios/chrome/browser/ui/toolbar",
-    "//ios/chrome/browser/ui/toolbar:toolbar_ui",
+    "//ios/chrome/browser/ui/toolbar/fullscreen",
     "//ios/web/public/test/fakes",
     "//testing/gtest",
   ]
diff --git a/ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.mm b/ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.mm
index 9075524b..479f462 100644
--- a/ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.mm
+++ b/ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.mm
@@ -4,8 +4,8 @@
 
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_broadcast_test_util.h"
 
+#import "ios/chrome/browser/ui/toolbar/fullscreen/toolbar_ui.h"
 #import "ios/chrome/browser/ui/toolbar/test/test_toolbar_ui_observer.h"
-#import "ios/chrome/browser/ui/toolbar/toolbar_ui.h"
 #include "ios/chrome/browser/ui/ui_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h b/ios/chrome/browser/ui/toolbar/toolbar_consumer.h
similarity index 86%
rename from ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h
rename to ios/chrome/browser/ui/toolbar/toolbar_consumer.h
index d6c9a79..dab7cf3 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_consumer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_CONSUMER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_CONSUMER_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONSUMER_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONSUMER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -31,4 +31,4 @@
 - (void)setIsNTP:(BOOL)isNTP;
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_CONSUMER_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinatee.h b/ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h
similarity index 72%
rename from ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinatee.h
rename to ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h
index 0ea839bf..cf4c011 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinatee.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATEE_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATEE_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATEE_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATEE_H_
 
 #import "ios/chrome/browser/ui/commands/toolbar_commands.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_controller_delegate.h"
@@ -19,4 +19,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATEE_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATEE_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h
similarity index 72%
rename from ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h
rename to ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h
index 4f92431..cd25f298 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_ADAPTOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_ADAPTOR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_ADAPTOR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_ADAPTOR_H_
 
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_updating.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_coordinating.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h"
 
 @class CommandDispatcher;
 @protocol ToolbarCoordinatee;
@@ -26,4 +25,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_COORDINATOR_ADAPTOR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_ADAPTOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.mm b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.mm
similarity index 94%
rename from ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.mm
rename to ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.mm
index c4af62a9..698ba64 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.mm
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinator_adaptor.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h"
 
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/commands/toolbar_commands.h"
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_coordinatee.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_coordinatee.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h
similarity index 79%
rename from ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h
rename to ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h
index 76418d1f..d6bc110 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_coordinator_delegate.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_COORDINATOR_DELEGATE_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_COORDINATOR_DELEGATE_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_DELEGATE_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_DELEGATE_H_
 
 #import <Foundation/Foundation.h>
 
@@ -27,4 +27,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_COORDINATOR_DELEGATE_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_COORDINATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h b/ios/chrome/browser/ui/toolbar/toolbar_mediator.h
similarity index 84%
rename from ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h
rename to ios/chrome/browser/ui/toolbar/toolbar_mediator.h
index aa43379..33f6b29 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_MEDIATOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_MEDIATOR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MEDIATOR_H_
 
 #import <Foundation/Foundation.h>
 
@@ -40,4 +40,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_CLEAN_TOOLBAR_MEDIATOR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.mm b/ios/chrome/browser/ui/toolbar/toolbar_mediator.mm
similarity index 98%
rename from ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.mm
rename to ios/chrome/browser/ui/toolbar/toolbar_mediator.mm
index ebb0a3b1..6d85dc7 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_mediator.h"
 
 #include "base/memory/ptr_util.h"
 #include "base/scoped_observer.h"
@@ -11,7 +11,7 @@
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/ui/bookmarks/bookmark_model_bridge_observer.h"
 #import "ios/chrome/browser/ui/ntp/ntp_util.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator_unittest.mm b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
similarity index 99%
rename from ios/chrome/browser/ui/toolbar/clean/toolbar_mediator_unittest.mm
rename to ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
index 4dc3399..7ea933d 100644
--- a/ios/chrome/browser/ui/toolbar/clean/toolbar_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_mediator_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_mediator.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_mediator.h"
 
 #include <memory>
 
@@ -13,9 +13,9 @@
 #include "components/bookmarks/test/bookmark_test_helpers.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
-#import "ios/chrome/browser/ui/toolbar/clean/toolbar_consumer.h"
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_navigation_manager.h"
 #import "ios/chrome/browser/ui/toolbar/test/toolbar_test_web_state.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_consumer.h"
 #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_owner.h b/ios/chrome/browser/ui/toolbar/toolbar_owner.h
deleted file mode 100644
index affa198..0000000
--- a/ios/chrome/browser/ui/toolbar/toolbar_owner.h
+++ /dev/null
@@ -1,25 +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 IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_OWNER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_OWNER_H_
-
-#import <UIKit/UIKit.h>
-
-@class ToolbarController;
-@protocol ToolbarSnapshotProviding;
-
-@protocol ToolbarOwner<NSObject>
-
-// TODO(crbug.com/781786): Remove this once the TabGrid is enabled.
-// Returns the frame of the toolbar.
-- (CGRect)toolbarFrame;
-
-// Snapshot provider for the toolbar owner by this class.
-@property(nonatomic, strong, readonly) id<ToolbarSnapshotProviding>
-    toolbarSnapshotProvider;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_OWNER_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.h b/ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h
similarity index 67%
rename from ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.h
rename to ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h
index f0aa484..81e1ea5 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.h
+++ b/ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_PROGRESS_BAR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_PROGRESS_BAR_H_
+#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_PROGRESS_BAR_H_
+#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_PROGRESS_BAR_H_
 
 #import "ios/third_party/material_components_ios/src/components/ProgressView/src/MaterialProgressView.h"
 
@@ -12,4 +12,4 @@
 @interface ToolbarProgressBar : MDCProgressView
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_ADAPTIVE_TOOLBAR_PROGRESS_BAR_H_
+#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_PROGRESS_BAR_H_
diff --git a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.mm b/ios/chrome/browser/ui/toolbar/toolbar_progress_bar.mm
similarity index 89%
rename from ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.mm
rename to ios/chrome/browser/ui/toolbar/toolbar_progress_bar.mm
index 352fd399..d35bb662 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_progress_bar.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/toolbar/adaptive/toolbar_progress_bar.h"
+#import "ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h"
 
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h b/ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h
deleted file mode 100644
index 8a7e9fd..0000000
--- a/ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h
+++ /dev/null
@@ -1,49 +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 IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_RESOURCE_MACROS_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_RESOURCE_MACROS_H_
-
-#include "ios/chrome/grit/ios_theme_resources.h"
-
-// These macros are used to populate the 3-dimensional array used to map from
-// a button's name/style/state combination to resource ID pointing to the image
-// to be used for the button.
-// Each macro should "produce" a 2x3 entry for a button specified by |name|
-// where style ∈ [light, dark] and state ∈ [normal, pressed, disabled].
-// 0 is used when the resource for a given combination does not exist.
-
-// clang-format off
-// TODO(crbug.com/800266): Remove those macros and the associated images.
-#define TOOLBAR_IDR_THREE_STATE(name) \
-  { { IDR_IOS_TOOLBAR_LIGHT_ ## name, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _PRESSED, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _DISABLED }, \
-    { IDR_IOS_TOOLBAR_DARK_ ## name, \
-      IDR_IOS_TOOLBAR_DARK_ ## name ## _PRESSED, \
-      IDR_IOS_TOOLBAR_DARK_ ## name ## _DISABLED } }
-
-#define TOOLBAR_IDR_TWO_STATE(name) \
-  { { IDR_IOS_TOOLBAR_LIGHT_ ## name, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _PRESSED, 0 }, \
-    { IDR_IOS_TOOLBAR_DARK_ ## name, \
-      IDR_IOS_TOOLBAR_DARK_ ## name ## _PRESSED, 0 } }
-
-#define TOOLBAR_IDR_ONE_STATE(name) \
-  { { IDR_IOS_TOOLBAR_LIGHT_ ## name, 0, 0 }, \
-    { IDR_IOS_TOOLBAR_LIGHT_ ## name, 0, 0 } }
-
-#define TOOLBAR_IDR_LIGHT_ONLY_THREE_STATE(name) \
-  { { IDR_IOS_TOOLBAR_LIGHT_ ## name, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _PRESSED, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _DISABLED }, \
-      { 0, 0, 0 } }
-
-#define TOOLBAR_IDR_LIGHT_ONLY_TWO_STATE(name) \
-  { { IDR_IOS_TOOLBAR_LIGHT_ ## name, \
-      IDR_IOS_TOOLBAR_LIGHT_ ## name ## _PRESSED, 0 }, \
-      { 0, 0, 0 } }
-// clang-format on
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_RESOURCE_MACROS_H_
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h b/ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h
deleted file mode 100644
index 4d28003..0000000
--- a/ios/chrome/browser/ui/toolbar/toolbar_snapshot_providing.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_SNAPSHOT_PROVIDER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_SNAPSHOT_PROVIDER_H_
-
-#import <UIKit/UIKit.h>
-
-// Protocol for an object providing toolbar snapshot.
-@protocol ToolbarSnapshotProviding
-
-// Snapshot used by the TabSwitcher.
-- (UIView*)snapshotForTabSwitcher;
-
-// Returns a snapshot used by the StackView after resizing the toolbar to
-// |frame|.
-- (UIView*)snapshotForStackViewWithWidth:(CGFloat)width
-                          safeAreaInsets:(UIEdgeInsets)safeAreaInsets;
-
-// Asks the provider for the color of the background of the toolbar. A nil value
-// indicates the default color will be used.
-- (UIColor*)toolbarBackgroundColor;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLBAR_TOOLBAR_SNAPSHOT_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/BUILD.gn b/ios/chrome/browser/ui/tools_menu/BUILD.gn
deleted file mode 100644
index 0192bca..0000000
--- a/ios/chrome/browser/ui/tools_menu/BUILD.gn
+++ /dev/null
@@ -1,90 +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.
-
-source_set("tools_menu") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [
-    "new_tab_menu_view_item.h",
-    "new_tab_menu_view_item.mm",
-    "reading_list_menu_view_item.h",
-    "reading_list_menu_view_item.mm",
-    "tools_menu_coordinator.h",
-    "tools_menu_coordinator.mm",
-    "tools_menu_model.h",
-    "tools_menu_model.mm",
-    "tools_menu_view_controller.h",
-    "tools_menu_view_controller.mm",
-    "tools_menu_view_item.h",
-    "tools_menu_view_item.mm",
-    "tools_menu_view_tools_cell.h",
-    "tools_menu_view_tools_cell.mm",
-    "tools_popup_controller.h",
-    "tools_popup_controller.mm",
-  ]
-  deps = [
-    ":configuration",
-    "//base",
-    "//base:i18n",
-    "//components/feature_engagement",
-    "//components/strings",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser",
-    "//ios/chrome/browser/ui",
-    "//ios/chrome/browser/ui/colors",
-    "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
-    "//ios/chrome/browser/ui/fullscreen:coordinators",
-    "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/chrome/browser/ui/popup_menu:popup_menu_ui",
-    "//ios/chrome/browser/ui/reading_list",
-    "//ios/chrome/browser/ui/reading_list:reading_list_ui",
-    "//ios/chrome/browser/ui/toolbar:resource_macros",
-    "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/chrome/common",
-    "//ios/public/provider/chrome/browser",
-    "//ios/public/provider/chrome/browser/user_feedback",
-    "//ios/third_party/material_components_ios",
-    "//ios/third_party/material_roboto_font_loader_ios",
-    "//ios/web/public",
-    "//ui/base",
-  ]
-  libs = [
-    "QuartzCore.framework",
-    "UIKit.framework",
-  ]
-}
-
-source_set("configuration") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [
-    "tools_menu_configuration.h",
-    "tools_menu_configuration.mm",
-  ]
-  deps = [
-    "//base",
-    "//ios/web/public",
-  ]
-}
-
-source_set("unit_tests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  sources = [
-    "reading_list_menu_view_item_unittest.mm",
-    "tools_menu_view_controller_unittest.mm",
-    "tools_menu_view_item_unittest.mm",
-  ]
-  deps = [
-    ":tools_menu",
-    "//base",
-    "//ios/chrome/browser:browser",
-    "//ios/chrome/browser/ui/commands:commands",
-    "//ios/chrome/browser/ui/reading_list:reading_list_ui",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu:configuration",
-    "//ios/chrome/browser/ui/tools_menu/public",
-    "//ios/web/public",
-    "//testing/gtest",
-  ]
-}
diff --git a/ios/chrome/browser/ui/tools_menu/OWNERS b/ios/chrome/browser/ui/tools_menu/OWNERS
deleted file mode 100644
index 4bf74372..0000000
--- a/ios/chrome/browser/ui/tools_menu/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-edchin@chromium.org
-rohitrao@chromium.org
-sczs@chromium.org
-
-# TEAM: ios-directory-owners@chromium.org
-# OS: iOS
diff --git a/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.h b/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.h
deleted file mode 100644
index 36540e3..0000000
--- a/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_NEW_TAB_MENU_VIEW_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_NEW_TAB_MENU_VIEW_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-
-// Specialization of a ToolsMenuViewItem for opening a new tab.
-@interface NewTabMenuViewItem : ToolsMenuViewItem
-@end
-
-// Specialization of a ToolsMenuViewItem for opening a new incognito tab.
-@interface NewIncognitoTabMenuViewItem : NewTabMenuViewItem
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_NEW_TAB_MENU_VIEW_ITEM_H_
diff --git a/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.mm b/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.mm
deleted file mode 100644
index 2ad64de6..0000000
--- a/ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.mm
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.h"
-
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface NewTabMenuViewItem ()
-@property(nonatomic, readonly, getter=isIncognito) BOOL incognito;
-@end
-
-@implementation NewTabMenuViewItem
-
-- (BOOL)isIncognito {
-  return NO;
-}
-
-- (BOOL)canExecuteCommand {
-  return YES;
-}
-
-- (void)executeCommandWithDispatcher:
-    (id<ApplicationCommands, BrowserCommands>)dispatcher {
-  UIView* view = self.tableViewCell;
-  CGPoint center = [view.superview convertPoint:view.center toView:view.window];
-  OpenNewTabCommand* command =
-      [OpenNewTabCommand commandWithIncognito:self.isIncognito
-                                  originPoint:center];
-  [dispatcher openNewTab:command];
-}
-
-@end
-
-@implementation NewIncognitoTabMenuViewItem
-
-- (BOOL)isIncognito {
-  return YES;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/public/BUILD.gn b/ios/chrome/browser/ui/tools_menu/public/BUILD.gn
deleted file mode 100644
index 19d4767f..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/BUILD.gn
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("public") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  sources = [
-    "tools_menu_configuration_provider.h",
-    "tools_menu_constants.h",
-    "tools_menu_constants.mm",
-    "tools_menu_presentation_provider.h",
-    "tools_menu_presentation_state_provider.h",
-  ]
-  deps = [
-    "//base",
-    "//ios/chrome/browser/ui/popup_menu:constants",
-    "//ios/web/public",
-  ]
-}
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_configuration_provider.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_configuration_provider.h
deleted file mode 100644
index bad506c..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_configuration_provider.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONFIGURATION_PROVIDER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONFIGURATION_PROVIDER_H_
-
-#import <Foundation/Foundation.h>
-
-@class ToolsMenuCoordinator, ToolsMenuConfiguration;
-
-// A protocol that describes a set of methods which may configure a
-// ToolsMenuCoordinator. Most of the configuration of the coordinator may be
-// achieved through the required ToolsMenuConfiguration object, but some
-// optional minor elements such as bookmark highlights are also independently
-// configurable.
-// TODO(crbug.com/800266): Remove this protocol.
-@protocol ToolsMenuConfigurationProvider<NSObject>
-// Returns a ToolsMenuConfiguration object describing the desired configuration
-// of the tools menu.
-- (ToolsMenuConfiguration*)menuConfigurationForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-@optional
-// If implemented, may influence how the tools menu shows the bookmark
-// indicator in the tools UI.
-- (BOOL)shouldHighlightBookmarkButtonForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-// If implemented, may influence the presence of the find bar in the tools
-// UI.
-- (BOOL)shouldShowFindBarForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-// If implemented,may influence the presence of the share menu in the tools
-// UI.
-- (BOOL)shouldShowShareMenuForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-// If implemented, may influence how the tools menu shows page-reload related
-// UI.
-- (BOOL)isTabLoadingForToolsMenuCoordinator:(ToolsMenuCoordinator*)coordinator;
-// If implemented, allows the delegate to be informed of an imminent
-// presentation of the tools menu. The delegate may choose to dismiss other
-// presented UI or otherwise configure itself for the menu presentation.
-- (void)prepareForToolsMenuPresentationByCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONFIGURATION_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
deleted file mode 100644
index e403407..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONSTANTS_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONSTANTS_H_
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
-
-// Tools Menu Notifications.
-// Notification that the tools menu will be shown.
-extern NSString* const kToolsMenuWillShowNotification;
-// Notification that the tools menu will dismiss.
-extern NSString* const kToolsMenuWillHideNotification;
-// Notification that the tools menu did show.
-extern NSString* const kToolsMenuDidShowNotification;
-// Notification that the tools menu did dismiss.
-extern NSString* const kToolsMenuDidHideNotification;
-
-
-// Identifiers for tools menu items (for metrics purposes).
-typedef NS_ENUM(int, ToolsMenuItemID) {
-  // All of these values must be < 0.
-  TOOLS_STOP_ITEM = -1,
-  TOOLS_RELOAD_ITEM = -2,
-  TOOLS_BOOKMARK_ITEM = -3,
-  TOOLS_BOOKMARK_EDIT = -4,
-  TOOLS_SHARE_ITEM = -5,
-  TOOLS_MENU_ITEM = -6,
-  TOOLS_SETTINGS_ITEM = -7,
-  TOOLS_NEW_TAB_ITEM = -8,
-  TOOLS_NEW_INCOGNITO_TAB_ITEM = -9,
-  TOOLS_READING_LIST = -10,
-  // -11 is deprecated.
-  TOOLS_SHOW_HISTORY = -12,
-  TOOLS_CLOSE_ALL_TABS = -13,
-  TOOLS_CLOSE_ALL_INCOGNITO_TABS = -14,
-  TOOLS_VIEW_SOURCE = -15,
-  TOOLS_REPORT_AN_ISSUE = -16,
-  TOOLS_SHOW_FIND_IN_PAGE = -17,
-  TOOLS_SHOW_HELP_PAGE = -18,
-  TOOLS_SHOW_BOOKMARKS = -19,
-  TOOLS_SHOW_RECENT_TABS = -20,
-  TOOLS_REQUEST_DESKTOP_SITE = -21,
-  TOOLS_REQUEST_MOBILE_SITE = -22,
-};
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm b/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
deleted file mode 100644
index 93e8a67..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.mm
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-// Tools menu presentation notifications.
-NSString* const kToolsMenuWillShowNotification =
-    @"kToolsMenuWillShowNotification";
-NSString* const kToolsMenuWillHideNotification =
-    @"kToolsMenuWillHideNotification";
-NSString* const kToolsMenuDidShowNotification =
-    @"kToolsMenuDidShowNotification";
-NSString* const kToolsMenuDidHideNotification =
-    @"kToolsMenuDidHideNotification";
-
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h
deleted file mode 100644
index 6051d41..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_PRESENTATION_PROVIDER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_PRESENTATION_PROVIDER_H_
-
-#import <Foundation/Foundation.h>
-
-@class ToolsMenuCoordinator, UIButton;
-
-// A protocol which allows details of the presentation of the tools menu to be
-// configured.
-@protocol ToolsMenuPresentationProvider
-// Returns the button being used to present and dismiss the tools menu,
-// if applicable.
-- (UIButton*)presentingButtonForToolsMenuCoordinator:
-    (ToolsMenuCoordinator*)coordinator;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_PUBLIC_TOOLS_MENU_PRESENTATION_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h b/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h
deleted file mode 100644
index 5575a2fb..0000000
--- a/ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_PRESENTATION_STATE_PROVIDER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_PRESENTATION_STATE_PROVIDER_H_
-
-#import <Foundation/Foundation.h>
-
-// A protocol which allows objects to be able to request information about
-// the presentation state of the tools UI without having to have full
-// knowledge of the ToolsMenuCoordinator class.
-@protocol ToolsMenuPresentationStateProvider
-// Returns whether the tools menu on screen and being presented to the user.
-- (BOOL)isShowingToolsMenu;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_PRESENTATION_STATE_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h b/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h
deleted file mode 100644
index 9ad3a152..0000000
--- a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h
+++ /dev/null
@@ -1,39 +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 IOS_CHROME_BROWSER_UI_TOOLS_MENU_READING_LIST_MENU_VIEW_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_READING_LIST_MENU_VIEW_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-
-@class NumberBadgeView;
-
-// Specialization of a ToolsMenuViewItem for the reading list.
-@interface ReadingListMenuViewItem : ToolsMenuViewItem
-@end
-
-// Specialization of a ToolsMenuViewCell that shows a badge showing the number
-// of unread reading list items and sets the menu item title and badge color
-// based on existence of unread items.
-@interface ReadingListMenuViewCell : ToolsMenuViewCell
-
-// Update the badge count according to |count|. Can be animated or not. If
-// |count| is greater than 0 and the text badge is visible, then the text badge
-// is animated out, because only one badge should be visible, and the number
-// badge takes precedence.
-- (void)updateBadgeCount:(NSInteger)count animated:(BOOL)animated;
-
-// Displays or hides the text badge based on |showTextBadge|. Does nothing if
-// the number badge is currently visible. Can be animated or not.
-- (void)updateShowTextBadge:(BOOL)showTextBadge animated:(BOOL)animated;
-
-// Update the seen state according to |hasUnseenItems|. Can be animated or
-// not.
-- (void)updateSeenState:(BOOL)hasUnseenItems animated:(BOOL)animated;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_READING_LIST_MENU_VIEW_ITEM_H_
diff --git a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.mm b/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.mm
deleted file mode 100644
index 00cc03a5..0000000
--- a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.mm
+++ /dev/null
@@ -1,175 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h"
-
-#include "base/mac/foundation_util.h"
-#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
-#import "ios/chrome/browser/ui/reading_list/number_badge_view.h"
-#import "ios/chrome/browser/ui/reading_list/text_badge_view.h"
-#import "ios/chrome/common/material_timing.h"
-#include "ios/chrome/grit/ios_strings.h"
-#import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
-#include "ui/base/l10n/l10n_util_mac.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-// Accessibility identifier for the text badge on the reading list cell.
-NSString* const kToolsMenuTextBadgeAccessibilityIdentifier =
-    @"kToolsMenuTextBadgeAccessibilityIdentifier";
-
-namespace {
-// ID for cell reuse
-static NSString* const kReadingListCellID = @"ReadingListCellID";
-const CGFloat kToolsMenuItemTrailingMargin = 25;
-// How long (in seconds) it takes to animate in / out the text badge.
-const NSTimeInterval kTextBadgeAnimationDuration = ios::material::kDuration3;
-}  // namespace
-
-@interface ReadingListMenuViewCell ()
-// A badge displaying how many unread items are in the user's reading list.
-// Only one of |numberBadge| and |textBadge| can be shown at once. If both
-// try to be shown at once, |numberBadge| takes precedence over |textBadge|.
-@property(nonatomic, strong) NumberBadgeView* numberBadge;
-// A badge displaying "NEW" to draw attention to the reading list cell.
-@property(nonatomic, strong) TextBadgeView* textBadge;
-
-@end
-
-@implementation ReadingListMenuViewItem
-
-+ (NSString*)cellID {
-  return kReadingListCellID;
-}
-
-+ (Class)cellClass {
-  return [ReadingListMenuViewCell class];
-}
-
-@end
-
-@implementation ReadingListMenuViewCell
-
-@synthesize numberBadge = _numberBadge;
-@synthesize textBadge = _textBadge;
-
-- (void)initializeViews {
-  if (self.numberBadge && self.textBadge && [self title]) {
-    return;
-  }
-
-  [super initializeViews];
-
-  self.numberBadge = [[NumberBadgeView alloc] initWithFrame:CGRectZero];
-  [self.contentView addSubview:self.numberBadge];
-
-  [self.contentView removeConstraints:self.contentView.constraints];
-
-  [NSLayoutConstraint activateConstraints:@[
-    [self.title.centerYAnchor
-        constraintEqualToAnchor:self.contentView.centerYAnchor]
-  ]];
-  [self addConstraintsToBadge:self.numberBadge];
-
-  NSString* text = l10n_util::GetNSStringWithFixup(
-      IDS_IOS_READING_LIST_CELL_NEW_FEATURE_BADGE);
-  NSString* uppercaseText =
-      [text uppercaseStringWithLocale:[NSLocale currentLocale]];
-  self.textBadge = [[TextBadgeView alloc] initWithText:uppercaseText];
-  self.textBadge.hidden = YES;
-  self.textBadge.accessibilityIdentifier =
-      kToolsMenuTextBadgeAccessibilityIdentifier;
-  self.textBadge.accessibilityLabel = text;
-  [self.contentView addSubview:self.textBadge];
-
-  [self addConstraintsToBadge:self.textBadge];
-}
-
-- (void)updateBadgeCount:(NSInteger)count animated:(BOOL)animated {
-  [self.numberBadge setNumber:count animated:animated];
-  // If the number badge is shown, then the text badge must be hidden.
-  if (!self.numberBadge.isHidden && !self.textBadge.isHidden) {
-    [self updateShowTextBadge:NO animated:animated];
-  }
-}
-
-- (void)updateSeenState:(BOOL)hasUnseenItems animated:(BOOL)animated {
-  if (hasUnseenItems) {
-    UIColor* highlightedColor = [[MDCPalette cr_bluePalette] tint500];
-
-    [self.numberBadge setBackgroundColor:highlightedColor animated:animated];
-    [self.title setTextColor:highlightedColor];
-  } else {
-    UIColor* regularColor = [[MDCPalette greyPalette] tint500];
-
-    [self.numberBadge setBackgroundColor:regularColor animated:animated];
-    [self.title setTextColor:[UIColor blackColor]];
-  }
-}
-
-- (void)updateShowTextBadge:(BOOL)showTextBadge animated:(BOOL)animated {
-  // Only 1 badge can be visible at a time, and the number badge takes priority.
-  if (showTextBadge && !self.numberBadge.isHidden) {
-    return;
-  }
-  CGFloat alpha = (showTextBadge ? 1.0 : 0.0);
-  NSTimeInterval duration = (animated ? kTextBadgeAnimationDuration : 0.0);
-  if (showTextBadge) {
-    self.textBadge.hidden = NO;
-  } else if (!animated) {
-    DCHECK(!showTextBadge);
-    // The completion block in the animateWithDuration call is not called
-    // immediately if |duration| is 0.0 (unlike the animation block). This would
-    // cause the state to be incorrect until the completion callback is invoked,
-    // so its value must be set here if there is no animation.
-    self.textBadge.hidden = YES;
-  }
-  // If |duration| is 0.0, the block is executed immediately (that is, the
-  // properties are set directly without any actual animation). Else, the
-  // animation occurs as normal.
-  [UIView animateWithDuration:duration
-      animations:^{
-        self.textBadge.alpha = alpha;
-      }
-      completion:^(BOOL finished) {
-        if (finished && !showTextBadge) {
-          self.textBadge.hidden = YES;
-        }
-      }];
-}
-
-#pragma mark - Private Methods
-
-// Adds autolayout constraints to |badgeView| that center it vertically in the
-// cell and anchor it to the right.
-- (void)addConstraintsToBadge:(UIView*)badgeView {
-  [badgeView setTranslatesAutoresizingMaskIntoConstraints:NO];
-
-  NSMutableArray<NSLayoutConstraint*>* constraintsToApply = [NSMutableArray
-      arrayWithArray:
-          [NSLayoutConstraint
-              constraintsWithVisualFormat:
-                  @"H:|-(margin)-[title]->=8-[badge]-(endMargin)-|"
-                                  options:
-                                      NSLayoutFormatDirectionLeadingToTrailing
-                                  metrics:@{
-                                    @"margin" : @(self.horizontalMargin),
-                                    @"endMargin" :
-                                        @(kToolsMenuItemTrailingMargin)
-                                  }
-                                    views:@{
-                                      @"title" : self.title,
-                                      @"badge" : badgeView
-                                    }]];
-
-  [constraintsToApply
-      addObject:[badgeView.centerYAnchor
-                    constraintEqualToAnchor:self.contentView.centerYAnchor]];
-
-  [NSLayoutConstraint activateConstraints:constraintsToApply];
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item_unittest.mm b/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item_unittest.mm
deleted file mode 100644
index 8200570e..0000000
--- a/ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item_unittest.mm
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h"
-
-#import <UIKit/UIKit.h>
-
-#include "ios/chrome/browser/ui/reading_list/number_badge_view.h"
-#include "ios/chrome/browser/ui/reading_list/text_badge_view.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface ReadingListMenuViewCell (Testing)
-
-@property(nonatomic, strong) NumberBadgeView* numberBadge;
-@property(nonatomic, strong) TextBadgeView* textBadge;
-
-@end
-
-namespace {
-
-class ReadingListMenuViewCellTest : public PlatformTest {
- public:
-  ReadingListMenuViewCellTest()
-      : readingListMenuViewCell_([[ReadingListMenuViewCell alloc] init]) {
-    [readingListMenuViewCell_ initializeViews];
-  }
-
- protected:
-  ReadingListMenuViewCell* readingListMenuViewCell_;
-};
-
-// Test that the |isNumberBadgeHidden| and |isTextBadgeHidden| properties are
-// initialized correctly.
-TEST_F(ReadingListMenuViewCellTest, Initialization) {
-  EXPECT_TRUE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateBadgeCount with a positive value causes the number
-// badge to appear but the text badge to remain hidden.
-TEST_F(ReadingListMenuViewCellTest, NumberBadgeAlone) {
-  [readingListMenuViewCell_ updateBadgeCount:1 animated:NO];
-
-  EXPECT_FALSE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateBadgeCount with a non-positive value while the number
-// badge is visible causes the number badge to disappear and the text badge
-// to remain hidden.
-TEST_F(ReadingListMenuViewCellTest, NumberBadgeAloneHides) {
-  [readingListMenuViewCell_ updateBadgeCount:1 animated:NO];
-  [readingListMenuViewCell_ updateBadgeCount:0 animated:NO];
-
-  EXPECT_TRUE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateShowTextBadge with |YES| causes the text badge
-// to appear but the number badge to remain hidden.
-TEST_F(ReadingListMenuViewCellTest, TextBadgeAlone) {
-  [readingListMenuViewCell_ updateShowTextBadge:YES animated:NO];
-
-  EXPECT_TRUE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_FALSE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateShowTextBadge with |NO| while the text badge is
-// visible causes the text badge to disappear and the number badge to remain
-// hidden.
-TEST_F(ReadingListMenuViewCellTest, TextBadgeAloneHides) {
-  [readingListMenuViewCell_ updateShowTextBadge:YES animated:NO];
-  [readingListMenuViewCell_ updateShowTextBadge:NO animated:NO];
-
-  EXPECT_TRUE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateBadgeCount with a positive value while the text badge
-// is shown causes the number badge to appear but the text badge to disappear.
-TEST_F(ReadingListMenuViewCellTest, NumberBadgeHidesTextBadge) {
-  [readingListMenuViewCell_ updateShowTextBadge:YES animated:NO];
-  [readingListMenuViewCell_ updateBadgeCount:1 animated:NO];
-
-  EXPECT_FALSE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-// Test that calling updateShowTextBadge with |YES| does not cause the text
-// badge to appear if the number badge is already visible.
-TEST_F(ReadingListMenuViewCellTest,
-       TextBadgeDoesNotShowIfNumberBadgeIsVisible) {
-  [readingListMenuViewCell_ updateBadgeCount:1 animated:NO];
-  [readingListMenuViewCell_ updateShowTextBadge:YES animated:NO];
-
-  EXPECT_FALSE(readingListMenuViewCell_.numberBadge.isHidden);
-  EXPECT_TRUE(readingListMenuViewCell_.textBadge.isHidden);
-}
-
-}  // namespace
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
deleted file mode 100644
index 1470d13..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h
+++ /dev/null
@@ -1,76 +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 IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONFIGURATION_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONFIGURATION_H_
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-@class ReadingListMenuNotifier;
-
-namespace web {
-enum class UserAgentType : short;
-}  // namespace web
-
-namespace feature_engagement {
-class Tracker;
-}  // namespace feature_engagement
-
-// Configuation defining options that can be set to change the tools menu's
-// appearance. All boolean properties are set to NO, and |userAgentType| is set
-// to NONE by default.
-@interface ToolsMenuConfiguration : NSObject
-// Indicates that the menu is being shown while in the tab switcher.
-@property(nonatomic, getter=isInTabSwitcher) BOOL inTabSwitcher;
-// Indicates that the menu is being shown while there are no open tabs.
-@property(nonatomic, getter=hasNoOpenedTabs) BOOL noOpenedTabs;
-// Indicates that the menu is being shown while in incognito mode.
-@property(nonatomic, getter=isInIncognito) BOOL inIncognito;
-// Indicates that the menu should show a "NEW" badge on the reading list item.
-@property(nonatomic, assign) BOOL showReadingListNewBadge;
-// Indicates that the New Incognito Tab cell should be highlighted in blue.
-@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell;
-
-// Indicates that the menu is being shown while user agent is |userAgentType|.
-// If NONE, shows "Request Desktop Site" in disabled state.
-// If MOBILE, shows "Request Desktop Site" in enabled state.
-// If DESKTOP, shows "Request Mobile Site" in enabled state.
-@property(nonatomic, assign) web::UserAgentType userAgentType;
-
-// The view controller from which to present other view controllers.
-@property(nonatomic, weak, readonly) UIViewController* baseViewController;
-// View that the menu will be displayed in.
-@property(nonatomic, weak, readonly) UIView* displayView;
-// Button from which popup menu will be opened.
-@property(nonatomic, weak) UIButton* toolsMenuButton;
-// Menu's origin relative to the |displayView|'s coordinate system, calculated
-// from |toolsMenuButton| and |displayView|.
-@property(nonatomic, readonly) CGRect sourceRect;
-// Image insets that should be applied to the tools button if it is displayed,
-// calculated from |toolsMenuButton|.
-@property(nonatomic, readonly) UIEdgeInsets toolsButtonInsets;
-// Notifier for changes to the reading list requiring the menu to be updated.
-// Menus needing to be updated should set themselves as this object's delegate.
-@property(nonatomic, weak) ReadingListMenuNotifier* readingListMenuNotifier;
-// Records the time that the tools menu was requested; value is the time
-// interval since the NSDate referenceDate.
-@property(nonatomic, assign) NSTimeInterval requestStartTime;
-// Records events for the use of in-product help. Does not take ownership of
-// tracker. Tracker must not be destroyed during lifetime of
-// ToolsMenuConfiguration. Defaults to |nullptr|.
-@property(nonatomic, assign) feature_engagement::Tracker* engagementTracker;
-
-// Initialize a ToolsMenuContext instance with default values. |displayView| is
-// the weakly-held parent view within which the popup tools menu using this
-// context will be displayed. |baseViewController| is a weakly-held view
-// controller from which to present other view controllers.
-- (instancetype)initWithDisplayView:(UIView*)displayView
-                 baseViewController:(UIViewController*)baseViewController
-    NS_DESIGNATED_INITIALIZER;
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_CONFIGURATION_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
deleted file mode 100644
index bb35e75..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_configuration.mm
+++ /dev/null
@@ -1,55 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-
-#import "base/logging.h"
-#include "ios/web/public/user_agent.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@implementation ToolsMenuConfiguration
-
-@synthesize inTabSwitcher = _inTabSwitcher;
-@synthesize noOpenedTabs = _noOpenedTabs;
-@synthesize inIncognito = _inIncognito;
-@synthesize showReadingListNewBadge = _showReadingListNewBadge;
-@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell;
-@synthesize userAgentType = _userAgentType;
-@synthesize requestStartTime = _requestStartTime;
-@synthesize engagementTracker = _engagementTracker;
-@synthesize baseViewController = _baseViewController;
-@synthesize displayView = _displayView;
-@synthesize toolsMenuButton = _toolsMenuButton;
-@synthesize readingListMenuNotifier = _readingListMenuNotifier;
-
-- (instancetype)initWithDisplayView:(UIView*)displayView
-                 baseViewController:(UIViewController*)baseViewController {
-  if (self = [super init]) {
-    _userAgentType = web::UserAgentType::NONE;
-    _baseViewController = baseViewController;
-    _displayView = displayView;
-    _readingListMenuNotifier = nil;
-    _engagementTracker = nullptr;
-  }
-  return self;
-}
-
-- (UIEdgeInsets)toolsButtonInsets {
-  return self.toolsMenuButton ? [self.toolsMenuButton imageEdgeInsets]
-                              : UIEdgeInsetsZero;
-}
-
-- (CGRect)sourceRect {
-  // Set the origin for the tools popup to the horizontal center of the tools
-  // menu button.
-  return self.toolsMenuButton
-             ? [self.displayView convertRect:self.toolsMenuButton.bounds
-                                    fromView:self.toolsMenuButton]
-             : CGRectZero;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.h b/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.h
deleted file mode 100644
index f852576e..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_COORDINATOR_H_
-
-#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
-#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_controller.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_state_provider.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-
-@protocol ToolsMenuConfigurationProvider
-, ToolsMenuPresentationProvider;
-
-// ToolsMenuCoordinator is a ChromeCoordinator that encapsulates logic for
-// showing tools menu UI. In the typical case that may be a tools menu popup.
-// TODO(crbug.com/800266): Remove this coordinator once Phase 1 is enabled.
-@interface ToolsMenuCoordinator
-    : ChromeCoordinator<ToolsMenuPresentationStateProvider>
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-    NS_UNAVAILABLE;
-- (instancetype)initWithBaseViewController:(UIViewController*)viewController
-                              browserState:
-                                  (ios::ChromeBrowserState*)browserState
-    NS_UNAVAILABLE;
-
-// The dispatcher for this Coordinator. This Coordinator will register itself
-// as the handler for tools menu commands (see the ToolsPopupCommands
-// protocol) and will present and dismiss a tools popup in reaction to them.
-@property(nonatomic, strong) CommandDispatcher* dispatcher;
-
-// A provider that prepares a configuration describing the contents of
-// the tools popup menu list, as well as the state of other controls in the
-// menu such as the Reload/Cancel Loading button.
-@property(nonatomic, weak) id<ToolsMenuConfigurationProvider>
-    configurationProvider;
-
-// A provider that may provide more information about the manner in which
-// the coordinator may be presented.
-@property(nonatomic, weak) id<ToolsMenuPresentationProvider>
-    presentationProvider;
-
-// Re-fetches configuration details from the
-// ToolsMenuCoordinatorConfigurationProvider where it is possible for them
-// to be changed after initialization (e.g. highlighting the Bookmark
-// button in the popup if the current visible page is bookmarked).
-- (void)updateConfiguration;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.mm
deleted file mode 100644
index 1fbd20e7..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.mm
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_coordinator.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/metrics/user_metrics.h"
-#include "base/metrics/user_metrics_action.h"
-#import "ios/chrome/browser/ui/commands/tools_menu_commands.h"
-#import "ios/chrome/browser/ui/fullscreen/chrome_coordinator+fullscreen_disabling.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_configuration_provider.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_presentation_provider.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@interface ToolsMenuCoordinator ()<ToolsMenuCommands, PopupMenuDelegate> {
-  // The following is nil if not visible.
-  ToolsPopupController* _toolsPopupController;
-}
-@end
-
-@implementation ToolsMenuCoordinator
-@synthesize dispatcher = _dispatcher;
-@synthesize configurationProvider = _configurationProvider;
-@synthesize presentationProvider = _presentationProvider;
-
-- (instancetype)init {
-  return [super initWithBaseViewController:nil browserState:nil];
-}
-
-#pragma mark - ChromeCoordinator
-
-- (void)start {
-  NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
-  [defaultCenter addObserver:self
-                    selector:@selector(applicationDidEnterBackground:)
-                        name:UIApplicationDidEnterBackgroundNotification
-                      object:nil];
-  [self.dispatcher startDispatchingToTarget:self
-                                forProtocol:@protocol(ToolsMenuCommands)];
-}
-
-- (void)stop {
-  [self.dispatcher stopDispatchingToTarget:self];
-  [self dismissToolsMenu];
-}
-
-#pragma mark - Public
-
-- (void)updateConfiguration {
-  // The ToolsMenuConfiguration provided to the ToolsPopupController is not
-  // reloadable, but the ToolsPopupController has properties that can be
-  // configured dynamically.
-  if ([self.configurationProvider
-          respondsToSelector:@selector
-          (shouldHighlightBookmarkButtonForToolsMenuCoordinator:)])
-    [_toolsPopupController
-        setIsCurrentPageBookmarked:
-            [self.configurationProvider
-                shouldHighlightBookmarkButtonForToolsMenuCoordinator:self]];
-  if ([self.configurationProvider respondsToSelector:@selector
-                                  (shouldShowFindBarForToolsMenuCoordinator:)])
-    [_toolsPopupController
-        setCanShowFindBar:[self.configurationProvider
-                              shouldShowFindBarForToolsMenuCoordinator:self]];
-  if ([self.configurationProvider
-          respondsToSelector:@selector
-          (shouldShowShareMenuForToolsMenuCoordinator:)])
-    [_toolsPopupController
-        setCanShowShareMenu:
-            [self.configurationProvider
-                shouldShowShareMenuForToolsMenuCoordinator:self]];
-  if ([self.configurationProvider
-          respondsToSelector:@selector(isTabLoadingForToolsMenuCoordinator:)])
-    [_toolsPopupController
-        setIsTabLoading:[self.configurationProvider
-                            isTabLoadingForToolsMenuCoordinator:self]];
-}
-
-#pragma mark - ToolsMenuPresentationStateProvider
-
-- (BOOL)isShowingToolsMenu {
-  return !!_toolsPopupController;
-}
-
-#pragma mark - ToolsMenuCommands
-
-- (void)showToolsMenu {
-  ToolsMenuConfiguration* configuration = [self.configurationProvider
-      menuConfigurationForToolsMenuCoordinator:self];
-
-  configuration.toolsMenuButton =
-      [self.presentationProvider presentingButtonForToolsMenuCoordinator:self];
-
-  [self showToolsMenuPopupWithConfiguration:configuration];
-}
-
-- (void)dismissToolsMenu {
-  if (![self isShowingToolsMenu])
-    return;
-
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:kToolsMenuWillHideNotification
-                    object:nil];
-  if (self.browserState)
-    [self didStopFullscreenDisablingUI];
-
-  ToolsPopupController* tempTPC = _toolsPopupController;
-  [_toolsPopupController containerView].userInteractionEnabled = NO;
-  [_toolsPopupController dismissAnimatedWithCompletion:^{
-    [[NSNotificationCenter defaultCenter]
-        postNotificationName:kToolsMenuDidHideNotification
-                      object:nil];
-
-    // Keep the popup controller alive until the animation ends.
-    [tempTPC self];
-  }];
-
-  _toolsPopupController = nil;
-}
-
-#pragma mark - Notification callback
-
-- (void)applicationDidEnterBackground:(NSNotification*)note {
-  [self dismissToolsMenu];
-}
-
-#pragma mark - PopupMenuDelegate
-
-- (void)dismissPopupMenu:(PopupMenuController*)controller {
-  if ([controller isKindOfClass:[ToolsPopupController class]] &&
-      (ToolsPopupController*)controller == _toolsPopupController)
-    [self dismissToolsMenu];
-}
-
-#pragma mark - Private
-
-- (void)showToolsMenuPopupWithConfiguration:
-    (ToolsMenuConfiguration*)configuration {
-  // Because an animation hides and shows the tools popup menu it is possible to
-  // tap the tools button multiple times before the tools menu is shown. Ignore
-  // repeated taps between animations.
-  if ([self isShowingToolsMenu])
-    return;
-
-  base::RecordAction(base::UserMetricsAction("ShowAppMenu"));
-
-  [[NSNotificationCenter defaultCenter]
-      postNotificationName:kToolsMenuWillShowNotification
-                    object:nil];
-  if (self.browserState)
-    [self didStartFullscreenDisablingUI];
-  if ([self.configurationProvider
-          respondsToSelector:@selector
-          (prepareForToolsMenuPresentationByCoordinator:)]) {
-    [self.configurationProvider
-        prepareForToolsMenuPresentationByCoordinator:self];
-  }
-
-  _toolsPopupController = [[ToolsPopupController alloc]
-      initAndPresentWithConfiguration:configuration
-                           dispatcher:(id<ApplicationCommands, BrowserCommands>)
-                                          self.dispatcher
-                           completion:^{
-                             [[NSNotificationCenter defaultCenter]
-                                 postNotificationName:
-                                     kToolsMenuDidShowNotification
-                                               object:nil];
-                           }];
-
-  // Set this coordinator as the popup menu delegate; this is used to
-  // dismiss the popup in response to popup menu requests for dismissal.
-  [_toolsPopupController setDelegate:self];
-
-  [self updateConfiguration];
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_model.h b/ios/chrome/browser/ui/tools_menu/tools_menu_model.h
deleted file mode 100644
index 5f1e4fc..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_model.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_MODEL_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_MODEL_H_
-
-#import <Foundation/Foundation.h>
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-
-// Total number of possible menu items.
-const int kToolsMenuNumberOfItems = 15;
-
-// Initialization table for all possible commands to initialize the
-// tools menu at run time. Data initialized into this structure is not mutable.
-struct MenuItemInfo {
-  int title_id;
-  NSString* accessibility_id;
-  int command_id;
-  SEL selector;
-  int toolbar_types;
-  // |visibility| is applied if a menu item is included for a given
-  // |toolbar_types|. A value of 0 means the menu item is always visible for
-  // the given |toolbar_types|.
-  int visibility;
-  // Custom class, if any, for the menu item, or |nil|.
-  Class item_class;
-};
-
-// Flags for different toolbar types
-typedef NS_OPTIONS(NSUInteger, ToolbarType) {
-  // clang-format off
-  ToolbarTypeNone            = 0,
-  ToolbarTypeWebiPhone       = 1 << 0,
-  ToolbarTypeWebiPad         = 1 << 1,
-  ToolbarTypeNoTabsiPad      = 1 << 2,
-  ToolbarTypeSwitcheriPhone  = 1 << 3,
-  ToolbarTypeWebAll          = ToolbarTypeWebiPhone | ToolbarTypeWebiPad,
-  ToolbarTypeAll             = ToolbarTypeWebAll |
-                               ToolbarTypeSwitcheriPhone |
-                               ToolbarTypeNoTabsiPad,
-  // clang-format on
-};
-
-// All possible items.
-extern const MenuItemInfo itemInfoList[kToolsMenuNumberOfItems];
-
-// Returns true if a given item should be visible based on the Toolbar type
-// and configuration.
-bool ToolsMenuItemShouldBeVisible(const MenuItemInfo& item,
-                                  ToolbarType toolbarType,
-                                  ToolsMenuConfiguration* configuration);
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_MODEL_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
deleted file mode 100644
index a06aba02d..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_model.mm
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ios/chrome/browser/ui/tools_menu/tools_menu_model.h"
-
-#include "components/strings/grit/components_strings.h"
-#include "ios/chrome/browser/experimental_flags.h"
-#include "ios/chrome/browser/ui/commands/application_commands.h"
-#include "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/new_tab_menu_view_item.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h"
-#include "ios/chrome/browser/ui/ui_util.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
-#import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h"
-#include "ios/web/public/user_agent.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-// Menu items can be marked as visible or not when Incognito is enabled.
-// The following bits are used for |visibility| field in |MenuItemInfo|.
-const NSInteger kVisibleIncognitoOnly = 1 << 0;
-const NSInteger kVisibleNotIncognitoOnly = 1 << 1;
-
-// Declare all the possible items. If adding or removing items update
-// kToolsMenuNumberOfItems with the new total count.
-
-const MenuItemInfo itemInfoList[kToolsMenuNumberOfItems] = {
-    // clang-format off
-  { IDS_IOS_TOOLS_MENU_NEW_TAB,           kToolsMenuNewTabId,
-    TOOLS_NEW_TAB_ITEM, nullptr,          ToolbarTypeAll,
-    0,                                    [NewTabMenuViewItem class] },
-  { IDS_IOS_TOOLS_MENU_NEW_INCOGNITO_TAB, kToolsMenuNewIncognitoTabId,
-    TOOLS_NEW_INCOGNITO_TAB_ITEM, nullptr,ToolbarTypeAll,
-    0,                                    [NewIncognitoTabMenuViewItem class] },
-  { IDS_IOS_TOOLS_MENU_CLOSE_ALL_TABS,    kToolsMenuCloseAllTabsId,
-    TOOLS_CLOSE_ALL_TABS,
-    @selector(closeAllTabs), ToolbarTypeSwitcheriPhone,
-    kVisibleNotIncognitoOnly,             nil },
-  { IDS_IOS_TOOLS_MENU_CLOSE_ALL_INCOGNITO_TABS,
-    kToolsMenuCloseAllIncognitoTabsId,
-    TOOLS_CLOSE_ALL_INCOGNITO_TABS,
-    @selector(closeAllIncognitoTabs), ToolbarTypeSwitcheriPhone,
-    kVisibleIncognitoOnly,                nil },
-  { IDS_IOS_TOOLS_MENU_BOOKMARKS,         kToolsMenuBookmarksId,
-    TOOLS_SHOW_BOOKMARKS,
-    @selector(showBookmarksManager),      ToolbarTypeWebAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_READING_LIST,      kToolsMenuReadingListId,
-    TOOLS_READING_LIST,
-    @selector(showReadingList),           ToolbarTypeWebAll,
-    0,                                    [ReadingListMenuViewItem class] },
-  { IDS_IOS_TOOLS_MENU_RECENT_TABS,       kToolsMenuOtherDevicesId,
-    TOOLS_SHOW_RECENT_TABS,
-    @selector(showRecentTabs),            ToolbarTypeWebAll,
-    kVisibleNotIncognitoOnly,             nil },
-  { IDS_HISTORY_SHOW_HISTORY,             kToolsMenuHistoryId,
-    TOOLS_SHOW_HISTORY,
-    @selector(showHistory),               ToolbarTypeWebAll,
-    0,                                    nil },
-  { IDS_IOS_OPTIONS_REPORT_AN_ISSUE,      kToolsMenuReportAnIssueId,
-    TOOLS_REPORT_AN_ISSUE,
-    nullptr,                              ToolbarTypeAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_FIND_IN_PAGE,      kToolsMenuFindInPageId,
-    TOOLS_SHOW_FIND_IN_PAGE,
-    @selector(showFindInPage),            ToolbarTypeWebAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_REQUEST_DESKTOP_SITE,
-    kToolsMenuRequestDesktopId,
-    TOOLS_REQUEST_DESKTOP_SITE,
-    @selector(requestDesktopSite),    ToolbarTypeWebAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_REQUEST_MOBILE_SITE,
-    kToolsMenuRequestMobileId,
-    TOOLS_REQUEST_MOBILE_SITE,
-    @selector(requestMobileSite),     ToolbarTypeWebAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_SETTINGS,          kToolsMenuSettingsId,
-    TOOLS_SETTINGS_ITEM,
-    nullptr,                              ToolbarTypeAll,
-    0,                                    nil },
-  { IDS_IOS_TOOLS_MENU_HELP_MOBILE,       kToolsMenuHelpId,
-    TOOLS_SHOW_HELP_PAGE,
-    @selector(showHelpPage),              ToolbarTypeWebAll,
-    0,                                    nil },
-    // clang-format on
-};
-
-bool ToolsMenuItemShouldBeVisible(const MenuItemInfo& item,
-                                  ToolbarType toolbarType,
-                                  ToolsMenuConfiguration* configuration) {
-  if (!(item.toolbar_types & toolbarType))
-    return false;
-
-  if (configuration.inIncognito && (item.visibility & kVisibleNotIncognitoOnly))
-    return false;
-
-  if (!configuration.inIncognito && (item.visibility & kVisibleIncognitoOnly))
-    return false;
-
-  switch (item.title_id) {
-    case IDS_IOS_TOOLBAR_SHOW_TABS:
-      return IsIPadIdiom();
-    case IDS_IOS_OPTIONS_REPORT_AN_ISSUE:
-      return ios::GetChromeBrowserProvider()
-          ->GetUserFeedbackProvider()
-          ->IsUserFeedbackEnabled();
-    case IDS_IOS_TOOLS_MENU_REQUEST_DESKTOP_SITE:
-      return (configuration.userAgentType != web::UserAgentType::DESKTOP);
-    case IDS_IOS_TOOLS_MENU_REQUEST_MOBILE_SITE:
-      return (configuration.userAgentType == web::UserAgentType::DESKTOP);
-    default:
-      return true;
-  }
-}
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
deleted file mode 100644
index 1ceefd6..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h
+++ /dev/null
@@ -1,103 +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 IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_CONTROLLER_H_
-
-#import <UIKit/UIKit.h>
-
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
-@class ToolsMenuConfiguration;
-
-// TODO(crbug.com/228521): Remove this once the new command/metric handling is
-// implemented. This is a temporary workaround to allow metrics recording to
-// distinguish the action. The value used is in the dynamic range (<
-// IDC_MinimumLabelValue) to avoid collisions.
-#define IDC_TEMP_EDIT_BOOKMARK 3900
-
-// The a11y ID of the tools menu items (used by integration tests).
-extern NSString* const kToolsMenuNewTabId;
-extern NSString* const kToolsMenuNewIncognitoTabId;
-extern NSString* const kToolsMenuCloseAllTabsId;
-extern NSString* const kToolsMenuCloseAllIncognitoTabsId;
-extern NSString* const kToolsMenuBookmarksId;
-extern NSString* const kToolsMenuOtherDevicesId;
-extern NSString* const kToolsMenuHistoryId;
-extern NSString* const kToolsMenuReportAnIssueId;
-extern NSString* const kToolsMenuShareId;
-extern NSString* const kToolsMenuDataSavingsId;
-extern NSString* const kToolsMenuFindInPageId;
-extern NSString* const kToolsMenuRequestDesktopId;
-extern NSString* const kToolsMenuSettingsId;
-extern NSString* const kToolsMenuHelpId;
-extern NSString* const kToolsMenuReadingListId;
-extern NSString* const kToolsMenuRequestMobileId;
-
-// Tools Popup Table Delegate Protocol
-@protocol ToolsPopupTableDelegate<NSObject>
-// Called when a menu item for command |commandID| is selected.
-// TODO(stuartmorgan): This is a temporary shim. Remove it once:
-// - the automatic command-based metrics system is in place, and
-// - we figure out a better way to dismiss the menu (maybe a provided block?)
-- (void)commandWasSelected:(int)commandID;
-@end
-
-// A table view with two icons in the first row and regular text cells in
-// subsequent rows.
-// For each icon and item in the menu there is a corresponding delegate method.
-@interface ToolsMenuViewController : UIViewController
-// Keeps track of the state (Bookmarked or not) of the current visible page.
-// This is used to alter the state of the popup menu (i.e. Add/Edit bookmark).
-@property(nonatomic, assign) BOOL isCurrentPageBookmarked;
-@property(nonatomic, assign) BOOL isTabLoading;
-// The tool button to be shown hovering above the popup.
-@property(nonatomic, readonly, weak) UIButton* toolsButton;
-
-// Keeps track of the items in tools menu.
-@property(nonatomic, copy) NSArray* menuItems;
-
-@property(nonatomic, weak) id<ToolsPopupTableDelegate> delegate;
-
-// Dispatcher for browser commands.
-@property(nonatomic, weak) id<ApplicationCommands, BrowserCommands> dispatcher;
-
-// Initializes the Tools popup menu.
-- (void)initializeMenuWithConfiguration:(ToolsMenuConfiguration*)configuration;
-
-// Returns the optimal height needed to display the menu items.
-// The height returned is usually less than the |suggestedHeight| unless
-// the last row of the menu puts the height just over the |suggestedHeight|.
-// If the Tools menu items is taller than the |suggestedHeight| by at least
-// one menu item, the last visible menu item will be shown partially so user
-// can tell that the Tools menu is scrollable.
-- (CGFloat)optimalHeight:(CGFloat)suggestedHeight;
-
-// Enable or disable menu item by IDC value.
-- (void)setItemEnabled:(BOOL)enabled withTag:(NSInteger)tag;
-
-// Called when the current tab loading state changes.
-- (void)setIsTabLoading:(BOOL)isTabLoading;
-
-// TODO(stuartmorgan): Should the set of options that are passed in to the
-// constructor just have the ability to specify whether commands should be
-// enabled or disabled rather than having these individual setters? crbug/228506
-// Informs tools popup menu whether "Find In Page..." command should be
-// enabled.
-- (void)setCanShowFindBar:(BOOL)enabled;
-
-// Informs tools popup menu whether "Share..." command should be enabled.
-- (void)setCanShowShareMenu:(BOOL)enabled;
-
-- (void)animateContentIn;
-
-- (void)hideContent;
-
-// Highlight the New Incognito Tab cell in blue. The highlight fades in, pulses
-// once, and fades out.
-- (void)triggerNewIncognitoTabCellHighlight;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
deleted file mode 100644
index ece2516..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.mm
+++ /dev/null
@@ -1,719 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h"
-
-#import <QuartzCore/QuartzCore.h>
-#include <stdint.h>
-
-#include "base/logging.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/histogram_macros.h"
-#include "components/feature_engagement/public/feature_constants.h"
-#include "components/feature_engagement/public/tracker.h"
-#include "components/strings/grit/components_strings.h"
-#include "ios/chrome/browser/experimental_flags.h"
-#import "ios/chrome/browser/ui/animation_util.h"
-#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
-#import "ios/chrome/browser/ui/reading_list/reading_list_menu_notification_delegate.h"
-#import "ios/chrome/browser/ui/reading_list/reading_list_menu_notifier.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/reading_list_menu_view_item.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_model.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h"
-#include "ios/chrome/browser/ui/ui_util.h"
-#import "ios/chrome/browser/ui/uikit_ui_util.h"
-#import "ios/chrome/common/material_timing.h"
-#import "ios/chrome/common/ui_util/constraints_ui_util.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
-#import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h"
-#import "ios/third_party/material_components_ios/src/components/Ink/src/MaterialInk.h"
-#include "ios/web/public/user_agent.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/l10n/l10n_util_mac.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using ios::material::TimingFunction;
-
-namespace {
-
-// Time for ink to fade into view.
-static const NSTimeInterval kMDCInkTouchDelayInterval = 0.15;
-
-static const CGFloat kMenuItemHeight = 48;
-
-static NSString* const kToolsItemCellID = @"ToolsItemCellID";
-
-
-NS_INLINE void AnimateInViews(NSArray* views,
-                              CGFloat initialX,
-                              CGFloat initialY) {
-  [views enumerateObjectsUsingBlock:^(UIView* view, NSUInteger index,
-                                      BOOL* stop) {
-    CGFloat beginTime = index * .035;
-    CABasicAnimation* transformAnimation =
-        [CABasicAnimation animationWithKeyPath:@"transform"];
-    [transformAnimation
-        setFromValue:[NSValue
-                         valueWithCATransform3D:CATransform3DMakeTranslation(
-                                                    initialX, initialY, 0)]];
-    [transformAnimation
-        setToValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]];
-    [transformAnimation setDuration:ios::material::kDuration1];
-    [transformAnimation setBeginTime:beginTime];
-
-    CAAnimation* fadeAnimation = OpacityAnimationMake(0, 1);
-    [fadeAnimation setDuration:ios::material::kDuration1];
-    [fadeAnimation
-        setTimingFunction:TimingFunction(ios::material::CurveEaseOut)];
-    [fadeAnimation setBeginTime:beginTime];
-
-    [[view layer]
-        addAnimation:AnimationGroupMake(@[ transformAnimation, fadeAnimation ])
-              forKey:@"animateIn"];
-  }];
-}
-}  // anonymous namespace
-
-@interface ToolsMenuCollectionView : UICollectionView
-@property(nonatomic, assign) CGPoint touchBeginPoint;
-@property(nonatomic, assign) CGPoint touchEndPoint;
-@end
-
-@implementation ToolsMenuCollectionView
-
-@synthesize touchBeginPoint = _touchBeginPoint;
-@synthesize touchEndPoint = _touchEndPoint;
-
-- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
-  _touchBeginPoint = [[touches anyObject] locationInView:self];
-  [super touchesBegan:touches withEvent:event];
-}
-
-- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
-  _touchEndPoint = [[touches anyObject] locationInView:self];
-  [super touchesEnded:touches withEvent:event];
-}
-
-@end
-
-// Class Extension for private methods.
-@interface ToolsMenuViewController ()<UICollectionViewDelegateFlowLayout,
-                                      UICollectionViewDataSource,
-                                      ReadingListMenuNotificationDelegate> {
-  BOOL _waitForInk;
-  // Weak pointer to ReadingListMenuNotifier, used to set the starting values
-  // for the reading list badge.
-  __weak ReadingListMenuNotifier* _readingListMenuNotifier;
-  // YES if NSLayoutConstraits were added.
-  BOOL _addedConstraints;
-}
-
-// Determines if the reading list should display a new feature badge. Defaults
-// to |NO|.
-@property(nonatomic, assign) BOOL showReadingListNewBadge;
-// Indicates whether the New Incognito Tab cell should be highlighted. Defaults
-// to |NO|.
-@property(nonatomic, assign) BOOL highlightNewIncognitoTabCell;
-// Tracks events for the purpose of in-product help. Does not take ownership of
-// tracker. Tracker must not be destroyed during lifetime of
-// ToolsMenuViewController. Defaults to |NULL|.
-@property(nonatomic, assign) feature_engagement::Tracker* engagementTracker;
-@property(nonatomic, strong) ToolsMenuCollectionView* menuView;
-@property(nonatomic, strong) MDCInkView* touchFeedbackView;
-@property(nonatomic, assign) ToolbarType toolbarType;
-// Populated by the configuration object in |initializeMenuWithConfiguration:|
-// stores the time this view controller was requested by the user for the
-// reporting of metrics.
-@property(nonatomic, assign) NSTimeInterval requestStartTime;
-
-// Returns the reading list cell.
-- (ReadingListMenuViewCell*)readingListCell;
-@end
-
-@implementation ToolsMenuViewController
-
-@synthesize showReadingListNewBadge = _showReadingListNewBadge;
-@synthesize highlightNewIncognitoTabCell = _highlightNewIncognitoTabCell;
-@synthesize engagementTracker = _engagementTracker;
-@synthesize menuView = _menuView;
-@synthesize isCurrentPageBookmarked = _isCurrentPageBookmarked;
-@synthesize touchFeedbackView = _touchFeedbackView;
-@synthesize isTabLoading = _isTabLoading;
-@synthesize toolbarType = _toolbarType;
-@synthesize menuItems = _menuItems;
-@synthesize delegate = _delegate;
-@synthesize dispatcher = _dispatcher;
-@synthesize requestStartTime = _requestStartTime;
-
-#pragma mark Public methods
-
-- (CGFloat)optimalHeight:(CGFloat)suggestedHeight {
-  NSInteger numberOfItems = [self.menuItems count];
-  if (_toolbarType == ToolbarTypeWebiPhone) {
-    // Account for the height of the first row, not included in |menuItems|.
-    numberOfItems++;
-  }
-  CGFloat maxItems = suggestedHeight / kMenuItemHeight;
-  if (maxItems >= numberOfItems) {
-    return numberOfItems * kMenuItemHeight;
-  } else {
-    const CGFloat halfHeight = kMenuItemHeight / 2;
-    return round(maxItems) * kMenuItemHeight - halfHeight;
-  }
-}
-
-- (void)setItemEnabled:(BOOL)enabled withTag:(NSInteger)tag {
-  for (ToolsMenuViewItem* item in _menuItems) {
-    if ([item tag] == tag) {
-      [item setActive:enabled];
-      break;
-    }
-  }
-
-  for (ToolsMenuViewCell* cell in [_menuView visibleCells]) {
-    if (![cell isKindOfClass:[ToolsMenuViewCell class]])
-      continue;
-
-    if ([cell tag] != tag)
-      continue;
-
-    NSIndexPath* path = [_menuView indexPathForCell:cell];
-    NSInteger itemIndex = [self dataIndexForIndexPath:path];
-    [cell configureForMenuItem:[_menuItems objectAtIndex:itemIndex]];
-  }
-}
-
-- (void)setIsCurrentPageBookmarked:(BOOL)value {
-  _isCurrentPageBookmarked = value;
-
-  ToolsMenuViewToolsCell* toolsCell = [self toolsCell];
-  [[toolsCell starButton] setHidden:_isCurrentPageBookmarked];
-  [[toolsCell starredButton] setHidden:!_isCurrentPageBookmarked];
-}
-
-- (void)setCanShowFindBar:(BOOL)enabled {
-  [self setItemEnabled:enabled withTag:TOOLS_SHOW_FIND_IN_PAGE];
-}
-
-- (void)setCanShowShareMenu:(BOOL)enabled {
-  ToolsMenuViewToolsCell* toolsCell = [self toolsCell];
-  [[toolsCell shareButton] setEnabled:enabled];
-}
-
-- (UIButton*)toolsButton {
-  UIButton* toolsButton = [[self toolsCell] toolsButton];
-  [toolsButton addTarget:self
-                  action:@selector(buttonPressed:)
-        forControlEvents:UIControlEventTouchUpInside];
-  [toolsButton setTranslatesAutoresizingMaskIntoConstraints:YES];
-  [toolsButton setOpaque:NO];
-  [toolsButton setBackgroundColor:[UIColor clearColor]];
-  return toolsButton;
-}
-
-- (void)setIsTabLoading:(BOOL)isTabLoading {
-  _isTabLoading = isTabLoading;
-
-  ToolsMenuViewToolsCell* toolsCell = [self toolsCell];
-  [[toolsCell stopButton] setHidden:!isTabLoading];
-  [[toolsCell reloadButton] setHidden:isTabLoading];
-}
-
-- (void)initializeMenuWithConfiguration:(ToolsMenuConfiguration*)configuration {
-  self.requestStartTime = configuration.requestStartTime;
-  self.showReadingListNewBadge = configuration.showReadingListNewBadge;
-  self.engagementTracker = configuration.engagementTracker;
-  self.highlightNewIncognitoTabCell =
-      configuration.highlightNewIncognitoTabCell;
-
-  if (configuration.readingListMenuNotifier) {
-    _readingListMenuNotifier = configuration.readingListMenuNotifier;
-    [configuration.readingListMenuNotifier setDelegate:self];
-  }
-
-  if (IsIPadIdiom()) {
-    _toolbarType =
-        configuration.hasNoOpenedTabs
-            ? ToolbarTypeNoTabsiPad
-            : (!IsCompactTablet() ? ToolbarTypeWebiPad : ToolbarTypeWebiPhone);
-  } else {
-    // kOptionInTabSwitcher option must be enabled on iPhone with
-    // no opened tabs.
-    DCHECK(!configuration.hasNoOpenedTabs || configuration.isInTabSwitcher);
-    _toolbarType = configuration.isInTabSwitcher ? ToolbarTypeSwitcheriPhone
-                                                 : ToolbarTypeWebiPhone;
-  }
-
-  // Build the menu, adding all relevant items.
-  NSMutableArray* menu = [NSMutableArray array];
-
-  for (size_t i = 0; i < arraysize(itemInfoList); ++i) {
-    const MenuItemInfo& item = itemInfoList[i];
-    if (!ToolsMenuItemShouldBeVisible(item, _toolbarType, configuration))
-      continue;
-
-    NSString* title = l10n_util::GetNSStringWithFixup(item.title_id);
-    Class itemClass =
-        item.item_class ? item.item_class : [ToolsMenuViewItem class];
-    // Sanity check that the class is a useful one.
-    DCHECK([itemClass
-        respondsToSelector:@selector
-        (menuItemWithTitle:accessibilityIdentifier:selector:command:)]);
-    [menu addObject:[itemClass menuItemWithTitle:title
-                         accessibilityIdentifier:item.accessibility_id
-                                        selector:item.selector
-                                         command:item.command_id]];
-  }
-
-#if !defined(NDEBUG)
-  NSUserDefaults* standardDefaults = [NSUserDefaults standardUserDefaults];
-  if ((_toolbarType & ToolbarTypeWebAll) &&
-      [standardDefaults boolForKey:@"DevViewSource"]) {
-    // Debug menu, not localized, only visible if turned on by a default.
-    [menu addObject:[self createViewSourceItem]];
-  }
-#endif  // !defined(NDEBUG)
-
-  [self setMenuItems:menu];
-
-  // Decide the enabled state of the currently visible item between
-  // "Request Desktop Site" and "Request Mobile Site".
-  switch (configuration.userAgentType) {
-    case web::UserAgentType::NONE:
-      [self setItemEnabled:NO withTag:TOOLS_REQUEST_DESKTOP_SITE];
-      break;
-    case web::UserAgentType::MOBILE:
-      [self setItemEnabled:YES withTag:TOOLS_REQUEST_DESKTOP_SITE];
-      break;
-    case web::UserAgentType::DESKTOP:
-      [self setItemEnabled:YES withTag:TOOLS_REQUEST_MOBILE_SITE];
-      break;
-  }
-
-  // Disable TOOLS_CLOSE_ALL_TABS menu item if on phone with no tabs.
-  if (!IsIPadIdiom()) {
-    [self setItemEnabled:!configuration.hasNoOpenedTabs
-                 withTag:TOOLS_CLOSE_ALL_TABS];
-  }
-}
-
-#if !defined(NDEBUG)
-- (ToolsMenuViewItem*)createViewSourceItem {
-  return [ToolsMenuViewItem menuItemWithTitle:@"View Source"
-                      accessibilityIdentifier:@"View Source"
-                                     selector:@selector(viewSource)
-                                      command:TOOLS_VIEW_SOURCE];
-}
-#endif  // !defined(NDEBUG)
-
-#pragma mark - Data handling utilities
-
-- (ToolsMenuViewToolsCell*)toolsCell {
-  for (ToolsMenuViewToolsCell* visibleCell in [_menuView visibleCells]) {
-    if ([visibleCell isKindOfClass:[ToolsMenuViewToolsCell class]])
-      return visibleCell;
-  }
-
-  return nil;
-}
-
-- (ReadingListMenuViewCell*)readingListCell {
-  for (ReadingListMenuViewCell* visibleCell in [_menuView visibleCells]) {
-    if ([visibleCell isKindOfClass:[ReadingListMenuViewCell class]])
-      return visibleCell;
-  }
-
-  return nil;
-}
-
-- (NSInteger)dataIndexForIndexPath:(NSIndexPath*)path {
-  NSInteger item = [path item];
-
-  if (_toolbarType == ToolbarTypeWebiPhone)
-    --item;
-
-  return item;
-}
-
-#pragma mark - UIViewController Overrides
-
-- (void)loadView {
-  [super loadView];
-
-  UIView* rootView = [self view];
-  [rootView setAutoresizingMask:UIViewAutoresizingFlexibleHeight |
-                                UIViewAutoresizingFlexibleWidth];
-  [rootView setBackgroundColor:[UIColor whiteColor]];
-
-  _touchFeedbackView = [[MDCInkView alloc] initWithFrame:CGRectZero];
-
-  UICollectionViewFlowLayout* menuItemsLayout =
-      [[UICollectionViewFlowLayout alloc] init];
-
-  _menuView = [[ToolsMenuCollectionView alloc] initWithFrame:[rootView bounds]
-                                        collectionViewLayout:menuItemsLayout];
-  [_menuView setAccessibilityLabel:l10n_util::GetNSString(IDS_IOS_TOOLS_MENU)];
-  [_menuView setAccessibilityIdentifier:kPopupMenuToolsMenuTableViewId];
-  [_menuView setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [_menuView setBackgroundColor:[UIColor whiteColor]];
-  [_menuView setDataSource:self];
-  [_menuView setDelegate:self];
-  [_menuView setOpaque:YES];
-
-  [rootView addSubview:_menuView];
-  [self updateViewConstraints];
-}
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  [_menuView registerClass:[ToolsMenuViewToolsCell class]
-      forCellWithReuseIdentifier:kToolsItemCellID];
-
-  [_menuView registerClass:[ToolsMenuViewItem cellClass]
-      forCellWithReuseIdentifier:[ToolsMenuViewItem cellID]];
-
-  // Register each custom class.
-  NSMutableSet* registeredClasses = [NSMutableSet set];
-  for (size_t i = 0; i < arraysize(itemInfoList); ++i) {
-    const MenuItemInfo& item = itemInfoList[i];
-    if (!item.item_class || [registeredClasses containsObject:item.item_class])
-      continue;
-    [_menuView registerClass:[item.item_class cellClass]
-        forCellWithReuseIdentifier:[item.item_class cellID]];
-    [registeredClasses addObject:item.item_class];
-  }
-}
-
-- (void)viewDidDisappear:(BOOL)animated {
-  [super viewDidDisappear:animated];
-  if (self.showReadingListNewBadge && self.engagementTracker) {
-    self.engagementTracker->Dismissed(
-        feature_engagement::kIPHBadgedReadingListFeature);
-  }
-}
-
-- (void)updateViewConstraints {
-  if (!_addedConstraints) {
-    NSDictionary* view = @{@"menu" : _menuView};
-    NSArray* constraints =
-        @[ @"V:|-(0)-[menu]-(0)-|", @"H:|-(0)-[menu]-(0)-|" ];
-    ApplyVisualConstraints(constraints, view);
-    _addedConstraints = YES;
-  }
-  [super updateViewConstraints];
-}
-
-#pragma mark - Content Animation Stuff
-
-- (void)animateContentIn {
-  // Make sure that the collection view has laid out before trying to animate
-  // the contents.
-  [_menuView layoutIfNeeded];
-
-  NSArray* visibleCells =
-      [[_menuView visibleCells] sortedArrayUsingComparator:^NSComparisonResult(
-                                    UIView* view1, UIView* view2) {
-        CGPoint center1 = [view1 center];
-        CGPoint center2 = [view2 center];
-
-        if (center1.y < center2.y)
-          return NSOrderedAscending;
-
-        if (center1.y > center2.y)
-          return NSOrderedDescending;
-
-        return NSOrderedSame;
-      }];
-
-  ToolsMenuViewToolsCell* toolsCell = nil;
-  if (_toolbarType == ToolbarTypeWebiPhone) {
-    toolsCell = [visibleCells firstObject];
-    if ([toolsCell isKindOfClass:[ToolsMenuViewToolsCell class]]) {
-      visibleCells = [visibleCells
-          subarrayWithRange:NSMakeRange(1, [visibleCells count] - 1)];
-    } else {
-      toolsCell = nil;
-    }
-  }
-
-  [CATransaction begin];
-  [CATransaction
-      setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseInOut)];
-  [CATransaction setAnimationDuration:ios::material::kDuration5];
-  [CATransaction setCompletionBlock:^{
-    if (self.requestStartTime != 0) {
-      UMA_HISTOGRAM_TIMES(
-          "Toolbar.ShowToolsMenuResponsiveness",
-          base::TimeDelta::FromSecondsD(
-              [NSDate timeIntervalSinceReferenceDate] - self.requestStartTime));
-      // Reset the start time to ensure that whatever happens, we only record
-      // this once.
-      self.requestStartTime = 0;
-    }
-
-  }];
-  AnimateInViews([toolsCell allButtons], 10, 0);
-  AnimateInViews(visibleCells, 0, -10);
-  [CATransaction commit];
-
-  // The number badge should be prioritized over the new feature badge, so only
-  // show the new feature badge if number badge will not be shown.
-  if (_readingListMenuNotifier.readingListUnreadCount == 0) {
-    [[self readingListCell] updateShowTextBadge:_showReadingListNewBadge
-                                       animated:YES];
-  }
-  [[self readingListCell]
-      updateBadgeCount:_readingListMenuNotifier.readingListUnreadCount
-              animated:YES];
-  [[self readingListCell]
-      updateSeenState:_readingListMenuNotifier.readingListUnseenItemsExist
-             animated:YES];
-  if (self.highlightNewIncognitoTabCell) {
-    [self triggerNewIncognitoTabCellHighlight];
-  }
-}
-
-- (void)hideContent {
-  _menuView.alpha = 0;
-
-  // Remove the target/action for touching the buttons. VoiceOver may hold on
-  // to these buttons after |self| has been released, causing a crash if a
-  // button is activated (see http://crbug.com/480974 ).
-  UIButton* toolsButton = [[self toolsCell] toolsButton];
-  [toolsButton removeTarget:self
-                     action:@selector(buttonPressed:)
-           forControlEvents:UIControlEventTouchUpInside];
-  ToolsMenuViewToolsCell* toolsCell = [self toolsCell];
-  for (UIButton* button in [toolsCell allButtons]) {
-    [button removeTarget:self
-                  action:@selector(buttonPressed:)
-        forControlEvents:UIControlEventTouchUpInside];
-  }
-  [toolsCell.stopButton removeTarget:self.dispatcher
-                              action:@selector(stopLoading)
-                    forControlEvents:UIControlEventTouchUpInside];
-  [toolsCell.reloadButton removeTarget:self.dispatcher
-                                action:@selector(reload)
-                      forControlEvents:UIControlEventTouchUpInside];
-  [toolsCell.shareButton removeTarget:self.dispatcher
-                               action:@selector(sharePage)
-                     forControlEvents:UIControlEventTouchUpInside];
-  [toolsCell.starButton removeTarget:self.dispatcher
-                              action:@selector(bookmarkPage)
-                    forControlEvents:UIControlEventTouchUpInside];
-  [toolsCell.starredButton removeTarget:self.dispatcher
-                                 action:@selector(bookmarkPage)
-                       forControlEvents:UIControlEventTouchUpInside];
-}
-
-#pragma mark - Button event handling
-
-- (void)buttonPressed:(id)sender {
-  int commandID = [sender tag];
-  // All command IDs should have been refactored to be < 0, and not use
-  // ChromeExecuteCommand.
-  DCHECK(commandID < 0);
-  // Do any metrics logging for the command, and then close the menu.
-  [_delegate commandWasSelected:commandID];
-}
-
-#pragma mark - UICollectionViewDelegate Implementation
-
-- (BOOL)collectionView:(ToolsMenuCollectionView*)view
-    shouldHighlightItemAtIndexPath:(NSIndexPath*)path {
-  if (view.tracking)
-    return NO;
-  NSInteger item = [self dataIndexForIndexPath:path];
-  return (item >= 0);
-}
-
-- (void)collectionView:(ToolsMenuCollectionView*)view
-    didHighlightItemAtIndexPath:(NSIndexPath*)path {
-  ToolsMenuViewCell* cell =
-      (ToolsMenuViewCell*)[view cellForItemAtIndexPath:path];
-
-  NSInteger item = [self dataIndexForIndexPath:path];
-  DCHECK_GE(item, 0);
-  ToolsMenuViewItem* menuItem = [_menuItems objectAtIndex:item];
-  DCHECK(menuItem);
-  if ([menuItem active]) {
-    [_touchFeedbackView setFrame:cell.bounds];
-    [cell addSubview:_touchFeedbackView];
-
-    CGPoint touchPoint = [view touchBeginPoint];
-    touchPoint = [view convertPoint:touchPoint toView:_touchFeedbackView];
-    [_touchFeedbackView startTouchBeganAnimationAtPoint:touchPoint
-                                             completion:nil];
-  }
-}
-
-- (void)collectionView:(ToolsMenuCollectionView*)view
-    didUnhighlightItemAtIndexPath:(NSIndexPath*)path {
-  CGPoint touchPoint = [view touchEndPoint];
-  touchPoint = [view convertPoint:touchPoint toView:_touchFeedbackView];
-  __weak MDCInkView* inkView = _touchFeedbackView;
-  _waitForInk = YES;
-  [_touchFeedbackView startTouchEndedAnimationAtPoint:touchPoint
-                                           completion:^{
-                                             _waitForInk = NO;
-                                             [inkView removeFromSuperview];
-                                           }];
-}
-
-- (BOOL)collectionView:(UICollectionView*)view
-    shouldSelectItemAtIndexPath:(NSIndexPath*)path {
-  NSInteger item = [self dataIndexForIndexPath:path];
-  if (item < 0)
-    return NO;
-
-  return [[_menuItems objectAtIndex:item] active];
-}
-
-- (void)collectionView:(UICollectionView*)view
-    didSelectItemAtIndexPath:(NSIndexPath*)path {
-  [view deselectItemAtIndexPath:path animated:YES];
-
-  NSInteger item = [self dataIndexForIndexPath:path];
-  if (item < 0)
-    return;
-
-  dispatch_time_t delayTime = dispatch_time(
-      DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC * kMDCInkTouchDelayInterval));
-  dispatch_after(
-      _waitForInk ? delayTime : 0, dispatch_get_main_queue(), ^(void) {
-        ToolsMenuViewItem* menuItem = [_menuItems objectAtIndex:item];
-        // Tag values > 0, and use of the ChromeExecuteCommand pattern from the
-        // menu, is no longer supported.
-        DCHECK([menuItem tag] < 0);
-        [_delegate commandWasSelected:[menuItem tag]];
-
-        // The menuItem will handle executing the command if it can.
-        // Otherwise, the dispatching should have been handled by the preceding
-        // -commandWasSelected: call on |_delegate|.
-        // This is so that a baseViewController can be sent with the dispatch
-        // command.
-        if ([menuItem canExecuteCommand]) {
-          [menuItem executeCommandWithDispatcher:self.dispatcher];
-        }
-      });
-}
-
-#pragma mark - UICollectionViewDataSource Implementation
-
-- (NSInteger)collectionView:(UICollectionView*)view
-     numberOfItemsInSection:(NSInteger)section {
-  NSInteger numberOfItems = [_menuItems count];
-  if (_toolbarType == ToolbarTypeWebiPhone)
-    ++numberOfItems;
-
-  return numberOfItems;
-}
-
-- (UICollectionViewCell*)collectionView:(UICollectionView*)view
-                 cellForItemAtIndexPath:(NSIndexPath*)path {
-  NSInteger item = [self dataIndexForIndexPath:path];
-  if (item < 0) {
-    ToolsMenuViewToolsCell* cell =
-        [view dequeueReusableCellWithReuseIdentifier:kToolsItemCellID
-                                        forIndexPath:path];
-    // Add specific target/action dispatch for buttons.
-    // These need to be added *before* -buttonPressed:,
-    // because -buttonPressed: closes the popup menu, which will usually
-    // destroy the buttons before any other actions can be called.
-    [cell.stopButton addTarget:self.dispatcher
-                        action:@selector(stopLoading)
-              forControlEvents:UIControlEventTouchUpInside];
-    [cell.reloadButton addTarget:self.dispatcher
-                          action:@selector(reload)
-                forControlEvents:UIControlEventTouchUpInside];
-    [cell.shareButton addTarget:self.dispatcher
-                         action:@selector(sharePage)
-               forControlEvents:UIControlEventTouchUpInside];
-    [cell.starButton addTarget:self.dispatcher
-                        action:@selector(bookmarkPage)
-              forControlEvents:UIControlEventTouchUpInside];
-    [cell.starredButton addTarget:self.dispatcher
-                           action:@selector(bookmarkPage)
-                 forControlEvents:UIControlEventTouchUpInside];
-    for (UIButton* button in [cell allButtons]) {
-      [button addTarget:self
-                    action:@selector(buttonPressed:)
-          forControlEvents:UIControlEventTouchUpInside];
-    }
-
-    return cell;
-  }
-
-  ToolsMenuViewItem* menuItem = [_menuItems objectAtIndex:item];
-  ToolsMenuViewCell* menuItemCell =
-      [view dequeueReusableCellWithReuseIdentifier:[[menuItem class] cellID]
-                                      forIndexPath:path];
-  [menuItemCell configureForMenuItem:menuItem];
-
-  return menuItemCell;
-}
-
-#pragma mark - UICollectionViewDelegateFlowLayout Implementation
-
-- (CGSize)collectionView:(UICollectionView*)view
-                    layout:(UICollectionViewLayout*)collectionViewLayout
-    sizeForItemAtIndexPath:(NSIndexPath*)path {
-  return CGSizeMake(CGRectGetWidth([_menuView bounds]), kMenuItemHeight);
-}
-
-- (CGFloat)collectionView:(UICollectionView*)collectionView
-                                 layout:(UICollectionViewLayout*)
-                                            collectionViewLayout
-    minimumLineSpacingForSectionAtIndex:(NSInteger)section {
-  return 0;
-}
-
-#pragma mark - ReadingListMenuNotificationDelegate Implementation
-
-- (void)unreadCountChanged:(NSInteger)unreadCount {
-  [[self readingListCell] updateBadgeCount:unreadCount animated:YES];
-}
-
-- (void)unseenStateChanged:(BOOL)unseenItemsExist {
-  [[self readingListCell] updateSeenState:unseenItemsExist animated:YES];
-}
-
-#pragma mark - New Incognito Tab in-product help promotion
-
-- (void)triggerNewIncognitoTabCellHighlight {
-  for (ToolsMenuViewCell* visibleCell in [_menuView visibleCells]) {
-    if ([visibleCell.accessibilityIdentifier
-            isEqualToString:kToolsMenuNewIncognitoTabId]) {
-      // Set the label's background color to be clear so that the highlight is
-      // is not covered by the label.
-      visibleCell.title.backgroundColor = [UIColor clearColor];
-
-      CABasicAnimation* highlightAnimation =
-          [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
-      highlightAnimation.duration = ios::material::kDuration5;
-      highlightAnimation.repeatCount = 2;
-      highlightAnimation.autoreverses = YES;
-      highlightAnimation.toValue =
-          static_cast<id>([[MDCPalette cr_bluePalette] tint100].CGColor);
-      highlightAnimation.timingFunction = [CAMediaTimingFunction
-          functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
-      [visibleCell.contentView.layer addAnimation:highlightAnimation
-                                           forKey:nil];
-
-      self.highlightNewIncognitoTabCell = NO;
-      break;
-    }
-  }
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller_unittest.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller_unittest.mm
deleted file mode 100644
index 0c4ab2c..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_controller_unittest.mm
+++ /dev/null
@@ -1,93 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h"
-
-#include "ios/chrome/browser/experimental_flags.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-#include "ios/web/public/user_agent.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-class ToolsMenuViewControllerTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-    configuration_ = [[ToolsMenuConfiguration alloc] initWithDisplayView:nil
-                                                      baseViewController:nil];
-    controller_ = [[ToolsMenuViewController alloc] init];
-  }
-
-  // Returns tools menu view item by IDC value, null if not exit.
-  ToolsMenuViewItem* GetToolsMenuViewItemWithTag(int tag) {
-    for (ToolsMenuViewItem* item in [controller_ menuItems]) {
-      if ([item tag] == tag)
-        return item;
-    }
-
-    return nullptr;
-  }
-
-  ToolsMenuConfiguration* configuration_;
-  ToolsMenuViewController* controller_;
-};
-
-// Tests that "Request Desktop Site" is visible and enabled, and
-// "Request Mobile Site" is invisible when the current page is a native page,
-// whose user agent type is NONE.
-TEST_F(ToolsMenuViewControllerTest, TestUserAgentTypeNONE) {
-  [configuration_ setUserAgentType:web::UserAgentType::NONE];
-  [controller_ initializeMenuWithConfiguration:configuration_];
-
-  ToolsMenuViewItem* desktop_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_DESKTOP_SITE);
-  ASSERT_TRUE(desktop_item);
-  EXPECT_FALSE(desktop_item.active);
-
-  ToolsMenuViewItem* mobile_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_MOBILE_SITE);
-  EXPECT_FALSE(mobile_item);
-}
-
-// Tests that "Request Desktop Site" is visible and not enabled, and
-// "Request Mobile Site" is invisible when the current page is a web page and
-// uses MOBILE user agent.
-TEST_F(ToolsMenuViewControllerTest, TestUserAgentTypeMOBILE) {
-  [configuration_ setUserAgentType:web::UserAgentType::MOBILE];
-  [controller_ initializeMenuWithConfiguration:configuration_];
-
-  ToolsMenuViewItem* desktop_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_DESKTOP_SITE);
-  ASSERT_TRUE(desktop_item);
-  EXPECT_TRUE(desktop_item.active);
-
-  ToolsMenuViewItem* mobile_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_MOBILE_SITE);
-  EXPECT_FALSE(mobile_item);
-}
-
-// Tests that when the current page is a web page and uses DESKTOP user
-// agent, if request mobile site experiment is turned on, "Request Desktop Site"
-// is invisible, and "Request Mobile Site" is visible and enabled; otherwise,
-// "Request Desktop Site" is visible and not enabled, and "Request Mobile Site"
-// is invisible.
-TEST_F(ToolsMenuViewControllerTest, TestUserAgentTypeDESKTOP) {
-  [configuration_ setUserAgentType:web::UserAgentType::DESKTOP];
-  [controller_ initializeMenuWithConfiguration:configuration_];
-
-  ToolsMenuViewItem* desktop_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_DESKTOP_SITE);
-  ToolsMenuViewItem* mobile_item =
-      GetToolsMenuViewItemWithTag(TOOLS_REQUEST_MOBILE_SITE);
-
-  EXPECT_FALSE(desktop_item);
-  ASSERT_TRUE(mobile_item);
-  EXPECT_TRUE(mobile_item.active);
-}
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h b/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h
deleted file mode 100644
index e7346254..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h
+++ /dev/null
@@ -1,50 +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 IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_ITEM_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_ITEM_H_
-
-#import <UIKit/UIKit.h>
-
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
-@class ToolsMenuViewCell;
-
-@interface ToolsMenuViewItem : NSObject
-@property(nonatomic, copy) NSString* accessibilityIdentifier;
-@property(nonatomic, copy) NSString* title;
-@property(nonatomic, assign) NSInteger tag;
-@property(nonatomic, assign) SEL selector;
-@property(nonatomic, assign) BOOL active;
-@property(nonatomic, weak) ToolsMenuViewCell* tableViewCell;
-
-+ (NSString*)cellID;
-+ (Class)cellClass;
-
-+ (instancetype)menuItemWithTitle:(NSString*)title
-          accessibilityIdentifier:(NSString*)accessibilityIdentifier
-                         selector:(SEL)selector
-                          command:(int)commandID;
-
-// Returns YES if it is valid to call -executeCommandWithDispatcher: on this
-// item.
-- (BOOL)canExecuteCommand;
-
-// Execute the command associated with this item using |dispatcher|. |selector|
-// must be defined on the receiver.
-- (void)executeCommandWithDispatcher:
-    (id<ApplicationCommands, BrowserCommands>)dispatcher;
-
-@end
-
-@interface ToolsMenuViewCell : UICollectionViewCell
-@property(nonatomic, strong) UILabel* title;
-@property(nonatomic, readonly) CGFloat horizontalMargin;
-
-- (void)configureForMenuItem:(ToolsMenuViewItem*)item;
-- (void)initializeTitleView;
-- (void)initializeViews;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_ITEM_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.mm
deleted file mode 100644
index 3578ad88..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item.mm
+++ /dev/null
@@ -1,177 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-
-#include "base/i18n/rtl.h"
-#include "base/logging.h"
-#import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-const CGFloat kToolsMenuItemHorizontalMargin = 16;
-// Increase the margin for RTL so the labels don't overlap the tools icon.
-const CGFloat kToolsMenuItemHorizontalMarginRTL = 25;
-static NSString* const kMenuItemCellID = @"MenuItemCellID";
-}
-
-@implementation ToolsMenuViewItem
-@synthesize accessibilityIdentifier = _accessibilityIdentifier;
-@synthesize active = _active;
-@synthesize title = _title;
-@synthesize tag = _tag;
-@synthesize selector = _selector;
-@synthesize tableViewCell = _tableViewCell;
-
-- (id)init {
-  self = [super init];
-  if (self) {
-    _active = YES;
-  }
-
-  return self;
-}
-
-+ (NSString*)cellID {
-  return kMenuItemCellID;
-}
-
-+ (Class)cellClass {
-  return [ToolsMenuViewCell class];
-}
-
-+ (instancetype)menuItemWithTitle:(NSString*)title
-          accessibilityIdentifier:(NSString*)accessibilityIdentifier
-                         selector:(SEL)selector
-                          command:(int)commandID {
-  // Only commandIDs < 0 should have associated selectors.
-  DCHECK(selector == nullptr || commandID < 0);
-  ToolsMenuViewItem* menuItem = [[self alloc] init];
-  [menuItem setAccessibilityLabel:title];
-  [menuItem setAccessibilityIdentifier:accessibilityIdentifier];
-  [menuItem setTag:commandID];
-  [menuItem setSelector:selector];
-  [menuItem setTitle:title];
-
-  return menuItem;
-}
-
-- (BOOL)canExecuteCommand {
-  return self.selector != nullptr;
-}
-
-- (void)executeCommandWithDispatcher:
-    (id<ApplicationCommands, BrowserCommands>)dispatcher {
-  DCHECK(self.selector);
-  DCHECK([dispatcher respondsToSelector:self.selector]);
-// TODO(crbug.com/738881): Find a better way to call these methods.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
-  [dispatcher performSelector:self.selector];
-#pragma clang diagnostic pop
-}
-
-@end
-
-@implementation ToolsMenuViewCell
-@synthesize title = _title;
-@synthesize horizontalMargin = _horizontalMargin;
-
-- (instancetype)initWithCoder:(NSCoder*)aDecoder {
-  self = [super initWithCoder:aDecoder];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  self = [super initWithFrame:frame];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (void)commonInitialization {
-  _horizontalMargin = !base::i18n::IsRTL() ? kToolsMenuItemHorizontalMargin
-                                           : kToolsMenuItemHorizontalMarginRTL;
-  [self setBackgroundColor:[UIColor whiteColor]];
-  [self setOpaque:YES];
-}
-
-- (void)prepareForReuse {
-  [super prepareForReuse];
-  [_title setText:nil];
-  [self setAccessibilityIdentifier:nil];
-  [self setAccessibilityLabel:nil];
-}
-
-- (void)initializeTitleView {
-  _title = [[UILabel alloc] initWithFrame:self.bounds];
-  [_title setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [_title setFont:[[MDCTypography fontLoader] regularFontOfSize:16]];
-  [_title setBackgroundColor:[self backgroundColor]];
-  [_title setTextAlignment:(base::i18n::IsRTL() ? NSTextAlignmentRight
-                                                : NSTextAlignmentLeft)];
-  [_title setOpaque:YES];
-}
-
-- (void)initializeViews {
-  if (_title)
-    return;
-
-  [self initializeTitleView];
-
-  UIView* contentView = [self contentView];
-  [contentView setBackgroundColor:[self backgroundColor]];
-  [contentView setOpaque:YES];
-  [contentView addSubview:_title];
-
-  NSDictionary* view = @{ @"title" : _title };
-  NSString* vertical = @"V:|-(0)-[title]-(0)-|";
-  NSString* horizontal = @"H:|-(margin)-[title]-(25)-|";
-  NSDictionary* metrics = @{ @"margin" : @(self.horizontalMargin) };
-
-  [contentView
-      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:vertical
-                                                             options:0
-                                                             metrics:nil
-                                                               views:view]];
-  [contentView
-      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontal
-                                                             options:0
-                                                             metrics:metrics
-                                                               views:view]];
-}
-
-- (void)configureForMenuItem:(ToolsMenuViewItem*)item {
-  [self initializeViews];
-
-  UIAccessibilityTraits traits = [self accessibilityTraits] |
-                                 UIAccessibilityTraitNotEnabled |
-                                 UIAccessibilityTraitButton;
-  UIColor* textColor = [UIColor lightGrayColor];
-  if ([item active]) {
-    textColor = [UIColor blackColor];
-    traits &= ~UIAccessibilityTraitNotEnabled;
-  }
-
-  [_title setTextColor:textColor];
-  [_title setText:[item title]];
-  [self setAccessibilityIdentifier:[item accessibilityIdentifier]];
-  [self setAccessibilityLabel:[item accessibilityLabel]];
-  [self setAccessibilityTraits:traits];
-  [self setIsAccessibilityElement:YES];
-  [self setTag:[item tag]];
-  item.tableViewCell = self;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item_unittest.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_item_unittest.mm
deleted file mode 100644
index ddd69ac..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_item_unittest.mm
+++ /dev/null
@@ -1,45 +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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_item.h"
-
-#import <UIKit/UIKit.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace {
-
-class ToolsMenuViewItemTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    toolsMenuViewItem_ = [[ToolsMenuViewItem alloc] init];
-  }
-  ToolsMenuViewItem* toolsMenuViewItem_;
-};
-
-TEST_F(ToolsMenuViewItemTest, CustomizeCellAccessibilityTrait) {
-  ToolsMenuViewCell* cell1 = [[ToolsMenuViewCell alloc] init];
-  ToolsMenuViewCell* cell2 = [[ToolsMenuViewCell alloc] init];
-
-  [toolsMenuViewItem_ setActive:YES];
-  [cell1 setAccessibilityTraits:UIAccessibilityTraitNotEnabled];
-  [cell1 configureForMenuItem:toolsMenuViewItem_];
-  EXPECT_FALSE(cell1.accessibilityTraits & UIAccessibilityTraitNotEnabled);
-
-  [toolsMenuViewItem_ setActive:NO];
-  [cell2 configureForMenuItem:toolsMenuViewItem_];
-  EXPECT_TRUE(cell2.accessibilityTraits & UIAccessibilityTraitNotEnabled);
-
-  // Happens when cell2 is reused.
-  [toolsMenuViewItem_ setActive:YES];
-  [cell2 configureForMenuItem:toolsMenuViewItem_];
-  EXPECT_FALSE(cell2.accessibilityTraits & UIAccessibilityTraitNotEnabled);
-}
-
-}  // namespace
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h
deleted file mode 100644
index 5a59c1c..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_TOOLS_CELL_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_TOOLS_CELL_H_
-
-#import <UIKit/UIKit.h>
-
-// This is intended to be the first cell int the Tools Menu table. It contains
-// Toolbar buttons used in compact widths. If using a standard width e.g. iPad
-// full screen this cell will not be inserted in the Tools Menu table.
-@interface ToolsMenuViewToolsCell : UICollectionViewCell
-// Button for refreshing the page. Will be displayed when the context indicates
-// that the page has loaded.
-@property(nonatomic, strong) UIButton* reloadButton;
-// Button that displays the share contextual menu.
-@property(nonatomic, strong) UIButton* shareButton;
-// Button for bookmarking a page.
-@property(nonatomic, strong) UIButton* starButton;
-// Button for editing a bookmarked page.
-@property(nonatomic, strong) UIButton* starredButton;
-// Button for stopping a page from loading. This will only be displayed
-// if the page is currently being loaded. Otherwise the reloadButton
-// will be shown.
-@property(nonatomic, strong) UIButton* stopButton;
-// Button for dismissing the Tools Menu.
-@property(nonatomic, strong) UIButton* toolsButton;
-
-// All buttons in the cell added in display order.
-- (NSArray*)allButtons;
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_MENU_VIEW_TOOLS_CELL_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm b/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
deleted file mode 100644
index 8eb0e76..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.mm
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_tools_cell.h"
-
-#include "components/strings/grit/components_strings.h"
-#include "ios/chrome/browser/ui/rtl_geometry.h"
-#include "ios/chrome/browser/ui/toolbar/toolbar_resource_macros.h"
-#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/uikit_ui_util.h"
-#import "ios/chrome/common/ui_util/constraints_ui_util.h"
-#include "ios/chrome/grit/ios_strings.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-@implementation ToolsMenuViewToolsCell
-
-@synthesize reloadButton = _reloadButton;
-@synthesize shareButton = _shareButton;
-@synthesize starButton = _starButton;
-@synthesize starredButton = _starredButton;
-@synthesize stopButton = _stopButton;
-@synthesize toolsButton = _toolsButton;
-
-- (instancetype)initWithCoder:(NSCoder*)aDecoder {
-  self = [super initWithCoder:aDecoder];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  self = [super initWithFrame:frame];
-  if (self)
-    [self commonInitialization];
-
-  return self;
-}
-
-- (void)commonInitialization {
-  [self setBackgroundColor:[UIColor whiteColor]];
-  [self setOpaque:YES];
-
-  int star[2][3] = TOOLBAR_IDR_TWO_STATE(STAR);
-  _starButton = [self newButtonForImageIds:star
-                                 commandID:TOOLS_BOOKMARK_ITEM
-                      accessibilityLabelID:IDS_BOOKMARK_ADD_EDITOR_TITLE
-                            automationName:@"Add Bookmark"];
-
-  int star_pressed[2][3] = TOOLBAR_IDR_ONE_STATE(STAR_PRESSED);
-  _starredButton = [self newButtonForImageIds:star_pressed
-                                    commandID:TOOLS_BOOKMARK_EDIT
-                         accessibilityLabelID:IDS_IOS_TOOLS_MENU_EDIT_BOOKMARK
-                               automationName:@"Edit Bookmark"];
-
-  int reload[2][3] = TOOLBAR_IDR_TWO_STATE(RELOAD);
-  _reloadButton = [self newButtonForImageIds:reload
-                                   commandID:TOOLS_RELOAD_ITEM
-                        accessibilityLabelID:IDS_IOS_ACCNAME_RELOAD
-                              automationName:@"Reload"
-                               reverseForRTL:YES];
-
-  int stop[2][3] = TOOLBAR_IDR_TWO_STATE(STOP);
-  _stopButton = [self newButtonForImageIds:stop
-                                 commandID:TOOLS_STOP_ITEM
-                      accessibilityLabelID:IDS_IOS_ACCNAME_STOP
-                            automationName:@"Stop"];
-
-  int share[2][3] = TOOLBAR_IDR_THREE_STATE(SHARE);
-  _shareButton = [self newButtonForImageIds:share
-                                  commandID:TOOLS_SHARE_ITEM
-                       accessibilityLabelID:IDS_IOS_TOOLS_MENU_SHARE
-                             automationName:@"Share"];
-
-  int tools[2][3] = TOOLBAR_IDR_ONE_STATE(TOOLS_PRESSED);
-  _toolsButton =
-      [self newButtonForImageIds:tools
-                       commandID:TOOLS_MENU_ITEM
-            accessibilityLabelID:IDS_IOS_TOOLBAR_CLOSE_MENU
-                  automationName:@"kToolbarToolsMenuButtonIdentifier"];
-
-  UIView* contentView = [self contentView];
-  [contentView setBackgroundColor:[self backgroundColor]];
-  [contentView setOpaque:YES];
-
-  [contentView addSubview:_starredButton];
-  [contentView addSubview:_starButton];
-  [contentView addSubview:_stopButton];
-  [contentView addSubview:_reloadButton];
-  [contentView addSubview:_shareButton];
-
-  [self addConstraints];
-}
-
-- (UIButton*)newButtonForImageIds:(int[2][3])imageIds
-                        commandID:(int)commandID
-             accessibilityLabelID:(int)labelID
-                   automationName:(NSString*)name {
-  return [self newButtonForImageIds:imageIds
-                          commandID:commandID
-               accessibilityLabelID:labelID
-                     automationName:name
-                      reverseForRTL:NO];
-}
-
-- (UIButton*)newButtonForImageIds:(int[2][3])imageIds
-                        commandID:(int)commandID
-             accessibilityLabelID:(int)labelID
-                   automationName:(NSString*)name
-                    reverseForRTL:(BOOL)reverseForRTL {
-  UIButton* button = [[UIButton alloc] initWithFrame:CGRectZero];
-  [button setTranslatesAutoresizingMaskIntoConstraints:NO];
-
-  if (imageIds[0][0]) {
-    [button setImage:NativeReversableImage(imageIds[0][0], reverseForRTL)
-            forState:UIControlStateNormal];
-  }
-  [[button imageView] setContentMode:UIViewContentModeCenter];
-  [button setBackgroundColor:[self backgroundColor]];
-  [button setTag:commandID];
-  [button setOpaque:YES];
-
-  SetA11yLabelAndUiAutomationName(button, labelID, name);
-
-  if (imageIds[0][1]) {
-    UIImage* pressedImage =
-        NativeReversableImage(imageIds[0][1], reverseForRTL);
-    if (pressedImage) {
-      [button setImage:pressedImage forState:UIControlStateHighlighted];
-    }
-  }
-
-  if (imageIds[0][2]) {
-    UIImage* disabledImage =
-        NativeReversableImage(imageIds[0][2], reverseForRTL);
-    if (disabledImage) {
-      [button setImage:disabledImage forState:UIControlStateDisabled];
-    }
-  }
-
-  return button;
-}
-
-- (void)addConstraints {
-  for (UIButton* button in [self allButtons]) {
-    NSDictionary* view = @{ @"button" : button };
-    NSArray* constraints = @[ @"V:|-(0)-[button]-(0)-|", @"H:[button(==48)]" ];
-    ApplyVisualConstraints(constraints, view);
-  }
-
-  NSDictionary* views = @{
-    @"share" : _shareButton,
-    @"star" : _starButton,
-    @"reload" : _reloadButton,
-    @"starred" : _starredButton,
-    @"stop" : _stopButton
-  };
-  // Leading offset is 16, minus the button image inset of 12.
-  NSDictionary* metrics = @{ @"offset" : @4, @"space" : @24 };
-  // clang-format off
-  NSArray* constraints = @[
-    @"H:|-(offset)-[share]-(space)-[star]-(space)-[reload]",
-    @"H:[share]-(space)-[starred]",
-    @"H:[star]-(space)-[stop]"
-  ];
-  // clang-format on
-  ApplyVisualConstraintsWithMetrics(constraints, views, metrics);
-}
-
-// These should be added in display order, so they are animated in display
-// order.
-- (NSArray*)allButtons {
-  NSMutableArray* allButtons = [NSMutableArray array];
-  if (_shareButton)
-    [allButtons addObject:_shareButton];
-
-  if (_starButton)
-    [allButtons addObject:_starButton];
-
-  if (_starredButton)
-    [allButtons addObject:_starredButton];
-
-  if (_reloadButton)
-    [allButtons addObject:_reloadButton];
-
-  if (_stopButton)
-    [allButtons addObject:_stopButton];
-
-  return allButtons;
-}
-
-@end
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h
deleted file mode 100644
index bcdc38a..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 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 IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_POPUP_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_POPUP_CONTROLLER_H_
-
-#import <UIKit/UIKit.h>
-
-#include "base/ios/block_types.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_controller.h"
-
-@protocol ApplicationCommands;
-@protocol BrowserCommands;
-@class ToolsMenuConfiguration;
-
-// The view controller for the tools menu within the top toolbar.
-// The menu is composed of two main view: a top view with icons and a bottom
-// view with a table view of menu items.
-@interface ToolsPopupController : PopupMenuController
-
-@property(nonatomic, assign) BOOL isCurrentPageBookmarked;
-
-// Initializes the popup with the given |configuration|, a set of information
-// used to determine the appearance of the menu and the entries displayed.
-// The popup will be presented immediately with an animation, and the
-// |animationCompletion| block will be called when the presentation animation
-// is finished.
-- (instancetype)
-initAndPresentWithConfiguration:(ToolsMenuConfiguration*)configuration
-                     dispatcher:
-                         (id<ApplicationCommands, BrowserCommands>)dispatcher
-                     completion:(ProceduralBlock)animationCompletion;
-
-// Called when the current tab loading state changes.
-- (void)setIsTabLoading:(BOOL)isTabLoading;
-
-// TODO(stuartmorgan): Should the set of options that are passed in to the
-// constructor just have the ability to specify whether commands should be
-// enabled or disabled rather than having these individual setters? b/6048639
-// Informs tools popup menu whether "Find In Page..." command should be
-// enabled.
-- (void)setCanShowFindBar:(BOOL)enabled;
-
-// Informs tools popup menu whether "Share..." command should be enabled.
-- (void)setCanShowShareMenu:(BOOL)enabled;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_TOOLS_MENU_TOOLS_POPUP_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm b/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
deleted file mode 100644
index 1447ad7..0000000
--- a/ios/chrome/browser/ui/tools_menu/tools_popup_controller.mm
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright 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.
-
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-#include "base/logging.h"
-#include "base/metrics/user_metrics.h"
-#include "base/metrics/user_metrics_action.h"
-#import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/browser/ui/popup_menu/popup_menu_view.h"
-#include "ios/chrome/browser/ui/rtl_geometry.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_configuration.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_menu_view_controller.h"
-#import "ios/chrome/browser/ui/uikit_ui_util.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-using base::UserMetricsAction;
-
-namespace {
-
-const CGFloat kToolsPopupMenuWidth = 280.0;
-const CGFloat kToolsPopupMenuTrailingOffset = 4;
-
-// Inset for the shadows of the contained views.
-NS_INLINE UIEdgeInsets TabHistoryPopupMenuInsets() {
-  return UIEdgeInsetsMake(9, 11, 12, 11);
-}
-
-}  // namespace
-
-@interface ToolsPopupController ()<ToolsPopupTableDelegate> {
-  ToolsMenuViewController* _toolsMenuViewController;
-  // Container view of the menu items table.
-  UIView* _toolsTableViewContainer;
-  // The view controller from which to present other view controllers.
-  __weak UIViewController* _baseViewController;
-}
-@end
-
-@implementation ToolsPopupController
-@synthesize isCurrentPageBookmarked = _isCurrentPageBookmarked;
-
-- (instancetype)
-initAndPresentWithConfiguration:(ToolsMenuConfiguration*)configuration
-                     dispatcher:
-                         (id<ApplicationCommands, BrowserCommands>)dispatcher
-                     completion:(ProceduralBlock)completion {
-  DCHECK(configuration.displayView);
-  self = [super initWithParentView:configuration.displayView];
-  if (self) {
-    // Set superclass dispatcher property.
-    self.dispatcher = dispatcher;
-    _toolsMenuViewController = [[ToolsMenuViewController alloc] init];
-    _toolsMenuViewController.dispatcher = self.dispatcher;
-
-    _baseViewController = configuration.baseViewController;
-
-    _toolsTableViewContainer = [_toolsMenuViewController view];
-    [_toolsTableViewContainer layer].cornerRadius = 2;
-    [_toolsTableViewContainer layer].masksToBounds = YES;
-    [_toolsMenuViewController initializeMenuWithConfiguration:configuration];
-
-    UIEdgeInsets popupInsets = TabHistoryPopupMenuInsets();
-    CGFloat popupWidth = kToolsPopupMenuWidth;
-
-    CGPoint origin = CGPointMake(CGRectGetMidX(configuration.sourceRect),
-                                 CGRectGetMidY(configuration.sourceRect));
-
-    CGRect containerBounds = [configuration.displayView bounds];
-    CGFloat minY = CGRectGetMinY(configuration.sourceRect) - popupInsets.top;
-
-    UIEdgeInsets safeAreaInsets = UIEdgeInsetsZero;
-    if (@available(iOS 11.0, *)) {
-      safeAreaInsets = configuration.displayView.safeAreaInsets;
-    }
-
-    // The tools popup appears trailing- aligned, but because
-    // kToolsPopupMenuTrailingOffset is smaller than the popupInsets's trailing
-    // value, destination needs to be shifted a bit.
-    CGFloat trailingShift =
-        UIEdgeInsetsGetTrailing(popupInsets) - kToolsPopupMenuTrailingOffset;
-    // The tools popup needs to be displayed inside the safe area.
-    trailingShift -= UIEdgeInsetsGetTrailing(safeAreaInsets);
-
-    if (UseRTLLayout())
-      trailingShift = -trailingShift;
-
-    CGPoint destination = CGPointMake(
-        CGRectGetTrailingEdge(containerBounds) + trailingShift, minY);
-
-    CGFloat availableHeight =
-        CGRectGetHeight([configuration.displayView bounds]) - minY -
-        popupInsets.bottom;
-    CGFloat optimalHeight =
-        [_toolsMenuViewController optimalHeight:availableHeight];
-    [self setOptimalSize:CGSizeMake(popupWidth, optimalHeight)
-                atOrigin:destination];
-
-    CGRect bounds = [[self popupContainer] bounds];
-    CGRect frame = UIEdgeInsetsInsetRect(bounds, popupInsets);
-
-    [_toolsTableViewContainer setFrame:frame];
-    [[self popupContainer] addSubview:_toolsTableViewContainer];
-
-    [_toolsMenuViewController setDelegate:self];
-    [self fadeInPopupFromSource:origin
-                  toDestination:destination
-                     completion:completion];
-
-    // Insert |toolsButton| above |popupContainer| so it appears stationary.
-    // Otherwise the tools button will animate with the tools popup.
-    UIButton* toolsButton = [_toolsMenuViewController toolsButton];
-    if (toolsButton) {
-      UIView* outsideAnimationView = [[self popupContainer] superview];
-      const CGFloat buttonWidth = 48;
-      // |origin| is the center of the tools menu icon in the toolbar; use
-      // that to determine where the tools button should be placed.
-      CGPoint buttonCenter =
-          [configuration.displayView convertPoint:origin
-                                           toView:outsideAnimationView];
-      CGRect frame = CGRectMake(buttonCenter.x - buttonWidth / 2.0,
-                                buttonCenter.y - buttonWidth / 2.0, buttonWidth,
-                                buttonWidth);
-      [toolsButton setFrame:frame];
-      [toolsButton setImageEdgeInsets:configuration.toolsButtonInsets];
-      [outsideAnimationView addSubview:toolsButton];
-    }
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [_toolsTableViewContainer removeFromSuperview];
-  [_toolsMenuViewController setDelegate:nil];
-}
-
-- (void)fadeInPopupFromSource:(CGPoint)source
-                toDestination:(CGPoint)destination
-                   completion:(ProceduralBlock)completion {
-  [_toolsMenuViewController animateContentIn];
-  [super fadeInPopupFromSource:source
-                 toDestination:destination
-                    completion:completion];
-}
-
-- (void)dismissAnimatedWithCompletion:(void (^)(void))completion {
-  [_toolsMenuViewController hideContent];
-  [super dismissAnimatedWithCompletion:completion];
-}
-
-- (void)setIsCurrentPageBookmarked:(BOOL)value {
-  _isCurrentPageBookmarked = value;
-  [_toolsMenuViewController setIsCurrentPageBookmarked:value];
-}
-
-- (void)setCanShowFindBar:(BOOL)enabled {
-  [_toolsMenuViewController setCanShowFindBar:enabled];
-}
-
-- (void)setCanShowShareMenu:(BOOL)enabled {
-  [_toolsMenuViewController setCanShowShareMenu:enabled];
-}
-
-- (void)setIsTabLoading:(BOOL)isTabLoading {
-  [_toolsMenuViewController setIsTabLoading:isTabLoading];
-}
-
-#pragma mark - ToolsPopupTableDelegate methods
-
-- (void)commandWasSelected:(int)commandID {
-  // Record the corresponding metric.
-  switch (commandID) {
-    case TOOLS_BOOKMARK_EDIT:
-      base::RecordAction(UserMetricsAction("MobileMenuEditBookmark"));
-      break;
-    case TOOLS_BOOKMARK_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuAddToBookmarks"));
-      break;
-    case TOOLS_CLOSE_ALL_TABS:
-      base::RecordAction(UserMetricsAction("MobileMenuCloseAllTabs"));
-      break;
-    case TOOLS_CLOSE_ALL_INCOGNITO_TABS:
-      base::RecordAction(UserMetricsAction("MobileMenuCloseAllIncognitoTabs"));
-      break;
-    case TOOLS_SHOW_FIND_IN_PAGE:
-      base::RecordAction(UserMetricsAction("MobileMenuFindInPage"));
-      break;
-    case TOOLS_SHOW_HELP_PAGE:
-      base::RecordAction(UserMetricsAction("MobileMenuHelp"));
-      break;
-    case TOOLS_NEW_INCOGNITO_TAB_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuNewIncognitoTab"));
-      break;
-    case TOOLS_NEW_TAB_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuNewTab"));
-      break;
-    case TOOLS_SETTINGS_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuSettings"));
-      [self.dispatcher showSettingsFromViewController:_baseViewController];
-      break;
-    case TOOLS_RELOAD_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuReload"));
-      break;
-    case TOOLS_SHARE_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuShare"));
-      break;
-    case TOOLS_REQUEST_DESKTOP_SITE:
-      base::RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite"));
-      break;
-    case TOOLS_REQUEST_MOBILE_SITE:
-      base::RecordAction(UserMetricsAction("MobileMenuRequestMobileSite"));
-      break;
-    case TOOLS_SHOW_BOOKMARKS:
-      base::RecordAction(UserMetricsAction("MobileMenuAllBookmarks"));
-      break;
-    case TOOLS_SHOW_HISTORY:
-      base::RecordAction(UserMetricsAction("MobileMenuHistory"));
-      break;
-    case TOOLS_SHOW_RECENT_TABS:
-      base::RecordAction(UserMetricsAction("MobileMenuRecentTabs"));
-      break;
-    case TOOLS_STOP_ITEM:
-      base::RecordAction(UserMetricsAction("MobileMenuStop"));
-      break;
-    case TOOLS_REPORT_AN_ISSUE:
-      self.containerView.hidden = YES;
-      base::RecordAction(UserMetricsAction("MobileMenuReportAnIssue"));
-      [self.dispatcher showReportAnIssueFromViewController:_baseViewController];
-      break;
-    case TOOLS_VIEW_SOURCE:
-      // Debug only; no metric.
-      break;
-    case TOOLS_MENU_ITEM:
-      // Do nothing when tapping the tools menu a second time.
-      break;
-    case TOOLS_READING_LIST:
-      base::RecordAction(UserMetricsAction("MobileMenuReadingList"));
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-
-  // Close the menu.
-  [self.delegate dismissPopupMenu:self];
-}
-
-@end
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index c8dbf5c..d9127ef 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -234,9 +234,7 @@
     "//ios/chrome/browser/ui/table_view/cells:unit_tests",
     "//ios/chrome/browser/ui/tabs:unit_tests",
     "//ios/chrome/browser/ui/toolbar:unit_tests",
-    "//ios/chrome/browser/ui/toolbar/adaptive:unit_tests",
-    "//ios/chrome/browser/ui/toolbar/clean:unit_tests",
-    "//ios/chrome/browser/ui/tools_menu:unit_tests",
+    "//ios/chrome/browser/ui/toolbar/fullscreen:unit_tests",
     "//ios/chrome/browser/ui/util:unit_tests",
     "//ios/chrome/browser/ui/voice:unit_tests",
     "//ios/chrome/browser/update_client:unit_tests",
diff --git a/ios/chrome/test/app/chrome_test_util.h b/ios/chrome/test/app/chrome_test_util.h
index 8875c17..c82d4c5 100644
--- a/ios/chrome/test/app/chrome_test_util.h
+++ b/ios/chrome/test/app/chrome_test_util.h
@@ -44,7 +44,8 @@
 NSUInteger GetRegisteredKeyCommandsCount();
 
 // Returns the dispatcher for the main BVC.
-// TODO(crbug.com/738881): Use DispatcherForActiveViewController() instead.
+// TODO(crbug.com/738881): Use DispatcherForActiveBrowserViewController()
+// instead.
 id<BrowserCommands> BrowserCommandDispatcherForMainBVC();
 
 // Returns the active view controller.
@@ -52,11 +53,6 @@
 // possible.
 UIViewController* GetActiveViewController();
 
-// Returns the dispatcher for the active view controller.
-// DEPRECATED. Please use DispatcherForActiveBrowserViewController.
-// TODO(crbug.com/800266): Remove this.
-id<ApplicationCommands, BrowserCommands> DispatcherForActiveViewController();
-
 // Returns the dispatcher for the active BrowserViewController. If the
 // BrowserViewController isn't presented, returns nil.
 id<ApplicationCommands, BrowserCommands>
diff --git a/ios/chrome/test/app/chrome_test_util.mm b/ios/chrome/test/app/chrome_test_util.mm
index 1ec3df99..6a471002 100644
--- a/ios/chrome/test/app/chrome_test_util.mm
+++ b/ios/chrome/test/app/chrome_test_util.mm
@@ -145,25 +145,6 @@
   return active_view_controller;
 }
 
-id<ApplicationCommands, BrowserCommands> DispatcherForActiveViewController() {
-  DCHECK(!IsUIRefreshPhase1Enabled());
-  UIViewController* vc = GetActiveViewController();
-  BrowserViewController* bvc = base::mac::ObjCCast<BrowserViewController>(vc);
-  if (bvc)
-    return bvc.dispatcher;
-  if ([vc conformsToProtocol:@protocol(TabSwitcher)]) {
-    // In stack_view and the iPad tab switcher, the view controller has a
-    // dispatcher.
-    id<TabSwitcher> tabSwitcher = static_cast<id<TabSwitcher>>(vc);
-    return static_cast<id<ApplicationCommands, BrowserCommands>>(
-        tabSwitcher.dispatcher);
-  }
-  // In tab grid, the TabSwitcher object is not in the view hierarchy so it must
-  // be gotten through the MainController.
-  return static_cast<id<ApplicationCommands, BrowserCommands>>(
-      GetMainController().tabSwitcher.dispatcher);
-}
-
 id<ApplicationCommands, BrowserCommands>
 DispatcherForActiveBrowserViewController() {
   UIViewController* vc = GetActiveViewController();
diff --git a/ios/chrome/test/app/tab_test_util.mm b/ios/chrome/test/app/tab_test_util.mm
index d02b755..8ae0586 100644
--- a/ios/chrome/test/app/tab_test_util.mm
+++ b/ios/chrome/test/app/tab_test_util.mm
@@ -55,12 +55,11 @@
 void OpenNewTab() {
   @autoreleasepool {  // Make sure that all internals are deallocated.
     OpenNewTabCommand* command = [OpenNewTabCommand command];
-    if (IsUIRefreshPhase1Enabled()) {
-      id<ApplicationCommands, BrowserCommands> BVCDispatcher =
-          chrome_test_util::DispatcherForActiveBrowserViewController();
-      if (BVCDispatcher) {
-        [BVCDispatcher openNewTab:command];
-        return;
+    id<ApplicationCommands, BrowserCommands> BVCDispatcher =
+        chrome_test_util::DispatcherForActiveBrowserViewController();
+    if (BVCDispatcher) {
+      [BVCDispatcher openURLInNewTab:command];
+      return;
       }
       // The TabGrid is currently presented.
       [GetMainController().tabSwitcher
@@ -70,22 +69,17 @@
                                     withURL:GURL(kChromeUINewTabURL)
                                     atIndex:NSNotFound
                                  transition:ui::PAGE_TRANSITION_TYPED];
-    } else {
-      [chrome_test_util::DispatcherForActiveViewController()
-          openNewTab:command];
-    }
   }
 }
 
 void OpenNewIncognitoTab() {
   @autoreleasepool {  // Make sure that all internals are deallocated.
     OpenNewTabCommand* command = [OpenNewTabCommand incognitoTabCommand];
-    if (IsUIRefreshPhase1Enabled()) {
-      id<ApplicationCommands, BrowserCommands> BVCDispatcher =
-          chrome_test_util::DispatcherForActiveBrowserViewController();
-      if (BVCDispatcher) {
-        [BVCDispatcher openNewTab:command];
-        return;
+    id<ApplicationCommands, BrowserCommands> BVCDispatcher =
+        chrome_test_util::DispatcherForActiveBrowserViewController();
+    if (BVCDispatcher) {
+      [BVCDispatcher openURLInNewTab:command];
+      return;
       }
       // The TabGrid is currently presented.
       [GetMainController().tabSwitcher
@@ -95,10 +89,6 @@
                                     withURL:GURL(kChromeUINewTabURL)
                                     atIndex:NSNotFound
                                  transition:ui::PAGE_TRANSITION_TYPED];
-    } else {
-      [chrome_test_util::DispatcherForActiveViewController()
-          openNewTab:command];
-    }
   }
 }
 
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index 3a0801e..885664c4a 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -14,6 +14,7 @@
     ":ios_chrome_external_url_egtests",
     ":ios_chrome_flaky_egtests",
     ":ios_chrome_integration_egtests",
+    ":ios_chrome_manual_fill_egtests",
     ":ios_chrome_multitasking_egtests",
     ":ios_chrome_payments_egtests",
     ":ios_chrome_perf_egtests",
@@ -58,6 +59,13 @@
   ]
 }
 
+chrome_ios_eg_test("ios_chrome_manual_fill_egtests") {
+  deps = [
+    ":test_support",
+    "//ios/chrome/browser/ui/autofill/manual_fill:eg_tests",
+  ]
+}
+
 chrome_ios_eg_test("ios_chrome_payments_egtests") {
   deps = [
     ":test_support",
@@ -118,7 +126,6 @@
     "//ios/chrome/browser/ui/signin_interaction:eg_tests",
     "//ios/chrome/browser/ui/tabs:eg_tests",
     "//ios/chrome/browser/ui/toolbar:eg_tests",
-    "//ios/chrome/browser/ui/toolbar/adaptive:eg_tests",
     "//ios/chrome/browser/ui/webui:eg_tests",
   ]
 }
@@ -254,8 +261,6 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
-    "//ios/chrome/browser/ui/tools_menu",
-    "//ios/chrome/browser/ui/tools_menu/public",
     "//ios/chrome/test/app:test_support",
     "//ios/testing/earl_grey:earl_grey_support",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
index e03ebff..abc2b90 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/ui/settings/privacy_collection_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h"
-#import "ios/chrome/browser/ui/tools_menu/tools_popup_controller.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index fd0a9f6..e3d075e 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -34,7 +34,6 @@
 #import "ios/chrome/browser/ui/settings/sync_settings_collection_view_controller.h"
 #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_constants.h"
-#import "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
diff --git a/ios/chrome/test/fakes/fake_document_interaction_controller.h b/ios/chrome/test/fakes/fake_document_interaction_controller.h
index 285ee00..ce6ddd0 100644
--- a/ios/chrome/test/fakes/fake_document_interaction_controller.h
+++ b/ios/chrome/test/fakes/fake_document_interaction_controller.h
@@ -19,6 +19,8 @@
 // present any UI, but simply captures the presentation requests.
 @interface FakeDocumentInteractionController : NSObject
 
+// Fake implementations of UIDocumentInteractionController properties:
+@property(nonatomic, copy) NSString* UTI;
 @property(nonatomic, weak) id<UIDocumentInteractionControllerDelegate> delegate;
 
 // Whether or not this controller can present Open In... menu. Defaults to YES.
diff --git a/ios/chrome/test/fakes/fake_document_interaction_controller.mm b/ios/chrome/test/fakes/fake_document_interaction_controller.mm
index cb4a989..edb49fbe5 100644
--- a/ios/chrome/test/fakes/fake_document_interaction_controller.mm
+++ b/ios/chrome/test/fakes/fake_document_interaction_controller.mm
@@ -22,6 +22,7 @@
 @end
 
 @implementation FakeDocumentInteractionController
+@synthesize UTI = _UTI;
 @synthesize delegate = _delegate;
 @synthesize presentsOpenInMenu = _presentsOpenInMenu;
 @synthesize presentedOpenInMenu = _presentedOpenInMenu;
diff --git a/ios/showcase/OWNERS b/ios/showcase/OWNERS
index aa8e8548..f72b1e5 100644
--- a/ios/showcase/OWNERS
+++ b/ios/showcase/OWNERS
@@ -1,5 +1,4 @@
 edchin@chromium.org
-lpromero@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
 # OS: iOS
diff --git a/ios/third_party/material_components_ios/OWNERS b/ios/third_party/material_components_ios/OWNERS
index 1e909408..b3a59d9a 100644
--- a/ios/third_party/material_components_ios/OWNERS
+++ b/ios/third_party/material_components_ios/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # These are for the common case of adding or renaming files. If you're doing
diff --git a/ios/third_party/material_font_disk_loader_ios/OWNERS b/ios/third_party/material_font_disk_loader_ios/OWNERS
index c984591..b127701 100644
--- a/ios/third_party/material_font_disk_loader_ios/OWNERS
+++ b/ios/third_party/material_font_disk_loader_ios/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/third_party/material_roboto_font_loader_ios/OWNERS b/ios/third_party/material_roboto_font_loader_ios/OWNERS
index c984591..b127701 100644
--- a/ios/third_party/material_roboto_font_loader_ios/OWNERS
+++ b/ios/third_party/material_roboto_font_loader_ios/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/third_party/material_sprited_animation_view_ios/OWNERS b/ios/third_party/material_sprited_animation_view_ios/OWNERS
index c984591..b127701 100644
--- a/ios/third_party/material_sprited_animation_view_ios/OWNERS
+++ b/ios/third_party/material_sprited_animation_view_ios/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/third_party/material_text_accessibility_ios/OWNERS b/ios/third_party/material_text_accessibility_ios/OWNERS
index c984591..b127701 100644
--- a/ios/third_party/material_text_accessibility_ios/OWNERS
+++ b/ios/third_party/material_text_accessibility_ios/OWNERS
@@ -1,4 +1,3 @@
-lpromero@chromium.org
 rohitrao@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
diff --git a/ios/web/download/OWNERS b/ios/web/download/OWNERS
index f1a8cd4..bd6fe7d6 100644
--- a/ios/web/download/OWNERS
+++ b/ios/web/download/OWNERS
@@ -1,5 +1,4 @@
 eugenebut@chromium.org
-gchatz@chromium.org
 
 # TEAM: ios-directory-owners@chromium.org
 # OS: iOS
diff --git a/ios/web/download/download_task_impl.h b/ios/web/download/download_task_impl.h
index 2b0d0f54..427f769 100644
--- a/ios/web/download/download_task_impl.h
+++ b/ios/web/download/download_task_impl.h
@@ -95,12 +95,20 @@
   // Starts the download with given cookies.
   void StartWithCookies(NSArray<NSHTTPCookie*>* cookies);
 
+  // Starts parsing data:// url. Separate code path is used because
+  // NSURLSession does not support data URLs.
+  void StartDataUrlParsing();
+
   // Called when download task was updated.
   void OnDownloadUpdated();
 
   // Called when download was completed and the data writing was finished.
   void OnDownloadFinished(int error_code);
 
+  // Called when data:// url parsing has completed and the data has been
+  // written.
+  void OnDataUrlWritten(int bytes_written);
+
   // A list of observers. Weak references.
   base::ObserverList<DownloadTaskObserver, true>::Unchecked observers_;
 
@@ -116,6 +124,7 @@
   std::string content_disposition_;
   std::string mime_type_;
   ui::PageTransition page_transition_ = ui::PAGE_TRANSITION_LINK;
+  NSString* identifier_ = nil;
   bool has_performed_background_download_ = false;
 
   const WebState* web_state_ = nullptr;
diff --git a/ios/web/download/download_task_impl.mm b/ios/web/download/download_task_impl.mm
index 679ab41..86bd8d0f 100644
--- a/ios/web/download/download_task_impl.mm
+++ b/ios/web/download/download_task_impl.mm
@@ -17,11 +17,13 @@
 #include "ios/web/public/web_task_traits.h"
 #include "ios/web/public/web_thread.h"
 #import "ios/web/web_state/error_translation_util.h"
+#include "net/base/data_url.h"
 #include "net/base/filename_util.h"
 #include "net/base/io_buffer.h"
 #import "net/base/mac/url_conversions.h"
 #include "net/base/net_errors.h"
 #include "net/url_request/url_fetcher_response_writer.h"
+#include "url/url_constants.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -172,14 +174,13 @@
       content_disposition_(content_disposition),
       mime_type_(mime_type),
       page_transition_(page_transition),
+      identifier_([identifier copy]),
       web_state_(web_state),
       delegate_(delegate),
       weak_factory_(this) {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  session_ = CreateSession(identifier);
   DCHECK(web_state_);
   DCHECK(delegate_);
-  DCHECK(session_);
 
   observer_ = [NSNotificationCenter.defaultCenter
       addObserverForName:UIApplicationWillResignActiveNotification
@@ -224,8 +225,13 @@
   percent_complete_ = 0;
   received_bytes_ = 0;
   state_ = State::kInProgress;
-  GetCookies(base::Bind(&DownloadTaskImpl::StartWithCookies,
-                        weak_factory_.GetWeakPtr()));
+
+  if (original_url_.SchemeIs(url::kDataScheme)) {
+    StartDataUrlParsing();
+  } else {
+    GetCookies(base::Bind(&DownloadTaskImpl::StartWithCookies,
+                          weak_factory_.GetWeakPtr()));
+  }
 }
 
 void DownloadTaskImpl::Cancel() {
@@ -243,7 +249,7 @@
 
 NSString* DownloadTaskImpl::GetIndentifier() const {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
-  return session_.configuration.identifier;
+  return identifier_;
 }
 
 const GURL& DownloadTaskImpl::GetOriginalUrl() const {
@@ -405,6 +411,11 @@
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
   DCHECK(writer_);
 
+  if (!session_) {
+    session_ = CreateSession(identifier_);
+    DCHECK(session_);
+  }
+
   has_performed_background_download_ =
       UIApplication.sharedApplication.applicationState !=
       UIApplicationStateActive;
@@ -417,15 +428,45 @@
   OnDownloadUpdated();
 }
 
+void DownloadTaskImpl::StartDataUrlParsing() {
+  mime_type_.clear();
+  std::string charset;
+  std::string data;
+  if (!net::DataURL::Parse(original_url_, &mime_type_, &charset, &data)) {
+    OnDownloadFinished(net::ERR_INVALID_URL);
+    return;
+  }
+  auto callback = base::BindOnce(&DownloadTaskImpl::OnDataUrlWritten,
+                                 weak_factory_.GetWeakPtr());
+  auto buffer = base::MakeRefCounted<net::IOBuffer>(data.size());
+  memcpy(buffer->data(), data.c_str(), data.size());
+  int written = writer_->Write(buffer.get(), data.size(), std::move(callback));
+  if (written != net::ERR_IO_PENDING) {
+    OnDataUrlWritten(written);
+  }
+}
+
 void DownloadTaskImpl::OnDownloadUpdated() {
   for (auto& observer : observers_)
     observer.OnDownloadUpdated(this);
 }
 
 void DownloadTaskImpl::OnDownloadFinished(int error_code) {
+  error_code_ = error_code;
   state_ = State::kComplete;
   session_task_ = nil;
   OnDownloadUpdated();
 }
 
+void DownloadTaskImpl::OnDataUrlWritten(int bytes_written) {
+  percent_complete_ = 100;
+  total_bytes_ = bytes_written;
+  received_bytes_ = total_bytes_;
+  auto callback = base::BindOnce(&DownloadTaskImpl::OnDownloadFinished,
+                                 weak_factory_.GetWeakPtr());
+  if (writer_->Finish(net::OK, std::move(callback)) != net::ERR_IO_PENDING) {
+    OnDownloadFinished(net::OK);
+  }
+}
+
 }  // namespace web
diff --git a/ios/web/download/download_task_impl_unittest.mm b/ios/web/download/download_task_impl_unittest.mm
index 98389391..be044e2 100644
--- a/ios/web/download/download_task_impl_unittest.mm
+++ b/ios/web/download/download_task_impl_unittest.mm
@@ -82,7 +82,10 @@
   FakeDownloadTaskImplDelegate()
       : configuration_([NSURLSessionConfiguration
             backgroundSessionConfigurationWithIdentifier:
-                [NSUUID UUID].UUIDString]) {}
+                [NSUUID UUID].UUIDString]),
+        session_(OCMStrictClassMock([NSURLSession class])) {
+    OCMStub([session_ configuration]).andReturn(configuration_);
+  }
 
   MOCK_METHOD1(OnTaskDestroyed, void(DownloadTaskImpl* task));
 
@@ -91,13 +94,8 @@
                               id<NSURLSessionDataDelegate> delegate,
                               NSOperationQueue* delegate_queue) {
     // Make sure this method is called only once.
-    EXPECT_FALSE(session_);
     EXPECT_FALSE(session_delegate_);
-
     session_delegate_ = delegate;
-    session_ = OCMStrictClassMock([NSURLSession class]);
-    OCMStub([session_ configuration]).andReturn(configuration_);
-
     return session_;
   }
 
@@ -141,6 +139,7 @@
     NSURL* url = [NSURL URLWithString:@(kUrl)];
     CRWFakeNSURLSessionTask* session_task =
         [[CRWFakeNSURLSessionTask alloc] initWithURL:url];
+    EXPECT_TRUE(task_delegate_.session());
     OCMExpect([task_delegate_.session() dataTaskWithURL:url])
         .andReturn(session_task);
 
@@ -693,4 +692,67 @@
   EXPECT_TRUE(session_task.state = NSURLSessionTaskStateCanceling);
 }
 
+// Tests valid data:// url downloads.
+TEST_F(DownloadTaskImplTest, ValidDataUrl) {
+  // Create data:// url download task.
+  char kDataUrl[] = "data:text/plain;base64,Q2hyb21pdW0=";
+  auto task = std::make_unique<DownloadTaskImpl>(
+      &web_state_, GURL(kDataUrl), kContentDisposition,
+      /*total_bytes=*/-1, kMimeType, ui::PageTransition::PAGE_TRANSITION_TYPED,
+      task_delegate_.configuration().identifier, &task_delegate_);
+
+  // Start and wait until the download is complete.
+  task->Start(std::make_unique<net::URLFetcherStringWriter>());
+  DownloadTaskImpl* task_ptr = task.get();
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForDownloadTimeout, ^{
+    base::RunLoop().RunUntilIdle();
+    return task_ptr->IsDone();
+  }));
+
+  // Verify the state of downloaded task.
+  const char kTestData[] = "Chromium";
+  EXPECT_EQ(DownloadTask::State::kComplete, task->GetState());
+  EXPECT_EQ(0, task->GetErrorCode());
+  EXPECT_EQ(strlen(kTestData), static_cast<size_t>(task->GetTotalBytes()));
+  EXPECT_EQ(strlen(kTestData), static_cast<size_t>(task->GetReceivedBytes()));
+  EXPECT_EQ(100, task->GetPercentComplete());
+  EXPECT_EQ("text/plain", task->GetMimeType());
+  EXPECT_EQ(kTestData, task->GetResponseWriter()->AsStringWriter()->data());
+
+  // One OnTaskDestroyed for |task_| and one for |task|.
+  EXPECT_CALL(task_delegate_, OnTaskDestroyed(task_.get()));
+  EXPECT_CALL(task_delegate_, OnTaskDestroyed(task.get()));
+}
+
+// Tests empty data:// url downloads.
+TEST_F(DownloadTaskImplTest, EmptyDataUrl) {
+  // Create data:// url download task.
+  char kDataUrl[] = "data://";
+  auto task = std::make_unique<DownloadTaskImpl>(
+      &web_state_, GURL(kDataUrl), kContentDisposition,
+      /*total_bytes=*/-1, kMimeType, ui::PageTransition::PAGE_TRANSITION_TYPED,
+      task_delegate_.configuration().identifier, &task_delegate_);
+
+  // Start and wait until the download is complete.
+  task->Start(std::make_unique<net::URLFetcherStringWriter>());
+  DownloadTaskImpl* task_ptr = task.get();
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForDownloadTimeout, ^{
+    base::RunLoop().RunUntilIdle();
+    return task_ptr->IsDone();
+  }));
+
+  // Verify the state of downloaded task.
+  EXPECT_EQ(DownloadTask::State::kComplete, task->GetState());
+  EXPECT_EQ(net::ERR_INVALID_URL, task->GetErrorCode());
+  EXPECT_EQ(-1, task->GetTotalBytes());
+  EXPECT_EQ(0, task->GetReceivedBytes());
+  EXPECT_EQ(0, task->GetPercentComplete());
+  EXPECT_EQ("", task->GetMimeType());
+  EXPECT_EQ("", task->GetResponseWriter()->AsStringWriter()->data());
+
+  // One OnTaskDestroyed for |task_| and one for |task|.
+  EXPECT_CALL(task_delegate_, OnTaskDestroyed(task_.get()));
+  EXPECT_CALL(task_delegate_, OnTaskDestroyed(task.get()));
+}
+
 }  // namespace web
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index e344f04..28dab9ff 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4483,7 +4483,7 @@
       [_pendingNavigationInfo setCancelled:YES];
     }
   } else {
-    if (responseURL.SchemeIsHTTPOrHTTPS()) {
+    if (web::UrlHasWebScheme(responseURL)) {
       std::string contentDisposition;
       if (HTTPHeaders) {
         HTTPHeaders->GetNormalizedHeader("content-disposition",
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm
index 585497c5..a28a4cc 100644
--- a/ios/web/web_state/ui/crw_web_controller_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -785,22 +785,6 @@
       ui::PageTransition::PAGE_TRANSITION_AUTO_SUBFRAME));
 }
 
-// Tests that webView:decidePolicyForNavigationResponse:decisionHandler: does
-// not create the DownloadTask for unsupported data:// URLs.
-TEST_P(CRWWebControllerDownloadTest, DataUrlResponse) {
-  // Simulate download response.
-  NSURLResponse* response =
-      [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:@"data:data"]
-                                  statusCode:200
-                                 HTTPVersion:nil
-                                headerFields:nil];
-  ASSERT_TRUE(CallDecidePolicyForNavigationResponseWithResponse(
-      response, /*for_main_frame=*/YES));
-
-  // Verify that download task was not created.
-  EXPECT_TRUE(delegate_.alive_download_tasks().empty());
-}
-
 // Tests |currentURLWithTrustLevel:| method.
 TEST_P(CRWWebControllerTest, CurrentUrlWithTrustLevel) {
   GURL url("http://chromium.test");
diff --git a/net/cert/ocsp_revocation_status.h b/net/cert/ocsp_revocation_status.h
index c20dd2e..dac7a20 100644
--- a/net/cert/ocsp_revocation_status.h
+++ b/net/cert/ocsp_revocation_status.h
@@ -7,10 +7,13 @@
 
 namespace net {
 
+// This value is histogrammed, so do not re-order or change values, and add
+// new values at the end.
 enum class OCSPRevocationStatus {
-  GOOD,
-  REVOKED,
-  UNKNOWN,
+  GOOD = 0,
+  REVOKED = 1,
+  UNKNOWN = 2,
+  MAX_VALUE = UNKNOWN
 };
 
 }  // namespace net
diff --git a/net/cert/ocsp_verify_result.h b/net/cert/ocsp_verify_result.h
index 3a0bd7c2..48a7a00 100644
--- a/net/cert/ocsp_verify_result.h
+++ b/net/cert/ocsp_verify_result.h
@@ -26,37 +26,39 @@
 
   bool operator==(const OCSPVerifyResult& other) const;
 
+  // This value is histogrammed, so do not re-order or change values, and add
+  // new values at the end.
   enum ResponseStatus {
     // OCSP verification was not checked on this connection.
-    NOT_CHECKED,
+    NOT_CHECKED = 0,
 
     // No OCSPResponse was stapled.
-    MISSING,
+    MISSING = 1,
 
     // An up-to-date OCSP response was stapled and matched the certificate.
-    PROVIDED,
+    PROVIDED = 2,
 
     // The stapled OCSP response did not have a SUCCESSFUL status.
-    ERROR_RESPONSE,
+    ERROR_RESPONSE = 3,
 
     // The OCSPResponseData field producedAt was outside the certificate
     // validity period.
-    BAD_PRODUCED_AT,
+    BAD_PRODUCED_AT = 4,
 
     // At least one OCSPSingleResponse was stapled, but none matched the
     // certificate.
-    NO_MATCHING_RESPONSE,
+    NO_MATCHING_RESPONSE = 5,
 
     // A matching OCSPSingleResponse was stapled, but was either expired or not
     // yet valid.
-    INVALID_DATE,
+    INVALID_DATE = 6,
 
     // The OCSPResponse structure could not be parsed.
-    PARSE_RESPONSE_ERROR,
+    PARSE_RESPONSE_ERROR = 7,
 
     // The OCSPResponseData structure could not be parsed.
-    PARSE_RESPONSE_DATA_ERROR,
-
+    PARSE_RESPONSE_DATA_ERROR = 8,
+    RESPONSE_STATUS_MAX = PARSE_RESPONSE_DATA_ERROR
   };
 
   ResponseStatus response_status = NOT_CHECKED;
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn
index 044f882..ec9457a5 100644
--- a/pdf/BUILD.gn
+++ b/pdf/BUILD.gn
@@ -19,7 +19,19 @@
 if (enable_pdf) {
   pdf_engine = 0  # 0 PDFium
 
+  config("pdf_common_config") {
+    if (pdf_engine == 0) {
+      defines = [ "PDFIUM_PRINT_TEXT_WITH_GDI" ]
+      if (pdf_enable_xfa) {
+        defines += [ "PDF_ENABLE_XFA" ]
+      }
+
+      include_dirs = [ "//third_party/pdfium" ]
+    }
+  }
+
   jumbo_static_library("pdf") {
+    configs += [ ":pdf_common_config" ]
     deps = [
       "//base",
       "//gin",
@@ -65,9 +77,6 @@
       "url_loader_wrapper_impl.h",
     ]
 
-    include_dirs = []
-    defines = []
-
     if (pdf_engine == 0) {
       deps += [
         "//pdf/pdfium/fuzzers",
@@ -100,28 +109,12 @@
         "pdfium/pdfium_unsupported_features.cc",
         "pdfium/pdfium_unsupported_features.h",
       ]
-
-      include_dirs += [ "//third_party/pdfium" ]
-
-      defines += [ "PDFIUM_PRINT_TEXT_WITH_GDI" ]
-      if (pdf_enable_xfa) {
-        defines += [ "PDF_ENABLE_XFA" ]
-      }
     }
   }
 
-  source_set("pdf_test_utils") {
-    testonly = true
-    sources = [
-      "test/test_client.cc",
-      "test/test_client.h",
-      "test/test_document_loader.cc",
-      "test/test_document_loader.h",
-    ]
-  }
-
   test("pdf_unittests") {
     testonly = true
+    configs += [ ":pdf_common_config" ]
     sources = [
       "chunk_stream_unittest.cc",
       "document_loader_impl_unittest.cc",
@@ -132,7 +125,6 @@
 
     deps = [
       ":pdf",
-      ":pdf_test_utils",
       "//base",
       "//base/test:test_support",
       "//ppapi/c",
@@ -152,10 +144,7 @@
         "pdfium/findtext_unittest.cc",
         "pdfium/pdfium_engine_exports_unittest.cc",
         "pdfium/pdfium_print_unittest.cc",
-        "pdfium/pdfium_test_base.cc",
-        "pdfium/pdfium_test_base.h",
       ]
-      include_dirs = [ "//third_party/pdfium" ]
 
       if (v8_use_external_startup_data) {
         data += [
diff --git a/pdf/pdfium/findtext_unittest.cc b/pdf/pdfium/findtext_unittest.cc
index af3e34ea..068c62a 100644
--- a/pdf/pdfium/findtext_unittest.cc
+++ b/pdf/pdfium/findtext_unittest.cc
@@ -2,11 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/files/file_util.h"
 #include "base/optional.h"
+#include "base/path_service.h"
+#include "pdf/document_loader.h"
 #include "pdf/pdfium/pdfium_engine.h"
-#include "pdf/pdfium/pdfium_test_base.h"
-#include "pdf/test/test_client.h"
+#include "pdf/url_loader_wrapper.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 using testing::InSequence;
 using testing::_;
@@ -15,15 +18,82 @@
 
 namespace {
 
-class FindTextTestClient : public TestClient {
+class TestDocumentLoader : public DocumentLoader {
  public:
-  FindTextTestClient() = default;
-  ~FindTextTestClient() override = default;
+  TestDocumentLoader(Client* client, const base::FilePath::StringType& pdf_name)
+      : client_(client) {
+    base::FilePath pdf_path;
+    CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &pdf_path));
+    pdf_path = pdf_path.Append(FILE_PATH_LITERAL("pdf"))
+                   .Append(FILE_PATH_LITERAL("test"))
+                   .Append(FILE_PATH_LITERAL("data"))
+                   .Append(pdf_name);
+    CHECK(base::ReadFileToString(pdf_path, &pdf_data_));
+  }
+  ~TestDocumentLoader() override = default;
+
+  // DocumentLoader:
+  bool Init(std::unique_ptr<URLLoaderWrapper> loader,
+            const std::string& url) override {
+    NOTREACHED();
+    return false;
+  }
+
+  bool GetBlock(uint32_t position, uint32_t size, void* buf) const override {
+    if (!IsDataAvailable(position, size))
+      return false;
+
+    memcpy(buf, pdf_data_.data() + position, size);
+    return true;
+  }
+
+  bool IsDataAvailable(uint32_t position, uint32_t size) const override {
+    return position < pdf_data_.size() && size <= pdf_data_.size() &&
+           position + size <= pdf_data_.size();
+  }
+
+  void RequestData(uint32_t position, uint32_t size) override {
+    client_->OnDocumentComplete();
+  }
+
+  bool IsDocumentComplete() const override { return true; }
+
+  uint32_t GetDocumentSize() const override { return pdf_data_.size(); }
+
+  uint32_t BytesReceived() const override { return pdf_data_.size(); }
+
+ private:
+  Client* const client_;
+  std::string pdf_data_;
+};
+
+const base::FilePath::CharType* g_test_pdf_name;
+
+std::unique_ptr<DocumentLoader> CreateTestDocumentLoader(
+    DocumentLoader::Client* client) {
+  return std::make_unique<TestDocumentLoader>(client, g_test_pdf_name);
+}
+
+class TestClient : public PDFEngine::Client {
+ public:
+  TestClient() = default;
+  ~TestClient() override = default;
 
   // PDFEngine::Client:
   MOCK_METHOD2(NotifyNumberOfFindResultsChanged, void(int, bool));
   MOCK_METHOD1(NotifySelectedFindResultChanged, void((int)));
 
+  bool Confirm(const std::string& message) override { return false; }
+
+  std::string Prompt(const std::string& question,
+                     const std::string& default_answer) override {
+    return std::string();
+  }
+
+  std::string GetURL() override { return std::string(); }
+
+  pp::URLLoader CreateURLLoader() override { return pp::URLLoader(); }
+
   std::vector<SearchStringResult> SearchString(const base::char16* string,
                                                const base::char16* term,
                                                bool case_sensitive) override {
@@ -48,18 +118,59 @@
     return results;
   }
 
+  pp::Instance* GetPluginInstance() override { return nullptr; }
+
+  bool IsPrintPreview() override { return false; }
+
+  uint32_t GetBackgroundColor() override { return 0; }
+
+  float GetToolbarHeightInScreenCoords() override { return 0; }
+
  private:
-  DISALLOW_COPY_AND_ASSIGN(FindTextTestClient);
+  DISALLOW_COPY_AND_ASSIGN(TestClient);
 };
 
 }  // namespace
 
-using FindTextTest = PDFiumTestBase;
+class FindTextTest : public testing::Test {
+ public:
+  FindTextTest() = default;
+  ~FindTextTest() override = default;
+
+ protected:
+  void SetUp() override {
+    InitializePDFium();
+  }
+
+  void TearDown() override {
+    PDFiumEngine::SetCreateDocumentLoaderFunctionForTesting(nullptr);
+    g_test_pdf_name = nullptr;
+    FPDF_DestroyLibrary();
+  }
+
+  void InitializePDFium() {
+    FPDF_LIBRARY_CONFIG config;
+    config.version = 2;
+    config.m_pUserFontPaths = nullptr;
+    config.m_pIsolate = nullptr;
+    config.m_v8EmbedderSlot = 0;
+    FPDF_InitLibraryWithConfig(&config);
+  }
+
+  void SetDocumentForTest(const base::FilePath::CharType* test_pdf_name) {
+    g_test_pdf_name = test_pdf_name;
+    PDFiumEngine::SetCreateDocumentLoaderFunctionForTesting(
+        &CreateTestDocumentLoader);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FindTextTest);
+};
 
 TEST_F(FindTextTest, FindText) {
   SetDocumentForTest(FILE_PATH_LITERAL("hello_world2.pdf"));
   pp::URLLoader dummy_loader;
-  FindTextTestClient client;
+  TestClient client;
   PDFiumEngine engine(&client, true);
   ASSERT_TRUE(engine.New("https://chromium.org/dummy.pdf", ""));
   ASSERT_TRUE(engine.HandleDocumentLoad(dummy_loader));
@@ -80,7 +191,7 @@
 TEST_F(FindTextTest, FindHyphenatedText) {
   SetDocumentForTest(FILE_PATH_LITERAL("spanner.pdf"));
   pp::URLLoader dummy_loader;
-  FindTextTestClient client;
+  TestClient client;
   PDFiumEngine engine(&client, true);
   ASSERT_TRUE(engine.New("https://chromium.org/dummy.pdf", ""));
   ASSERT_TRUE(engine.HandleDocumentLoad(dummy_loader));
@@ -97,5 +208,4 @@
 
   engine.StartFind("application", /*case_sensitive=*/true);
 }
-
 }  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_test_base.cc b/pdf/pdfium/pdfium_test_base.cc
deleted file mode 100644
index 87f4706..0000000
--- a/pdf/pdfium/pdfium_test_base.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "pdf/pdfium/pdfium_test_base.h"
-
-#include <memory>
-
-#include "pdf/pdfium/pdfium_engine.h"
-#include "pdf/test/test_document_loader.h"
-
-namespace chrome_pdf {
-
-namespace {
-
-const base::FilePath::CharType* g_test_pdf_name;
-
-std::unique_ptr<DocumentLoader> CreateTestDocumentLoader(
-    DocumentLoader::Client* client) {
-  return std::make_unique<TestDocumentLoader>(client, g_test_pdf_name);
-}
-
-}  // namespace
-
-PDFiumTestBase::PDFiumTestBase() = default;
-
-PDFiumTestBase::~PDFiumTestBase() = default;
-
-void PDFiumTestBase::SetUp() {
-  InitializePDFium();
-}
-
-void PDFiumTestBase::TearDown() {
-  PDFiumEngine::SetCreateDocumentLoaderFunctionForTesting(nullptr);
-  g_test_pdf_name = nullptr;
-  FPDF_DestroyLibrary();
-}
-
-void PDFiumTestBase::SetDocumentForTest(
-    const base::FilePath::CharType* pdf_name) {
-  DCHECK(!g_test_pdf_name);
-  g_test_pdf_name = pdf_name;
-  PDFiumEngine::SetCreateDocumentLoaderFunctionForTesting(
-      &CreateTestDocumentLoader);
-}
-
-void PDFiumTestBase::InitializePDFium() {
-  FPDF_LIBRARY_CONFIG config;
-  config.version = 2;
-  config.m_pUserFontPaths = nullptr;
-  config.m_pIsolate = nullptr;
-  config.m_v8EmbedderSlot = 0;
-  FPDF_InitLibraryWithConfig(&config);
-}
-
-}  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_test_base.h b/pdf/pdfium/pdfium_test_base.h
deleted file mode 100644
index 90a1447..0000000
--- a/pdf/pdfium/pdfium_test_base.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PDF_PDFIUM_PDFIUM_TEST_BASE_H_
-#define PDF_PDFIUM_PDFIUM_TEST_BASE_H_
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace chrome_pdf {
-
-class PDFiumTestBase : public testing::Test {
- public:
-  PDFiumTestBase();
-  ~PDFiumTestBase() override;
-
- protected:
-  // testing::Test:
-  void SetUp() override;
-  void TearDown() override;
-
-  // Sets the PDF to load for a test. This must be called for tests that use
-  // TestDocumentLoader. See TestDocumentLoader for more info.
-  void SetDocumentForTest(const base::FilePath::CharType* pdf_name);
-
- private:
-  void InitializePDFium();
-
-  DISALLOW_COPY_AND_ASSIGN(PDFiumTestBase);
-};
-
-}  // namespace chrome_pdf
-
-#endif  // PDF_PDFIUM_PDFIUM_TEST_BASE_H_
diff --git a/pdf/test/test_client.cc b/pdf/test/test_client.cc
deleted file mode 100644
index c3f7118..0000000
--- a/pdf/test/test_client.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "pdf/test/test_client.h"
-
-namespace chrome_pdf {
-
-TestClient::TestClient() = default;
-
-TestClient::~TestClient() = default;
-
-bool TestClient::Confirm(const std::string& message) {
-  return false;
-}
-
-std::string TestClient::Prompt(const std::string& question,
-                               const std::string& default_answer) {
-  return std::string();
-}
-
-std::string TestClient::GetURL() {
-  return std::string();
-}
-
-pp::URLLoader TestClient::CreateURLLoader() {
-  return pp::URLLoader();
-}
-
-pp::Instance* TestClient::GetPluginInstance() {
-  return nullptr;
-}
-
-bool TestClient::IsPrintPreview() {
-  return false;
-}
-
-uint32_t TestClient::GetBackgroundColor() {
-  return 0;
-}
-
-float TestClient::GetToolbarHeightInScreenCoords() {
-  return 0;
-}
-
-}  // namespace chrome_pdf
diff --git a/pdf/test/test_client.h b/pdf/test/test_client.h
deleted file mode 100644
index 0540879..0000000
--- a/pdf/test/test_client.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PDF_TEST_TEST_CLIENT_H_
-#define PDF_TEST_TEST_CLIENT_H_
-
-#include <string>
-
-#include "pdf/pdf_engine.h"
-
-namespace chrome_pdf {
-
-class TestClient : public PDFEngine::Client {
- public:
-  TestClient();
-  ~TestClient() override;
-
-  // PDFEngine::Client:
-  bool Confirm(const std::string& message) override;
-  std::string Prompt(const std::string& question,
-                     const std::string& default_answer) override;
-  std::string GetURL() override;
-  pp::URLLoader CreateURLLoader() override;
-  pp::Instance* GetPluginInstance() override;
-  bool IsPrintPreview() override;
-  uint32_t GetBackgroundColor() override;
-  float GetToolbarHeightInScreenCoords() override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestClient);
-};
-
-}  // namespace chrome_pdf
-
-#endif  // PDF_TEST_TEST_CLIENT_H_
diff --git a/pdf/test/test_document_loader.cc b/pdf/test/test_document_loader.cc
deleted file mode 100644
index 6a7bc5c..0000000
--- a/pdf/test/test_document_loader.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "pdf/test/test_document_loader.h"
-
-#include "base/base_paths.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "pdf/url_loader_wrapper.h"
-
-namespace chrome_pdf {
-
-TestDocumentLoader::TestDocumentLoader(
-    Client* client,
-    const base::FilePath::StringType& pdf_name)
-    : client_(client) {
-  base::FilePath pdf_path;
-  CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &pdf_path));
-  pdf_path = pdf_path.Append(FILE_PATH_LITERAL("pdf"))
-                 .Append(FILE_PATH_LITERAL("test"))
-                 .Append(FILE_PATH_LITERAL("data"))
-                 .Append(pdf_name);
-  CHECK(base::ReadFileToString(pdf_path, &pdf_data_));
-}
-
-TestDocumentLoader::~TestDocumentLoader() = default;
-
-bool TestDocumentLoader::Init(std::unique_ptr<URLLoaderWrapper> loader,
-                              const std::string& url) {
-  NOTREACHED();
-  return false;
-}
-
-bool TestDocumentLoader::GetBlock(uint32_t position,
-                                  uint32_t size,
-                                  void* buf) const {
-  if (!IsDataAvailable(position, size))
-    return false;
-
-  memcpy(buf, pdf_data_.data() + position, size);
-  return true;
-}
-
-bool TestDocumentLoader::IsDataAvailable(uint32_t position,
-                                         uint32_t size) const {
-  return position < pdf_data_.size() && size <= pdf_data_.size() &&
-         position + size <= pdf_data_.size();
-}
-
-void TestDocumentLoader::RequestData(uint32_t position, uint32_t size) {
-  client_->OnDocumentComplete();
-}
-
-bool TestDocumentLoader::IsDocumentComplete() const {
-  return true;
-}
-
-uint32_t TestDocumentLoader::GetDocumentSize() const {
-  return pdf_data_.size();
-}
-
-uint32_t TestDocumentLoader::BytesReceived() const {
-  return pdf_data_.size();
-}
-
-}  // namespace chrome_pdf
diff --git a/pdf/test/test_document_loader.h b/pdf/test/test_document_loader.h
deleted file mode 100644
index 4068c9da..0000000
--- a/pdf/test/test_document_loader.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef PDF_TEST_TEST_DOCUMENT_LOADER_H_
-#define PDF_TEST_TEST_DOCUMENT_LOADER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/files/file_path.h"
-#include "pdf/document_loader.h"
-
-namespace chrome_pdf {
-
-// Loads test PDFs from pdf/test/data.
-class TestDocumentLoader : public DocumentLoader {
- public:
-  // |pdf_name| is the base name for a PDF file.
-  TestDocumentLoader(Client* client,
-                     const base::FilePath::StringType& pdf_name);
-  ~TestDocumentLoader() override;
-
-  // DocumentLoader:
-  bool Init(std::unique_ptr<URLLoaderWrapper> loader,
-            const std::string& url) override;
-  bool GetBlock(uint32_t position, uint32_t size, void* buf) const override;
-  bool IsDataAvailable(uint32_t position, uint32_t size) const override;
-  void RequestData(uint32_t position, uint32_t size) override;
-  bool IsDocumentComplete() const override;
-  uint32_t GetDocumentSize() const override;
-  uint32_t BytesReceived() const override;
-
- private:
-  Client* const client_;
-  std::string pdf_data_;
-};
-
-}  // namespace chrome_pdf
-
-#endif  // PDF_TEST_TEST_DOCUMENT_LOADER_H_
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 2db1d9b..0756763b 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -330,28 +330,6 @@
   DISALLOW_COPY_AND_ASSIGN(SimulatedCacheInterceptor);
 };
 
-class RequestInterceptor : public net::URLRequestInterceptor {
- public:
-  using InterceptCallback = base::Callback<void(net::URLRequest*)>;
-
-  explicit RequestInterceptor(const InterceptCallback& callback)
-      : callback_(callback) {}
-  ~RequestInterceptor() override {}
-
-  // URLRequestInterceptor implementation:
-  net::URLRequestJob* MaybeInterceptRequest(
-      net::URLRequest* request,
-      net::NetworkDelegate* network_delegate) const override {
-    callback_.Run(request);
-    return nullptr;
-  }
-
- private:
-  InterceptCallback callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestInterceptor);
-};
-
 // Returns whether monitoring was successfully set up. If yes,
 // StopMonitorBodyReadFromNetBeforePausedHistogram() needs to be called later to
 // stop monitoring.
@@ -541,15 +519,6 @@
     EXPECT_EQ(actual_body, expected_body);
   }
 
-  // Adds an interceptor that can examine the URLRequest object.
-  void AddRequestObserver(
-      const GURL& url,
-      const RequestInterceptor::InterceptCallback& callback) {
-    net::URLRequestFilter::GetInstance()->AddUrlInterceptor(
-        url, std::unique_ptr<net::URLRequestInterceptor>(
-                 new RequestInterceptor(callback)));
-  }
-
   net::EmbeddedTestServer* test_server() { return &test_server_; }
   net::URLRequestContext* context() { return context_.get(); }
   TestURLLoaderClient* client() { return &client_; }
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc
index 9103809e..46c0522 100644
--- a/storage/browser/quota/quota_database.cc
+++ b/storage/browser/quota/quota_database.cc
@@ -13,7 +13,6 @@
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "sql/database.h"
@@ -564,8 +563,8 @@
 }
 
 bool QuotaDatabase::EnsureDatabaseVersion() {
-  static const size_t kTableCount = arraysize(kTables);
-  static const size_t kIndexCount = arraysize(kIndexes);
+  static const size_t kTableCount = base::size(kTables);
+  static const size_t kIndexCount = base::size(kIndexes);
   if (!sql::MetaTable::DoesTableExist(db_.get()))
     return CreateSchema(db_.get(), meta_table_.get(),
                         kQuotaDatabaseCurrentSchemaVersion,
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc
index ff4774d..0e2e5a5 100644
--- a/storage/browser/quota/quota_database_unittest.cc
+++ b/storage/browser/quota/quota_database_unittest.cc
@@ -13,8 +13,8 @@
 #include "base/callback.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
 #include "base/message_loop/message_loop.h"
+#include "base/stl_util.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
 #include "sql/statement.h"
@@ -68,14 +68,14 @@
         QuotaTableEntry("c", kPersistent, 3),
     };
 
-    CreateV2Database(kDbFile, entries, arraysize(entries));
+    CreateV2Database(kDbFile, entries, base::size(entries));
 
     QuotaDatabase db(kDbFile);
     EXPECT_TRUE(db.LazyOpen(true));
     EXPECT_TRUE(db.db_.get());
 
     using Verifier = EntryVerifier<QuotaTableEntry>;
-    Verifier verifier(entries, entries + arraysize(entries));
+    Verifier verifier(entries, entries + base::size(entries));
     EXPECT_TRUE(db.DumpQuotaTable(
         base::BindRepeating(&Verifier::Run, base::Unretained(&verifier))));
     EXPECT_TRUE(verifier.table.empty());
@@ -354,7 +354,7 @@
       GURL("http://a/"),
       GURL("http://b/"),
       GURL("http://c/") };
-    std::set<GURL> origins(kOrigins, kOrigins + arraysize(kOrigins));
+    std::set<GURL> origins(kOrigins, kOrigins + base::size(kOrigins));
 
     EXPECT_TRUE(db.RegisterInitialOriginInfo(origins, kTemporary));
 
@@ -396,7 +396,7 @@
         QuotaTableEntry("http://oo/", kTemporary, 2),
         QuotaTableEntry("http://gle/", kPersistent, 3)};
     QuotaTableEntry* begin = kTableEntries;
-    QuotaTableEntry* end = kTableEntries + arraysize(kTableEntries);
+    QuotaTableEntry* end = kTableEntries + base::size(kTableEntries);
 
     QuotaDatabase db(kDbFile);
     EXPECT_TRUE(db.LazyOpen(true));
@@ -419,7 +419,7 @@
         Entry(GURL("http://gle/"), kTemporary, 1, now, now),
     };
     Entry* begin = kTableEntries;
-    Entry* end = kTableEntries + arraysize(kTableEntries);
+    Entry* end = kTableEntries + base::size(kTableEntries);
 
     QuotaDatabase db(kDbFile);
     EXPECT_TRUE(db.LazyOpen(true));
@@ -439,7 +439,7 @@
     Entry kTableEntries[] = {
         Entry(kOrigin, kTemporary, 100, base::Time(), base::Time())};
     Entry* begin = kTableEntries;
-    Entry* end = kTableEntries + arraysize(kTableEntries);
+    Entry* end = kTableEntries + base::size(kTableEntries);
 
     QuotaDatabase db(kDbFile);
     EXPECT_TRUE(db.LazyOpen(true));
@@ -555,10 +555,8 @@
 
     ASSERT_TRUE(OpenDatabase(db.get(), kDbFile));
     EXPECT_TRUE(QuotaDatabase::CreateSchema(
-            db.get(), meta_table.get(),
-            kCurrentVersion, kCompatibleVersion,
-            kTables, arraysize(kTables),
-            kIndexes, arraysize(kIndexes)));
+        db.get(), meta_table.get(), kCurrentVersion, kCompatibleVersion,
+        kTables, base::size(kTables), kIndexes, base::size(kIndexes)));
 
     // V2 and V3 QuotaTable are compatible, so we can simply use
     // AssignQuotaTable to poplulate v2 database here.
diff --git a/storage/browser/quota/quota_manager_unittest.cc b/storage/browser/quota/quota_manager_unittest.cc
index 174a262..d5e4f22 100644
--- a/storage/browser/quota/quota_manager_unittest.cc
+++ b/storage/browser/quota/quota_manager_unittest.cc
@@ -526,10 +526,10 @@
     { "http://bar.com/",       kPerm,  40 },
     { "http://example.com/",   kPerm,  40 },
   };
-  RegisterClient(CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem));
-  RegisterClient(CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kDatabase));
+  RegisterClient(
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase));
 
   GetUsageInfo();
   scoped_task_environment_.RunUntilIdle();
@@ -557,8 +557,8 @@
     { "http://foo.com/", kTemp, 10 },
     { "http://foo.com/", kPerm, 80 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
   scoped_task_environment_.RunUntilIdle();
@@ -650,8 +650,8 @@
     { "http://baz.com/",        kTemp,  30 },
     { "http://foo.com/",        kPerm,  40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   // This time explicitly sets a temporary global quota.
   const int kPoolSize = 100;
@@ -687,10 +687,10 @@
     { "http://unlimited/",            kTemp, 512 },
   };
   mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
-  RegisterClient(CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem));
-  RegisterClient(CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kDatabase));
+  RegisterClient(
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase));
 
   const int64_t kPoolSize = GetAvailableDiskSpaceForTest();
   const int64_t kPerHostQuota = kPoolSize / 5;
@@ -745,11 +745,11 @@
       {"http://foo.com/", kTemp, 8},
   };
   MockStorageClient* client1 =
-      CreateClient(kData1, arraysize(kData1), QuotaClient::kFileSystem);
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
   MockStorageClient* client2 =
-      CreateClient(kData2, arraysize(kData2), QuotaClient::kDatabase);
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase);
   MockStorageClient* client3 =
-      CreateClient(kData3, arraysize(kData3), QuotaClient::kAppcache);
+      CreateClient(kData3, base::size(kData3), QuotaClient::kAppcache);
   RegisterClient(client1);
   RegisterClient(client2);
   RegisterClient(client3);
@@ -816,7 +816,7 @@
       {"http://baz.com/", kTemp, 30}, {"http://foo.com/", kPerm, 40},
   };
   RegisterClient(
-      CreateClient(kData, arraysize(kData), QuotaClient::kFileSystem));
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   GetUsageAndQuotaWithBreakdown(GURL("http://foo.com/"), kTemp);
   scoped_task_environment_.RunUntilIdle();
@@ -848,9 +848,9 @@
   };
   mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
   RegisterClient(
-      CreateClient(kData1, arraysize(kData1), QuotaClient::kFileSystem));
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem));
   RegisterClient(
-      CreateClient(kData2, arraysize(kData2), QuotaClient::kDatabase));
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase));
 
   GetUsageAndQuotaWithBreakdown(GURL("http://foo.com/"), kTemp);
   scoped_task_environment_.RunUntilIdle();
@@ -890,8 +890,8 @@
     { "http://foo.com/",   type,  10 },
     { "http://foo.com:1/", type,  20 },
   };
-  MockStorageClient* client = CreateClient(data, arraysize(data),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(data, base::size(data), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), type);
@@ -932,8 +932,8 @@
     { "http://bar.com/",        kTemp, 13 },
     { "http://foo.com/",        kPerm, 40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   const int kPoolSize = 100;
   const int kPerHostQuota = 20;
@@ -966,8 +966,8 @@
     { "http://bar.com/",        kTemp, 13 },
     { "http://foo.com/",        kPerm, 40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
   const int kPoolSize = 100;
   const int kPerHostQuota = 20;
   SetQuotaSettings(kPoolSize, kPerHostQuota, kMustRemainAvailableForSystem);
@@ -994,8 +994,8 @@
     { "http://usage10/",   kTemp,  10 },
     { "http://usage200/",  kTemp, 200 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
   const int kPoolSize = 100;
   const int kPerHostQuota = 20;
   SetQuotaSettings(kPoolSize, kPerHostQuota, kMustRemainAvailableForSystem);
@@ -1033,8 +1033,8 @@
     { "http://unlimited/", kTemp,  4000 },
   };
   mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   // Test when not overbugdet.
@@ -1240,8 +1240,8 @@
     { "http://baz.com/",        kPerm, 30 },
     { "http://foo.com/",        kTemp, 40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   SetPersistentHostQuota("foo.com", 100);
   GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
@@ -1262,8 +1262,8 @@
     { "http://bar.com/",        kPerm,  13 },
     { "http://foo.com/",        kTemp,  40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
   SetPersistentHostQuota("foo.com", 100);
 
   GetUsageAndQuotaForWebApps(GURL("http://foo.com/"), kPerm);
@@ -1292,8 +1292,8 @@
     { "http://bar.com/",        kPerm,  13 },
     { "http://foo.com/",        kTemp,  40 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
   SetPersistentHostQuota("foo.com", 100);
 
   set_additional_callback_count(0);
@@ -1317,8 +1317,8 @@
     { "http://bar.com:1/", kPerm,  600000 },
     { "http://foo.com/",   kTemp, 7000000 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   GetGlobalUsage(kPerm);
   scoped_task_environment_.RunUntilIdle();
@@ -1350,8 +1350,8 @@
     { "http://foo.com/",   kTemp, 7000000 },
   };
 
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetGlobalUsage(kPerm);
@@ -1396,8 +1396,8 @@
     { "http://foo.com/",   kPerm,   300 },
     { "http://bar.com/",   kTemp,  4000 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetGlobalUsage(kTemp);
@@ -1451,10 +1451,10 @@
     { "https://foo.com/",  kTemp,    80 },
     { "http://bar.com/",   kTemp,     9 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
 
@@ -1470,10 +1470,10 @@
   scoped_task_environment_.RunUntilIdle();
   int64_t predelete_host_pers = usage();
 
-  for (size_t i = 0; i < arraysize(kData1); ++i)
+  for (size_t i = 0; i < base::size(kData1); ++i)
     quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
         GURL(kData1[i].origin), kData1[i].type);
-  for (size_t i = 0; i < arraysize(kData2); ++i)
+  for (size_t i = 0; i < base::size(kData2); ++i)
     quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
         GURL(kData2[i].origin), kData2[i].type);
   scoped_task_environment_.RunUntilIdle();
@@ -1510,7 +1510,7 @@
 
   base::HistogramTester histograms;
   MockStorageClient* client =
-      CreateClient(kData, arraysize(kData), QuotaClient::kFileSystem);
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetGlobalUsage(kTemp);
@@ -1576,8 +1576,8 @@
     { "http://bar.com/",   kTemp,    4000 },
   };
   static const int kNumberOfTemporaryOrigins = 3;
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetGlobalUsage(kTemp);
@@ -1592,7 +1592,7 @@
   scoped_task_environment_.RunUntilIdle();
   int64_t predelete_host_pers = usage();
 
-  for (size_t i = 0; i < arraysize(kData); ++i)
+  for (size_t i = 0; i < base::size(kData); ++i)
     NotifyStorageAccessed(client, GURL(kData[i].origin), kData[i].type);
   scoped_task_environment_.RunUntilIdle();
 
@@ -1658,8 +1658,8 @@
   };
 
   mock_special_storage_policy()->AddUnlimited(GURL("http://unlimited/"));
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   const int kPoolSize = 10000000;
@@ -1678,8 +1678,8 @@
   static const MockOriginData kData[] = {
     { "http://foo.com/",   kTemp,     1 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetGlobalUsage(kTemp);
@@ -1741,10 +1741,10 @@
     { "https://foo.com/",  kTemp,    80 },
     { "http://bar.com/",   kTemp,     9 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
 
@@ -1827,10 +1827,10 @@
     { "https://foo.com/",  kTemp,    80 },
     { "http://bar.com/",   kTemp,     9 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
 
@@ -1854,10 +1854,10 @@
   scoped_task_environment_.RunUntilIdle();
   const int64_t predelete_bar_pers = usage();
 
-  for (size_t i = 0; i < arraysize(kData1); ++i)
+  for (size_t i = 0; i < base::size(kData1); ++i)
     quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
         GURL(kData1[i].origin), kData1[i].type);
-  for (size_t i = 0; i < arraysize(kData2); ++i)
+  for (size_t i = 0; i < base::size(kData2); ++i)
     quota_manager()->NotifyStorageAccessed(QuotaClient::kUnknown,
         GURL(kData2[i].origin), kData2[i].type);
   scoped_task_environment_.RunUntilIdle();
@@ -1909,8 +1909,8 @@
     { "http://b.com/",   kPerm,     300 },
     { "http://c.com/",   kTemp,    4000 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   // TODO(kinuko): Be careful when we add cache pruner.
@@ -1942,7 +1942,7 @@
   GetCachedOrigins(kTemp, &origins);
   EXPECT_EQ(3U, origins.size());
 
-  for (size_t i = 0; i < arraysize(kData); ++i) {
+  for (size_t i = 0; i < base::size(kData); ++i) {
     if (kData[i].type == kTemp)
       EXPECT_TRUE(base::ContainsKey(origins, GURL(kData[i].origin)));
   }
@@ -1956,8 +1956,8 @@
     { "http://b.com/",   kPerm,  0 },  // persistent
     { "http://c.com/",   kTemp,  0 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GURL origin;
@@ -1996,8 +1996,8 @@
     { "http://b.com/",   kPerm,  0 },  // persistent
     { "http://c.com/",   kTemp,  0 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GURL origin;
@@ -2051,8 +2051,8 @@
     { "http://b.com/",   kPerm,  0 },  // persistent
     { "http://c.com/",   kTemp,  0 },
   };
-  MockStorageClient* client = CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem);
+  MockStorageClient* client =
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem);
   RegisterClient(client);
 
   GetOriginsModifiedSince(kTemp, base::Time());
@@ -2073,7 +2073,7 @@
   scoped_task_environment_.RunUntilIdle();
   EXPECT_EQ(4U, modified_origins().size());
   EXPECT_EQ(modified_origins_type(), kTemp);
-  for (size_t i = 0; i < arraysize(kData); ++i) {
+  for (size_t i = 0; i < base::size(kData); ++i) {
     if (kData[i].type == kTemp)
       EXPECT_EQ(1U, modified_origins().count(GURL(kData[i].origin)));
   }
@@ -2110,7 +2110,7 @@
     QuotaTableEntry("example2.com", kPerm, 20),
     QuotaTableEntry("example3.com", kPerm, 300),
   };
-  std::set<QuotaTableEntry> entries(kEntries, kEntries + arraysize(kEntries));
+  std::set<QuotaTableEntry> entries(kEntries, kEntries + base::size(kEntries));
 
   for (const auto& quota_entry : quota_entries()) {
     SCOPED_TRACE(testing::Message() << "host = " << quota_entry.host << ", "
@@ -2146,7 +2146,7 @@
     make_pair(make_pair(GURL("http://example.com/"), kTemp), 1),
     make_pair(make_pair(GURL("http://example.com/"), kPerm), 2),
   };
-  std::set<Entry> entries(kEntries, kEntries + arraysize(kEntries));
+  std::set<Entry> entries(kEntries, kEntries + base::size(kEntries));
 
   for (const auto& origin_info : origin_info_entries()) {
     SCOPED_TRACE(testing::Message()
@@ -2184,14 +2184,14 @@
   static const MockOriginData kData4[] = {
     { "http://foo.com/",   kTemp, 8 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kAppcache);
-  MockStorageClient* client3 = CreateClient(kData3, arraysize(kData3),
-      QuotaClient::kDatabase);
-  MockStorageClient* client4 = CreateClient(kData4, arraysize(kData4),
-      QuotaClient::kIndexedDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kAppcache);
+  MockStorageClient* client3 =
+      CreateClient(kData3, base::size(kData3), QuotaClient::kDatabase);
+  MockStorageClient* client4 =
+      CreateClient(kData4, base::size(kData4), QuotaClient::kIndexedDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
   RegisterClient(client3);
@@ -2240,14 +2240,14 @@
   static const MockOriginData kData4[] = {
     { "http://foo.com:4444/",   kTemp, 8 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kAppcache);
-  MockStorageClient* client3 = CreateClient(kData3, arraysize(kData3),
-      QuotaClient::kDatabase);
-  MockStorageClient* client4 = CreateClient(kData4, arraysize(kData4),
-      QuotaClient::kIndexedDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kAppcache);
+  MockStorageClient* client3 =
+      CreateClient(kData3, base::size(kData3), QuotaClient::kDatabase);
+  MockStorageClient* client4 =
+      CreateClient(kData4, base::size(kData4), QuotaClient::kIndexedDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
   RegisterClient(client3);
@@ -2295,14 +2295,14 @@
   static const MockOriginData kData4[] = {
     { "http://foo.com/",   kTemp, 8 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kAppcache);
-  MockStorageClient* client3 = CreateClient(kData3, arraysize(kData3),
-      QuotaClient::kDatabase);
-  MockStorageClient* client4 = CreateClient(kData4, arraysize(kData4),
-      QuotaClient::kIndexedDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kAppcache);
+  MockStorageClient* client3 =
+      CreateClient(kData3, base::size(kData3), QuotaClient::kDatabase);
+  MockStorageClient* client4 =
+      CreateClient(kData4, base::size(kData4), QuotaClient::kIndexedDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
   RegisterClient(client3);
@@ -2340,14 +2340,14 @@
   static const MockOriginData kData4[] = {
     { "http://foo.com:4444/",   kTemp, 8 },
   };
-  MockStorageClient* client1 = CreateClient(kData1, arraysize(kData1),
-      QuotaClient::kFileSystem);
-  MockStorageClient* client2 = CreateClient(kData2, arraysize(kData2),
-      QuotaClient::kAppcache);
-  MockStorageClient* client3 = CreateClient(kData3, arraysize(kData3),
-      QuotaClient::kDatabase);
-  MockStorageClient* client4 = CreateClient(kData4, arraysize(kData4),
-      QuotaClient::kIndexedDatabase);
+  MockStorageClient* client1 =
+      CreateClient(kData1, base::size(kData1), QuotaClient::kFileSystem);
+  MockStorageClient* client2 =
+      CreateClient(kData2, base::size(kData2), QuotaClient::kAppcache);
+  MockStorageClient* client3 =
+      CreateClient(kData3, base::size(kData3), QuotaClient::kDatabase);
+  MockStorageClient* client4 =
+      CreateClient(kData4, base::size(kData4), QuotaClient::kIndexedDatabase);
   RegisterClient(client1);
   RegisterClient(client2);
   RegisterClient(client3);
@@ -2379,8 +2379,8 @@
     { "http://foo.com/", kTemp, 10 },
     { "http://foo.com/", kPerm, 80 },
   };
-  RegisterClient(CreateClient(kData, arraysize(kData),
-      QuotaClient::kFileSystem));
+  RegisterClient(
+      CreateClient(kData, base::size(kData), QuotaClient::kFileSystem));
 
   // Query global usage to warmup the usage tracker caching.
   GetGlobalUsage(kTemp);
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 6888ca4..8112e9a 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -4261,6 +4261,20 @@
       },
       {
         "args": [
+          "--enable-features=SingleProcessMash",
+          "--override-use-software-gl-for-tests",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter",
+          "--test-launcher-print-test-stdio=always"
+        ],
+        "name": "single_process_mash_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 30
+        },
+        "test": "browser_tests"
+      },
+      {
+        "args": [
           "--enable-features=VizDisplayCompositor",
           "--test-launcher-print-test-stdio=always"
         ],
diff --git a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
index e87e7b9..e31a8f2a 100644
--- a/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
+++ b/testing/buildbot/filters/chromeos.single_process_mash.browser_tests.filter
@@ -210,6 +210,9 @@
 -MediaEngagementBrowserTest.*
 -MediaEngagementAutoplayBrowserTest.*
 
+# Flaky https://crbug.com/887175
+-PrerenderBrowserTest.PrerenderHTML5VideoJs
+
 # Full screen button tests.
 -PresentationReceiverWindowViewBrowserTest.ChromeOSHardwareFullscreenButton
 
diff --git a/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter b/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter
index 1a14f113..dc367ea 100644
--- a/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter
+++ b/testing/buildbot/filters/mac_window_server_killers.browser_tests.filter
@@ -132,7 +132,7 @@
 -NaClBrowserTestNewlib.*
 -NaClBrowserTestPnacl.*
 -Native/ExtensionBindingsApiTest.*
--NativeAppWindowCocoaBrowserTestInstance/NativeAppWindowCocoaBrowserTest.*
+-NativeAppWindowCocoaBrowserTest.*
 -NativeBindings/ExternallyConnectableMessagingTest.*
 -NavigationEntryRemoverTest.*
 -NetInternalsTest.*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 69838916..5a60e28 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -958,10 +958,6 @@
     ],
   },
   'single_process_mash_browser_tests': {
-    'remove_from': [
-      # Temporarily remove from ASan/LSan bot due to flakiness. crbug.com/885309
-      'Linux Chromium OS ASan LSan Tests (1)',
-    ],
     'modifications': {
       # chromium.chromiumos
       'linux-chromeos-dbg': {
diff --git a/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc b/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc
index 1545f76..b2e79b3 100644
--- a/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc
+++ b/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc
@@ -31,7 +31,10 @@
       text_len / 2);
   std::string cld_lang;
   bool is_cld_reliable;
+  std::string canonical_html_root_lang;
+  std::string canonical_content_lang;
   translate::DeterminePageLanguage(lang, html_lang, text, &cld_lang,
-                                   &is_cld_reliable);
+                                   &is_cld_reliable, &canonical_html_root_lang,
+                                   &canonical_content_lang);
   return 0;
 }
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 0c856657..bb70a18 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4291,9 +4291,9 @@
             ],
             "experiments": [
                 {
-                    "name": "Draft23V4",
+                    "name": "FinalV6",
                     "params": {
-                        "variant": "draft23"
+                        "variant": "final"
                     }
                 }
             ]
diff --git a/third_party/WebKit/LayoutTests/accessibility/aria-owns-ignores-leafs.html b/third_party/WebKit/LayoutTests/accessibility/aria-owns-ignores-leafs.html
index 20146ed..21ed622 100644
--- a/third_party/WebKit/LayoutTests/accessibility/aria-owns-ignores-leafs.html
+++ b/third_party/WebKit/LayoutTests/accessibility/aria-owns-ignores-leafs.html
@@ -20,7 +20,7 @@
 {
     // No problem with using aria-owns to put a menu inside a heading.
     var axHeading1 = accessibilityController.accessibleElementById("heading1");
-    assert_equals(axHeading1.name, "heading ");
+    assert_equals(axHeading1.name, "heading");
     var axContainer1 = accessibilityController.accessibleElementById("container1");
     assert_equals(axContainer1.childrenCount, 1);
     assert_equals(axContainer1.childAtIndex(0).role, "AXRole: AXHeading");
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
index 7f8ec17..4dd01bd 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST_5.json
@@ -37151,6 +37151,18 @@
      {}
     ]
    ],
+   "css/css-contain/contain-size-fieldset-001.html": [
+    [
+     "/css/css-contain/contain-size-fieldset-001.html",
+     [
+      [
+       "/css/css-contain/reference/contain-size-fieldset-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-contain/contain-size-flexbox-001.html": [
     [
      "/css/css-contain/contain-size-flexbox-001.html",
@@ -119826,6 +119838,11 @@
      {}
     ]
    ],
+   "css/css-contain/reference/contain-size-fieldset-001-ref.html": [
+    [
+     {}
+    ]
+   ],
    "css/css-contain/reference/contain-size-flexbox-001-ref.html": [
     [
      {}
@@ -143216,12 +143233,7 @@
      {}
     ]
    ],
-   "css/cssom/getComputedStyle-insets-relative-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "css/cssom/getComputedStyle-insets-sticky-expected.txt": [
+   "css/cssom/getComputedStyle-insets-fixed-expected.txt": [
     [
      {}
     ]
@@ -159156,11 +159168,26 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/resources/bad.css": [
     [
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/resources/css.py": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/resources/empty-href.css": [
     [
      {}
@@ -159181,6 +159208,11 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/resources/link-style-error.js": [
+    [
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
     [
      {}
@@ -160776,11 +160808,6 @@
      {}
     ]
    ],
-   "html/semantics/forms/the-form-element/form-autocomplete-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "html/semantics/forms/the-form-element/form-indexed-element-expected.txt": [
     [
      {}
@@ -172651,11 +172678,6 @@
      {}
     ]
    ],
-   "service-workers/service-worker/navigation-redirect.https_client-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "service-workers/service-worker/ready.https-expected.txt": [
     [
      {}
@@ -200816,6 +200838,12 @@
      {}
     ]
    ],
+   "css/css-tables/caption-writing-mode-001.html": [
+    [
+     "/css/css-tables/caption-writing-mode-001.html",
+     {}
+    ]
+   ],
    "css/css-tables/fixed-layout-1.html": [
     [
      "/css/css-tables/fixed-layout-1.html",
@@ -224946,6 +224974,18 @@
      {}
     ]
    ],
+   "html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html": [
+    [
+     "/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html",
+     {}
+    ]
+   ],
+   "html/semantics/document-metadata/the-link-element/link-style-error-quirks.html": [
+    [
+     "/html/semantics/document-metadata/the-link-element/link-style-error-quirks.html",
+     {}
+    ]
+   ],
    "html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html": [
     [
      "/html/semantics/document-metadata/the-meta-element/pragma-directives/attr-meta-http-equiv-refresh/allow-scripts-flag-changing-1.html",
@@ -260028,12 +260068,6 @@
      {
       "timeout": "long"
      }
-    ],
-    [
-     "/service-workers/service-worker/navigation-redirect.https.html?client",
-     {
-      "timeout": "long"
-     }
     ]
    ],
    "service-workers/service-worker/navigation-timing.https.html": [
@@ -315147,6 +315181,10 @@
    "1e4965e9daf380aec19cf43902c409ad6b457370",
    "reftest"
   ],
+  "css/css-contain/contain-size-fieldset-001.html": [
+   "f92424716ce55fdfbc0ad9954ab2893d63b389b2",
+   "reftest"
+  ],
   "css/css-contain/contain-size-flexbox-001.html": [
    "31e82f5d24c4aa673291a2ce25c660cf10977e28",
    "reftest"
@@ -315391,6 +315429,10 @@
    "1cbaaccd1a0751c5dadf913e1fc31d130ff95259",
    "support"
   ],
+  "css/css-contain/reference/contain-size-fieldset-001-ref.html": [
+   "85f5c73c2ece9a324511356d6f33798b3cfbe811",
+   "support"
+  ],
   "css/css-contain/reference/contain-size-flexbox-001-ref.html": [
    "85628b59c48f7931e7d3e5a498da60cc264dc363",
    "support"
@@ -333400,7 +333442,7 @@
    "testharness"
   ],
   "css/css-properties-values-api/registered-properties-inheritance.html": [
-   "8f9eafee19e5c2500811f05723902808a27760df",
+   "614a72a797bc91a76742efc990e07669bee87c11",
    "testharness"
   ],
   "css/css-properties-values-api/registered-property-computation.html": [
@@ -333440,7 +333482,7 @@
    "testharness"
   ],
   "css/css-properties-values-api/unit-cycles.html": [
-   "d65348543c4145bbd693aac67372390bfd91fc11",
+   "c26e1cda1f6842655e7e0158d6a934e470f486ae",
    "testharness"
   ],
   "css/css-properties-values-api/url-resolution.html": [
@@ -333452,7 +333494,7 @@
    "testharness"
   ],
   "css/css-properties-values-api/var-reference-registered-properties.html": [
-   "d8a831571252cdeb3e6c3c6e582a2b74376e905c",
+   "5de6d20f11b1aec41c7b54653ef482db6c7d8c93",
    "testharness"
   ],
   "css/css-pseudo/META.yml": [
@@ -335955,6 +335997,10 @@
    "302e51ae239307a49c239bf0ad5ade17a5c9d940",
    "testharness"
   ],
+  "css/css-tables/caption-writing-mode-001.html": [
+   "835a5116ae36bca9f92698b7766d0b65f1514f9f",
+   "testharness"
+  ],
   "css/css-tables/fixed-layout-1.html": [
    "3e0d013af1c6970a1180cf19db37e8e7b82cc0c0",
    "testharness"
@@ -358824,13 +358870,17 @@
    "testharness"
   ],
   "css/cssom/getComputedStyle-insets-absolute-expected.txt": [
-   "76946d1be0cbc5267c70a1f646704ebc5ee1899d",
+   "74a917967aeaf37f96b04a37c510793107015733",
    "support"
   ],
   "css/cssom/getComputedStyle-insets-absolute.html": [
    "fae0a84a7b4a554b6cc182f48aee98bc7c196ad4",
    "testharness"
   ],
+  "css/cssom/getComputedStyle-insets-fixed-expected.txt": [
+   "921f9aefde82a74b1caba88e38032824d248c32d",
+   "support"
+  ],
   "css/cssom/getComputedStyle-insets-fixed.html": [
    "ff80d2fc50464eff7564827fe9922e3274ecd629",
    "testharness"
@@ -358839,10 +358889,6 @@
    "236abf17f9cab8652b350c1168f2c27c1f84a631",
    "testharness"
   ],
-  "css/cssom/getComputedStyle-insets-relative-expected.txt": [
-   "46983e552187f98f274e0d58a1a235548507d2b7",
-   "support"
-  ],
   "css/cssom/getComputedStyle-insets-relative.html": [
    "1abfc62c0165a0a47b2e988111723acb55f996ce",
    "testharness"
@@ -358851,10 +358897,6 @@
    "aa7dbee95667a5e3b829b7d3774311da49c01deb",
    "testharness"
   ],
-  "css/cssom/getComputedStyle-insets-sticky-expected.txt": [
-   "e78c82b1d2cb01cda816a067649547411ce3dce5",
-   "support"
-  ],
   "css/cssom/getComputedStyle-insets-sticky.html": [
    "6149acc6d7d0391d7a4d7ece12b9ec9c4b39041d",
    "testharness"
@@ -384408,17 +384450,37 @@
    "testharness"
   ],
   "html/semantics/document-metadata/the-link-element/link-style-error-01-expected.txt": [
-   "7ec33099b36851253b908279ca0e1069b004410d",
+   "d7f9ee690ff070279ff2271c2937627081cc8b17",
    "support"
   ],
   "html/semantics/document-metadata/the-link-element/link-style-error-01.html": [
-   "7a86a86381d85426c20f0cf1c031e316226777c0",
+   "575324d761a15fb2a793d306306804091882e6ca",
+   "testharness"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks-expected.txt": [
+   "3ce740925d4fc1e364a2bc0586f6d5f8f906dc1a",
+   "support"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html": [
+   "d3c520ba75f56c3e4a33e63716a476a2176ce7a9",
+   "testharness"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt": [
+   "3ce740925d4fc1e364a2bc0586f6d5f8f906dc1a",
+   "support"
+  ],
+  "html/semantics/document-metadata/the-link-element/link-style-error-quirks.html": [
+   "ae2efa415ee51e4b2b54df2f3f90965746b43ed3",
    "testharness"
   ],
   "html/semantics/document-metadata/the-link-element/resources/bad.css": [
    "4e1fe36165c52792e3a3816962c36e6090f04f67",
    "support"
   ],
+  "html/semantics/document-metadata/the-link-element/resources/css.py": [
+   "eb981373a3e2b1694a295d58b4d5baf4c3c5a034",
+   "support"
+  ],
   "html/semantics/document-metadata/the-link-element/resources/empty-href.css": [
    "60f1eab97137f7dc51fc53c8e4f3e49f63342c38",
    "support"
@@ -384435,6 +384497,10 @@
    "fa95e11ba9ef9a5106663a6a0c00f21a1b9ac577",
    "support"
   ],
+  "html/semantics/document-metadata/the-link-element/resources/link-style-error.js": [
+   "d1fa5ac2d6fcb4d94561c18b2d2e22a5a2afd6e3",
+   "support"
+  ],
   "html/semantics/document-metadata/the-link-element/resources/stylesheet.css": [
    "e1b2552ffea7300e3ffba041dd3e5d3ab26c2c33",
    "support"
@@ -388239,12 +388305,8 @@
    "14717c5e6aa12e582746c917fcfe68d07cf8ace2",
    "testharness"
   ],
-  "html/semantics/forms/the-form-element/form-autocomplete-expected.txt": [
-   "9d2f8769c80fceb692b5c8226934691c9f853e42",
-   "support"
-  ],
   "html/semantics/forms/the-form-element/form-autocomplete.html": [
-   "5c1d05b301e78cea0970535883602844eb0dc801",
+   "618aa0a6c4793701fb1c16fe5924482c94a99e46",
    "testharness"
   ],
   "html/semantics/forms/the-form-element/form-checkvalidity.html": [
@@ -407268,7 +407330,7 @@
    "testharness"
   ],
   "picture-in-picture/request-picture-in-picture.html": [
-   "a0c3217603b8fdb3529d5aa456226cda4109722d",
+   "403d416c7d454fb0a6a2f8442cc23c53f83212e1",
    "testharness"
   ],
   "picture-in-picture/resources/picture-in-picture-helpers.js": [
@@ -419200,17 +419262,13 @@
    "testharness"
   ],
   "service-workers/service-worker/navigation-redirect.https-expected.txt": [
-   "28a5b788ef706a80cdd40b4bc4aeece347dadbc1",
+   "10b1fd1d6e3148cfc6ec382056000846fe6b17e0",
    "support"
   ],
   "service-workers/service-worker/navigation-redirect.https.html": [
-   "edd37127668e7705ea2beffa1d511eec1c5a9eca",
+   "0490f2b4058ce808115442b09859fe7a350b2303",
    "testharness"
   ],
-  "service-workers/service-worker/navigation-redirect.https_client-expected.txt": [
-   "8856e57fe203ae1c3812f380cc60149d6c805134",
-   "support"
-  ],
   "service-workers/service-worker/navigation-timing.https.html": [
    "ac3456e9d1a9868b11d5571862560afda0a46fef",
    "testharness"
@@ -420020,7 +420078,7 @@
    "support"
   ],
   "service-workers/service-worker/resources/navigation-redirect-other-origin.html": [
-   "d82571d1a3c71e23274009d147e410b10fe8d245",
+   "0d2825f31093f8959b45712eff247a0a21c7c8cd",
    "support"
   ],
   "service-workers/service-worker/resources/navigation-redirect-out-scope.py": [
@@ -420172,7 +420230,7 @@
    "support"
   ],
   "service-workers/service-worker/resources/redirect-worker.js": [
-   "f3ac411b13ca6d6326d43a59e8ae9d7babc7a9bd",
+   "bf0a3a8d9e0486f896e635e478dcd623dda987c0",
    "support"
   ],
   "service-workers/service-worker/resources/redirect.py": [
@@ -425416,7 +425474,7 @@
    "testharness"
   ],
   "wasm/jsapi/module/customSections.any-expected.txt": [
-   "bfa81f6c73a0406424d8388d85913c66cdad8037",
+   "10fcc31f04439b5c498d157681c1c4a0b4c824c9",
    "support"
   ],
   "wasm/jsapi/module/customSections.any.js": [
@@ -425424,7 +425482,7 @@
    "testharness"
   ],
   "wasm/jsapi/module/customSections.any.worker-expected.txt": [
-   "bfa81f6c73a0406424d8388d85913c66cdad8037",
+   "10fcc31f04439b5c498d157681c1c4a0b4c824c9",
    "support"
   ],
   "wasm/jsapi/module/exports.any.js": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01-expected.txt
index 7ec33099b..d7f9ee69 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01-expected.txt
@@ -1,6 +1,29 @@
 This is a testharness.js-based test.
 PASS Should get an error event for a 404 error.
 PASS Should get an error event for an unsupported URL.
-FAIL Should get an error event for a text/plain response. assert_unreached: load event should not be fired Reached unreachable code
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and nosniff
+FAIL Stylesheet loading using <link> with wrong Content-Type, same-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using <link> with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and nosniff
+FAIL Stylesheet loading using @import with wrong Content-Type, same-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using @import with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and nosniff
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01.html
index 7a86a863..575324d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-01.html
@@ -4,6 +4,7 @@
 <link rel="help" href="https://html.spec.whatwg.org/multipage/#the-link-element">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
+<script src=/common/get-host-info.sub.js></script>
 <div id="log"></div>
 <div id="test">
 <script>
@@ -31,18 +32,6 @@
   elt.rel = "stylesheet";
   elt.href = "nonexistent:stylesheet.css";
   document.getElementsByTagName("head")[0].appendChild(elt);
-})
-
-var tText = async_test("Should get an error event for a text/plain response.")
-tText.step(function() {
-  var elt = document.createElement("link");
-  elt.onerror = tText.step_func(function() {
-    assert_true(true, "Got error event for 404 error.")
-    tText.done()
-  })
-  elt.onload = tText.unreached_func("load event should not be fired");
-  elt.rel = "stylesheet";
-  elt.href = "../../../../../common/css-red.txt";
-  document.getElementsByTagName("head")[0].appendChild(elt);
-})
+});
 </script>
+<script src=resources/link-style-error.js></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks-expected.txt
new file mode 100644
index 0000000..3ce7409
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with wrong Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with wrong Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and nosniff
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html
new file mode 100644
index 0000000..d3c520ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-limited-quirks.html
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//" "">
+<title>link: error events in limited quirks mode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src=/common/get-host-info.sub.js></script>
+<div id="log"></div>
+<script src=resources/link-style-error.js></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt
new file mode 100644
index 0000000..3ce7409
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with wrong Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using <link> with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using <link> with broken Content-Type, cross-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with wrong Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with wrong Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, same-origin, and nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with no Content-Type, cross-origin, and nosniff
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and no nosniff assert_unreached: error event should have fired Reached unreachable code
+FAIL Stylesheet loading using @import with wrong Content-Type, cross-origin, and nosniff assert_unreached: error event should have fired Reached unreachable code
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and no nosniff
+PASS Stylesheet loading using @import with broken Content-Type, cross-origin, and nosniff
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks.html
new file mode 100644
index 0000000..ae2efa41
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/link-style-error-quirks.html
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//Sun Microsystems Corp.//DTD HotJava Strict HTML//" "">
+<title>link: error events in quirks mode</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src=/common/get-host-info.sub.js></script>
+<div id="log"></div>
+<script src=resources/link-style-error.js></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/css.py b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/css.py
new file mode 100644
index 0000000..eb98137
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/css.py
@@ -0,0 +1,7 @@
+def main(request, response):
+  response.add_required_headers = False
+  if "content_type" in request.GET:
+    response.writer.write_header("Content-Type", request.GET.first("content_type"))
+  if "nosniff" in request.GET:
+  	response.writer.write_header("x-content-type-options", "nosniff")
+  response.writer.write_content("body { background:red }")
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-style-error.js b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-style-error.js
new file mode 100644
index 0000000..d1fa5ac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/document-metadata/the-link-element/resources/link-style-error.js
@@ -0,0 +1,47 @@
+["<link>", "@import"].forEach(linkType => {
+  [
+   ["same-origin", "resources/css.py"],
+   ["cross-origin", get_host_info().HTTP_REMOTE_ORIGIN + "/html/semantics/document-metadata/the-link-element/resources/css.py"]
+  ].forEach(originType => {
+    ["no Content-Type", "wrong Content-Type", "broken Content-Type"].forEach(contentType => {
+      ["no nosniff", "nosniff"].forEach(nosniff => {
+        async_test(t => {
+          const l = document.createElement("link");
+          t.add_cleanup(() => l.remove());
+          if (nosniff === "nosniff" || contentType === "wrong Content-Type" && (document.compatMode === "CSS1Compat" || originType[0] === "cross-origin")) {
+            l.onerror = t.step_func_done();
+            l.onload = t.unreached_func("error event should have fired");
+          } else {
+            l.onload = t.step_func_done();
+            l.onerror = t.unreached_func("load event should have fired");
+          }
+          l.rel = "stylesheet";
+          let query = [];
+          if (contentType === "broken Content-Type") {
+            query.push("content_type=oops");
+          } else if (contentType === "wrong Content-Type") {
+            query.push("content_type=text/plain")
+          }
+          if (nosniff === "nosniff") {
+            query.push("nosniff");
+          }
+          let stringQuery = "";
+          query.forEach(val => {
+            if (stringQuery === "") {
+              stringQuery += "?" + val;
+            } else {
+              stringQuery += "&" + val;
+            }
+          });
+          const link = new URL(originType[1] + stringQuery, location).href;
+          if (linkType === "<link>") {
+            l.href = link;
+          } else {
+            l.href = "data:text/css,@import url(" + link + ");";
+          }
+          document.head.appendChild(l);
+        }, "Stylesheet loading using " + linkType + " with " + contentType + ", " + originType[0] + ", and " + nosniff);
+      });
+    });
+  });
+});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html
index 1293d7f6..c7cab6e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/credentials.sub.html
@@ -39,7 +39,7 @@
   }).then(() => {
     const w = iframe.contentWindow;
 
-    assert_equals(w.sameOriginNone, 'not found',
+    assert_equals(w.sameOriginNone, 'found',
                   'Modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
     assert_equals(w.sameOriginAnonymous, 'found',
                   'Modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
@@ -52,18 +52,32 @@
     assert_equals(w.crossOriginUseCredentials, 'found',
                   'Modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
 
-    assert_equals(w.sameOriginNoneDecendent, 'not found',
-                  'Decendent modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
-    assert_equals(w.sameOriginAnonymousDecendent, 'found',
-                  'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
-    assert_equals(w.sameOriginUseCredentialsDecendent, 'found',
-                  'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is same-origin');
-    assert_equals(w.crossOriginNoneDecendent, 'not found',
-                  'Decendent modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is cross-origin');
-    assert_equals(w.crossOriginAnonymousDecendent, 'not found',
-                  'Decendent modules should be loaded without the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is cross-origin');
-    assert_equals(w.crossOriginUseCredentialsDecendent, 'found',
-                  'Decendent modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
+    assert_equals(w.sameOriginNoneDescendant, 'found',
+                  'Descendant modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
+    assert_equals(w.sameOriginAnonymousDescendant, 'found',
+                  'Descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
+    assert_equals(w.sameOriginUseCredentialsDescendant, 'found',
+                  'Descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is same-origin');
+    assert_equals(w.crossOriginNoneDescendant, 'not found',
+                  'Descendant modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is cross-origin');
+    assert_equals(w.crossOriginAnonymousDescendant, 'not found',
+                  'Descendant modules should be loaded without the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is cross-origin');
+    assert_equals(w.crossOriginUseCredentialsDescendant, 'found',
+                  'Descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
+
+    assert_equals(w.sameOriginNoneDynamicDescendant, 'found',
+                  'Dynamic decendent modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is same-origin');
+    assert_equals(w.sameOriginAnonymousDynamicDescendant, 'found',
+                  'Dynamic descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is same-origin');
+    assert_equals(w.sameOriginUseCredentialsDynamicDescendant, 'found',
+                  'Dynamic descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is same-origin');
+    assert_equals(w.crossOriginNoneDynamicDescendant, 'not found',
+                  'Dynamic descendant modules should be loaded without the credentials when the crossOrigin attribute is not specified and the target is cross-origin');
+    assert_equals(w.crossOriginAnonymousDynamicDescendant, 'not found',
+                  'Dynamic descendant modules should be loaded without the credentials when the crossOrigin attribute is specified with "anonymous" as its value and the target is cross-origin');
+    assert_equals(w.crossOriginUseCredentialsDynamicDescendant, 'found',
+                  'Dynamic descendant modules should be loaded with the credentials when the crossOrigin attribute is specified with "use-credentials" as its value and the target is cross-origin');
+
 });
 }, 'Modules should be loaded with or without the credentials based on the same-origin-ness and the crossOrigin attribute');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html
index f086e70..d2b2871 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/scripting-1/the-script-element/module/resources/credentials-iframe.sub.html
@@ -25,24 +25,44 @@
 </script>
 
 <script type="module">
-import "./check-cookie.py?id=sameOriginNoneDecendent&cookieName=same";
+import "./check-cookie.py?id=sameOriginNoneDescendant&cookieName=same";
 </script>
 <script type="module" crossOrigin="anonymous">
-import "./check-cookie.py?id=sameOriginAnonymousDecendent&cookieName=same";
+import "./check-cookie.py?id=sameOriginAnonymousDescendant&cookieName=same";
 </script>
 <script type="module" crossOrigin="use-credentials">
-import "./check-cookie.py?id=sameOriginUseCredentialsDecendent&cookieName=same";
+import "./check-cookie.py?id=sameOriginUseCredentialsDescendant&cookieName=same";
 </script>
 <script type="module">
-import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginNoneDecendent&cookieName=cross";
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginNoneDescendant&cookieName=cross";
 </script>
 <script type="module" crossOrigin="anonymous">
-import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginAnonymousDecendent&cookieName=cross";
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginAnonymousDescendant&cookieName=cross";
 </script>
 <script type="module" crossOrigin="use-credentials">
-import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginUseCredentialsDecendent&cookieName=cross";
+import "http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginUseCredentialsDescendant&cookieName=cross";
 </script>
 
+<script type="module">
+import("./check-cookie.py?id=sameOriginNoneDynamicDescendant&cookieName=same");
+</script>
+<script type="module" crossOrigin="anonymous">
+import("./check-cookie.py?id=sameOriginAnonymousDynamicDescendant&cookieName=same");
+</script>
+<script type="module" crossOrigin="use-credentials">
+import("./check-cookie.py?id=sameOriginUseCredentialsDynamicDescendant&cookieName=same");
+</script>
+<script type="module">
+import("http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginNoneDynamicDescendant&cookieName=cross");
+</script>
+<script type="module" crossOrigin="anonymous">
+import("http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginAnonymousDynamicDescendant&cookieName=cross");
+</script>
+<script type="module" crossOrigin="use-credentials">
+import("http://{{domains[www2]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/resources/check-cookie.py?id=crossOriginUseCredentialsDynamicDescendant&cookieName=cross");
+</script>
+
+
 <script type="text/javascript">
 window.addEventListener('load', event => {
   window.parent.postMessage({}, '*');
diff --git a/third_party/blink/public/web/web_page_popup.h b/third_party/blink/public/web/web_page_popup.h
index 507a43a..ea9a8f7 100644
--- a/third_party/blink/public/web/web_page_popup.h
+++ b/third_party/blink/public/web/web_page_popup.h
@@ -40,6 +40,8 @@
 
 class WebPagePopup : public WebWidget {
  public:
+  // Returns a WebPagePopup which is self-referencing. It's self-reference will
+  // be released when the popup is closed via Close().
   BLINK_EXPORT static WebPagePopup* Create(WebWidgetClient*);
   virtual WebPoint PositionRelativeToOwner() = 0;
 };
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index 069c531..025c15bf 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -84,9 +84,13 @@
 
   // Called to update imperative animation state. This should be called before
   // paint, although the client can rate-limit these calls.
-  // |lastFrameTimeMonotonic| is in seconds.
+  // |last_frame_time| is in seconds.
   virtual void BeginFrame(base::TimeTicks last_frame_time) {}
 
+  // Called when a main frame time metric should be emitted, along with
+  // any metrics that depend upon the main frame total time.
+  virtual void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {}
+
   // Called to run through the entire set of document lifecycle phases needed
   // to render a frame of the web widget. This MUST be called before Paint,
   // and it may result in calls to WebWidgetClient::didInvalidateRect.
diff --git a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
index 949407d0..09013e6 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer_test.cc
@@ -23,6 +23,7 @@
 #include "third_party/blink/renderer/core/script/classic_script.h"
 #include "third_party/blink/renderer/core/script/mock_script_element_base.h"
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
+#include "third_party/blink/renderer/platform/cross_origin_attribute_value.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader.h"
@@ -56,7 +57,8 @@
         url, WrappedResourceResponse(ResourceResponse()), "");
     pending_script_ = ClassicPendingScript::Fetch(
         url, dummy_page_holder_->GetDocument(), ScriptFetchOptions(),
-        UTF8Encoding(), element, FetchParameters::kNoDefer);
+        kCrossOriginAttributeNotSet, UTF8Encoding(), element,
+        FetchParameters::kNoDefer);
     pending_script_->SetSchedulingType(ScriptSchedulingType::kParserBlocking);
     ScriptStreamer::SetSmallScriptThresholdForTesting(0);
     Platform::Current()->GetURLLoaderMockFactory()->UnregisterURL(url);
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index f23aeb9f..c6c7154 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -1570,6 +1570,14 @@
   PageWidgetDelegate::Animate(*page_, last_frame_time);
 }
 
+void WebViewImpl::RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {
+  if (!MainFrameImpl())
+    return;
+
+  MainFrameImpl()->GetFrame()->View()->RecordEndOfFrameMetrics(
+      frame_begin_time);
+}
+
 void WebViewImpl::UpdateLifecycle(LifecycleUpdate requested_update) {
   TRACE_EVENT0("blink", "WebViewImpl::updateAllLifecyclePhases");
   if (!MainFrameImpl())
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 42be0ae..b1399b1 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -116,6 +116,7 @@
 
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) override;
   void BeginFrame(base::TimeTicks last_frame_time) override;
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
 
   void UpdateLifecycle(LifecycleUpdate requested_update) override;
   void UpdateAllLifecyclePhasesAndCompositeForTesting() override;
diff --git a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
index 647e3191..b219885 100644
--- a/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
+++ b/third_party/blink/renderer/core/fetch/body_stream_buffer.cc
@@ -441,7 +441,10 @@
 }
 
 void BodyStreamBuffer::Close() {
-  Controller()->Close();
+  // Close() can be called during construction, in which case Controller()
+  // will not be set yet.
+  if (Controller())
+    Controller()->Close();
   CancelConsumer();
 }
 
diff --git a/third_party/blink/renderer/core/frame/BUILD.gn b/third_party/blink/renderer/core/frame/BUILD.gn
index 8b0e7cc..3bd04766 100644
--- a/third_party/blink/renderer/core/frame/BUILD.gn
+++ b/third_party/blink/renderer/core/frame/BUILD.gn
@@ -88,6 +88,8 @@
     "local_frame.cc",
     "local_frame.h",
     "local_frame_client.h",
+    "local_frame_ukm_aggregator.cc",
+    "local_frame_ukm_aggregator.h",
     "local_frame_view.cc",
     "local_frame_view.h",
     "location.cc",
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
index d39b2e96..c74612c 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
@@ -1383,4 +1383,30 @@
       "\rbase-uri http://example.com", ""));
 }
 
+TEST_F(ContentSecurityPolicyTest, TrustedTypesNoDirective) {
+  csp->BindToExecutionContext(execution_context.Get());
+  csp->DidReceiveHeader("", kContentSecurityPolicyHeaderTypeEnforce,
+                        kContentSecurityPolicyHeaderSourceHTTP);
+  EXPECT_TRUE(csp->AllowTrustedTypePolicy("somepolicy"));
+}
+
+TEST_F(ContentSecurityPolicyTest, TrustedTypesSimpleDirective) {
+  csp->BindToExecutionContext(execution_context.Get());
+  csp->DidReceiveHeader("trusted-types one two three",
+                        kContentSecurityPolicyHeaderTypeEnforce,
+                        kContentSecurityPolicyHeaderSourceHTTP);
+  EXPECT_TRUE(csp->AllowTrustedTypePolicy("one"));
+  EXPECT_TRUE(csp->AllowTrustedTypePolicy("two"));
+  EXPECT_TRUE(csp->AllowTrustedTypePolicy("three"));
+  EXPECT_FALSE(csp->AllowTrustedTypePolicy("four"));
+}
+
+TEST_F(ContentSecurityPolicyTest, TrustedTypesEmpty) {
+  csp->BindToExecutionContext(execution_context.Get());
+  csp->DidReceiveHeader("trusted-types",
+                        kContentSecurityPolicyHeaderTypeEnforce,
+                        kContentSecurityPolicyHeaderSourceHTTP);
+  EXPECT_TRUE(csp->AllowTrustedTypePolicy("somepolicy"));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
index dfef21f1..da444e5 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
+++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
@@ -963,7 +963,7 @@
 }
 
 bool CSPDirectiveList::AllowTrustedTypePolicy(const String& policy_name) const {
-  if (trusted_types_->Allows(policy_name))
+  if (!trusted_types_ || trusted_types_->Allows(policy_name))
     return true;
 
   ReportViolation(
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
new file mode 100644
index 0000000..2c1a07d
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.cc
@@ -0,0 +1,232 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h"
+
+#include "services/metrics/public/cpp/ukm_entry_builder.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "third_party/blink/renderer/platform/histogram.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/blink/renderer/platform/wtf/time.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
+
+namespace blink {
+
+LocalFrameUkmAggregator::ScopedUkmHierarchicalTimer::ScopedUkmHierarchicalTimer(
+    LocalFrameUkmAggregator* aggregator,
+    size_t metric_index)
+    : aggregator_(aggregator),
+      metric_index_(metric_index),
+      start_time_(CurrentTimeTicks()) {}
+
+LocalFrameUkmAggregator::ScopedUkmHierarchicalTimer::ScopedUkmHierarchicalTimer(
+    ScopedUkmHierarchicalTimer&& other)
+    : aggregator_(other.aggregator_),
+      metric_index_(other.metric_index_),
+      start_time_(other.start_time_) {
+  other.aggregator_ = nullptr;
+}
+
+LocalFrameUkmAggregator::ScopedUkmHierarchicalTimer::
+    ~ScopedUkmHierarchicalTimer() {
+  if (aggregator_ && base::TimeTicks::IsHighResolution()) {
+    aggregator_->RecordSample(metric_index_, start_time_, CurrentTimeTicks());
+  }
+}
+
+LocalFrameUkmAggregator::LocalFrameUkmAggregator(int64_t source_id,
+                                                 ukm::UkmRecorder* recorder)
+    : source_id_(source_id),
+      recorder_(recorder),
+      event_name_("Blink.UpdateTime"),
+      event_frequency_(TimeDelta::FromSeconds(30)),
+      last_flushed_time_(CurrentTimeTicks()) {
+  // Record average and worst case for the primary metric.
+  primary_metric_.worst_case_metric_name = "MainFrame.WorstCase";
+  primary_metric_.average_metric_name = "MainFrame.Average";
+
+  // Define the UMA for the primary metric.
+  primary_metric_.uma_counter.reset(
+      new CustomCountHistogram("Blink.MainFrame.UpdateTime", 0, 10000000, 50));
+
+  // Set up the substrings to create the UMA names
+  const String uma_preamble = "Blink.";
+  const String uma_postscript = ".UpdateTime";
+  const String uma_ratio_preamble = "Blink.MainFrame.";
+  const String uma_ratio_postscript = "Ratio";
+
+  // Set up sub-strings for the bucketed UMA metrics
+  Vector<String> threshold_substrings;
+  if (!bucket_thresholds_.size()) {
+    threshold_substrings.push_back(".All");
+  } else {
+    threshold_substrings.push_back(
+        String::Format(".LessThan%lums",
+                       (unsigned long)bucket_thresholds_[0].InMilliseconds()));
+    for (wtf_size_t i = 1; i < bucket_thresholds_.size(); ++i) {
+      threshold_substrings.push_back(String::Format(
+          ".%lumsTo%lums",
+          (unsigned long)bucket_thresholds_[i - 1].InMilliseconds(),
+          (unsigned long)bucket_thresholds_[i].InMilliseconds()));
+    }
+    threshold_substrings.push_back(String::Format(
+        ".MoreThan%lums",
+        (unsigned long)bucket_thresholds_[bucket_thresholds_.size() - 1]
+            .InMilliseconds()));
+  }
+
+  // Populate all the sub-metrics.
+  absolute_metric_records_.ReserveInitialCapacity(kCount);
+  ratio_metric_records_.ReserveInitialCapacity(kCount);
+  for (unsigned i = 0; i < (unsigned)kCount; ++i) {
+    const auto& metric_name = metric_strings_[i];
+
+    // Absolute records report the absolute time for each metric, both
+    // average and worst case. They have an associated UMA too that we
+    // own and allocate here.
+    auto& absolute_record = absolute_metric_records_.emplace_back();
+    absolute_record.worst_case_metric_name = metric_name;
+    absolute_record.worst_case_metric_name.append(".WorstCase");
+    absolute_record.average_metric_name = metric_name;
+    absolute_record.average_metric_name.append(".Average");
+    absolute_record.reset();
+    auto uma_name = uma_preamble;
+    uma_name.append(metric_name);
+    uma_name.append(uma_postscript);
+    absolute_record.uma_counter.reset(
+        new CustomCountHistogram(uma_name.Utf8().data(), 0, 10000000, 50));
+
+    // Ratio records report the ratio of each metric to the primary metric,
+    // average and worst case. UMA counters are also associated with the
+    // ratios and we allocate and own them here.
+    auto& ratio_record = ratio_metric_records_.emplace_back();
+    ratio_record.worst_case_metric_name = metric_name;
+    ratio_record.worst_case_metric_name.append(".WorstCaseRatio");
+    ratio_record.average_metric_name = metric_name;
+    ratio_record.average_metric_name.append(".AverageRatio");
+    ratio_record.reset();
+    for (auto bucket_substring : threshold_substrings) {
+      String uma_name = uma_ratio_preamble;
+      uma_name.append(metric_name);
+      uma_name.append(uma_ratio_postscript);
+      uma_name.append(bucket_substring);
+      ratio_record.uma_counters_per_bucket.push_back(
+          std::make_unique<CustomCountHistogram>(uma_name.Utf8().data(), 0,
+                                                 10000000, 50));
+    }
+  }
+}
+
+LocalFrameUkmAggregator::~LocalFrameUkmAggregator() {
+  Flush(TimeTicks());
+}
+
+LocalFrameUkmAggregator::ScopedUkmHierarchicalTimer
+LocalFrameUkmAggregator::GetScopedTimer(size_t metric_index) {
+  return ScopedUkmHierarchicalTimer(this, metric_index);
+}
+
+void LocalFrameUkmAggregator::RecordSample(size_t metric_index,
+                                           TimeTicks start,
+                                           TimeTicks end) {
+  TimeDelta duration = end - start;
+
+  // Append the duration to the appropriate metrics record.
+  DCHECK_LT(metric_index, absolute_metric_records_.size());
+  auto& record = absolute_metric_records_[metric_index];
+  if (duration > record.worst_case_duration)
+    record.worst_case_duration = duration;
+  record.total_duration += duration;
+  ++record.sample_count;
+
+  // Record the UMA
+  record.uma_counter->CountMicroseconds(duration);
+
+  // Just record the duration for ratios. We compute the ratio later
+  // when we know the frame time.
+  ratio_metric_records_[metric_index].interval_duration += duration;
+}
+
+void LocalFrameUkmAggregator::RecordPrimarySample(TimeTicks start,
+                                                  TimeTicks end) {
+  FlushIfNeeded(end);
+
+  TimeDelta duration = end - start;
+
+  // Record UMA
+  primary_metric_.uma_counter->CountMicroseconds(duration);
+
+  if (duration.is_zero())
+    return;
+
+  // Record primary time information
+  if (duration > primary_metric_.worst_case_duration)
+    primary_metric_.worst_case_duration = duration;
+  primary_metric_.total_duration += duration;
+  ++primary_metric_.sample_count;
+
+  // Compute all the dependent metrics, after finding which bucket we're in
+  // for UMA data.
+  size_t bucket_index = bucket_thresholds_.size();
+  for (size_t i = 0; i < bucket_index; ++i) {
+    if (duration < bucket_thresholds_[i]) {
+      bucket_index = i;
+    }
+  }
+
+  for (auto& record : ratio_metric_records_) {
+    double ratio =
+        record.interval_duration.InMicrosecondsF() / duration.InMicrosecondsF();
+    if (ratio > record.worst_case_ratio)
+      record.worst_case_ratio = ratio;
+    record.total_ratio += ratio;
+    ++record.sample_count;
+    record.uma_counters_per_bucket[bucket_index]->Count(floor(ratio * 100.0));
+    record.interval_duration = TimeDelta();
+  }
+
+  has_data_ = true;
+}
+
+void LocalFrameUkmAggregator::FlushIfNeeded(TimeTicks current_time) {
+  if (current_time >= last_flushed_time_ + event_frequency_)
+    Flush(current_time);
+}
+
+void LocalFrameUkmAggregator::Flush(TimeTicks current_time) {
+  last_flushed_time_ = current_time;
+  if (!has_data_)
+    return;
+  DCHECK(primary_metric_.sample_count);
+
+  ukm::UkmEntryBuilder builder(source_id_, event_name_.Utf8().data());
+  builder.SetMetric(primary_metric_.worst_case_metric_name.Utf8().data(),
+                    primary_metric_.worst_case_duration.InMicroseconds());
+  builder.SetMetric(primary_metric_.average_metric_name.Utf8().data(),
+                    primary_metric_.total_duration.InMicroseconds() /
+                        static_cast<int64_t>(primary_metric_.sample_count));
+  for (auto& record : absolute_metric_records_) {
+    if (record.sample_count == 0)
+      continue;
+    builder.SetMetric(record.worst_case_metric_name.Utf8().data(),
+                      record.worst_case_duration.InMicroseconds());
+    builder.SetMetric(record.average_metric_name.Utf8().data(),
+                      record.total_duration.InMicroseconds() /
+                          static_cast<int64_t>(record.sample_count));
+  }
+  for (auto& record : ratio_metric_records_) {
+    if (record.sample_count == 0)
+      continue;
+    builder.SetMetric(record.worst_case_metric_name.Utf8().data(),
+                      record.worst_case_ratio);
+    builder.SetMetric(
+        record.average_metric_name.Utf8().data(),
+        record.total_ratio / static_cast<float>(record.sample_count));
+    record.reset();
+  }
+  builder.Record(recorder_);
+  has_data_ = false;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
new file mode 100644
index 0000000..546b61a5
--- /dev/null
+++ b/third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h
@@ -0,0 +1,216 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_UKM_AGGREGATOR_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_UKM_AGGREGATOR_H_
+
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/blink/renderer/platform/wtf/time.h"
+
+namespace ukm {
+class UkmRecorder;
+}
+
+namespace blink {
+class CustomCountHistogram;
+
+// This class aggregaties and records time based UKM and UMA metrics
+// for LocalFrameView. The simplest way to use it is via the
+// SCOPED_UMA_AND_UKM_HIERARCHICAL_TIMER macro in LocalFrameView combined
+// with LocalFrameView::RecordEndOfFrameMetrics.
+//
+// It takes the following constructor parameters:
+// - source_id: UKM Source ID associated with the events.
+// - recorder: UkmRecorder which will handle the events
+//
+// The aggregator manages all of the UKM and UMA names for LocalFrameView.
+// It constructs and takes ownership the UMA counters when constructed
+// itself. We do this to localize all UMA and UKM metrics in one place, so
+// that adding a metric is localized to the cc file of this class, protected
+// from errors that might arise when adding names in multiple places.
+//
+// After the aggregator is created, one can create ScopedUkmHierarchicalTimer
+// objects that will measure the time, in microseconds, from creation until
+// the object is destroyed for sub-metrics. When destroyed, it will record
+// a sample into the aggregator and the current frame's accumulated time for
+// that metric, and report UMA values.
+//
+// See the MetricNames enum below for the set of metrics recorded. Add an
+// entry to that enum to add a new metric.
+//
+// When the primary timed execution completes, this aggregator stores the
+// primary time and computes metrics that depend on it. The results are
+// aggregated.  UMA metrics are updated at this time. A UKM event is
+// generated in one of two situations:
+//  - If a sample is added that lies in the next event frequency interval (this
+//    will generate an event for the previous interval)
+//  - If the aggregator is destroyed (this will generate an event for any
+//    remaining samples in the aggregator)
+//
+// Note that no event is generated if there were no primary samples in an
+// interval.
+//
+// Sample usage (see also SCOPED_UMA_AND_UKM_HIERARCHICAL_TIMER):
+//   std::unique_ptr<UkmHierarchicalTimeAggregator> aggregator(
+//      new UkmHierarchicalTimeAggregator(
+//              GetSourceId(),
+//              GetUkmRecorder());
+//
+//   ...
+//   {
+//     auto timer =
+//         aggregator->GetScopedTimer(static_cast<size_t>(
+//             LocalFrameUkmAggregator::MetricNames::kMetric2));
+//     ...
+//   }
+//   // At this point an sample for kMetric2 is recorded.
+//   ...
+//   // When the primary time completes
+//   aggregator->RecordPrimaryMetric(time_delta);
+//   // This records a primary sample and the sub-metrics that depend on it.
+//   // It may generate an event.
+//   ...
+//   // Destroying an aggregator will generate an event as well if there were
+//   // samples.
+//   aggregator.reset();
+//
+// In the example above, the event name is "my_event". It will measure 14
+// metrics:
+//   "primary_metric.Average", "primary_metric.WorstCase",
+//   "sub_metric1.Average", "sub_metric1.WorstCase",
+//   "sub_metric2.Average", "sub_metric2.WorstCase",
+//   "sub_metric3.Average", "sub_metric3.WorstCase"
+//   "sub_metric1.AverageRatio", "sub_metric1.WorstCaseRatio",
+//   "sub_metric2.AverageRatio", "sub_metric2.WorstCaseRatio",
+//   "sub_metric3.AverageRatio", "sub_metric3.WorstCaseRation"
+//
+// It will report 13 UMA values:
+//   "primary_uma_counter",
+//   "sub_uma_metric1", "sub_uma_metric2", "sub_uma_metric3",
+//   "sub_uma_ratio1.LessThan1ms", "sub_uma_ratio1.1msTo5ms",
+//   "sub_uma_ratio1.MoreThan5ms", "sub_uma_ratio2.LessThan1ms",
+//   "sub_uma_ratio2.1msTo5ms", "sub_uma_ratio2.MoreThan5ms",
+//   "sub_uma_ratio3.LessThan1ms", "sub_uma_ratio3.1msTo5ms",
+//   "sub_uma_ratio3.MoreThan5ms"
+//
+// Note that these have to be specified in the appropriate ukm.xml file
+// and histograms.xml file. Runtime errors indicate missing or mis-named
+// metrics.
+//
+// If the source_id/recorder changes then a new
+// UkmHierarchicalTimeAggregator has to be created.
+class LocalFrameUkmAggregator {
+ public:
+  // Changing these values requires changing the names of metrics specified
+  // below. For every metric name added here, add an entry in the
+  // metric_strings_ array below.
+  enum {
+    kCompositing,
+    kCompositingCommit,
+    kIntersectionObservation,
+    kPaint,
+    kPrePaint,
+    kStyleAndLayout,
+    kCount
+  };
+
+ private:
+  // Add an entry in this arrray every time a new metric is added.
+  const String metric_strings_[kCount] = {
+      "Compositing", "CompositingCommit", "IntersectionObservation",
+      "Paint",       "PrePaint",          "StyleAndLayout"};
+
+  // Modify this array if the UMA ratio metrics should be bucketed in a
+  // different way.
+  const Vector<TimeDelta> bucket_thresholds_ = {TimeDelta::FromMilliseconds(1),
+                                                TimeDelta::FromMilliseconds(5)};
+
+ public:
+  // This class will start a timer upon creation, which will end when the
+  // object is destroyed. Upon destruction it will record a sample into the
+  // aggregator that created the scoped timer. It will also record an event
+  // into the histogram counter.
+  class ScopedUkmHierarchicalTimer {
+   public:
+    ScopedUkmHierarchicalTimer(ScopedUkmHierarchicalTimer&&);
+    ~ScopedUkmHierarchicalTimer();
+
+   private:
+    friend class LocalFrameUkmAggregator;
+
+    ScopedUkmHierarchicalTimer(LocalFrameUkmAggregator*, size_t metric_index);
+
+    LocalFrameUkmAggregator* aggregator_;
+    const size_t metric_index_;
+    const TimeTicks start_time_;
+
+    DISALLOW_COPY_AND_ASSIGN(ScopedUkmHierarchicalTimer);
+  };
+
+  LocalFrameUkmAggregator(int64_t source_id, ukm::UkmRecorder*);
+  ~LocalFrameUkmAggregator();
+
+  // Create a scoped timer with the index of the metric. Note the index must
+  // correspond to the matching index in metric_names.
+  ScopedUkmHierarchicalTimer GetScopedTimer(size_t metric_index);
+
+  // Record a primary sample, that also computes the ratios for the
+  // sub-metrics and may generate an event.
+  void RecordPrimarySample(TimeTicks start, TimeTicks end);
+
+ private:
+  struct AbsoluteMetricRecord {
+    String worst_case_metric_name;
+    String average_metric_name;
+    std::unique_ptr<CustomCountHistogram> uma_counter;
+    TimeDelta total_duration;
+    TimeDelta worst_case_duration;
+    size_t sample_count = 0u;
+
+    void reset() {
+      total_duration = TimeDelta();
+      worst_case_duration = TimeDelta();
+      sample_count = 0u;
+    }
+  };
+
+  struct RatioMetricRecord {
+    String worst_case_metric_name;
+    String average_metric_name;
+    Vector<std::unique_ptr<CustomCountHistogram>> uma_counters_per_bucket;
+    TimeDelta interval_duration;
+    double total_ratio;
+    double worst_case_ratio;
+    size_t sample_count;
+
+    void reset() {
+      interval_duration = TimeDelta();
+      total_ratio = 0;
+      worst_case_ratio = 0;
+      sample_count = 0u;
+    }
+  };
+
+  void RecordSample(size_t metric_index, TimeTicks start, TimeTicks end);
+  void FlushIfNeeded(TimeTicks current_time);
+  void Flush(TimeTicks current_time);
+
+  const int64_t source_id_;
+  ukm::UkmRecorder* const recorder_;
+  const String event_name_;
+  const TimeDelta event_frequency_;
+  AbsoluteMetricRecord primary_metric_;
+  Vector<AbsoluteMetricRecord> absolute_metric_records_;
+  Vector<RatioMetricRecord> ratio_metric_records_;
+  TimeTicks last_flushed_time_;
+
+  bool has_data_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(LocalFrameUkmAggregator);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_LOCAL_FRAME_UKM_AGGREGATOR_H_
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 3101fa06..7f5033b 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -55,6 +55,7 @@
 #include "third_party/blink/renderer/core/frame/link_highlights.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
+#include "third_party/blink/renderer/core/frame/local_frame_ukm_aggregator.h"
 #include "third_party/blink/renderer/core/frame/location.h"
 #include "third_party/blink/renderer/core/frame/page_scale_constraints_set.h"
 #include "third_party/blink/renderer/core/frame/remote_frame.h"
@@ -141,7 +142,6 @@
 #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
 #include "third_party/blink/renderer/platform/scroll/scroll_alignment.h"
 #include "third_party/blink/renderer/platform/transforms/transform_state.h"
-#include "third_party/blink/renderer/platform/ukm_time_aggregator.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
@@ -170,37 +170,23 @@
 constexpr size_t kCssFragmentIdentifierPrefixLength =
     base::size(kCssFragmentIdentifierPrefix);
 
-// Changing these values requires changing the names generated in
-// EnsureUkmTimeAggregator().
-enum class UkmMetricNames {
-  kCompositing,
-  kCompositingCommit,
-  kIntersectionObservation,
-  kPaint,
-  kPrePaint,
-  kStyleAndLayout,
-  kCount
-};
-
 }  // namespace
 
-// Defines an UMA and a UKM, recorded in microseconds equal to the duration of
-// the current lexical scope after declaration of the macro. Example usage:
+// Defines a UKM that is part of a hierarchical ukm, recorded in
+// microseconds equal to the duration of the current lexical scope after
+// declaration of the macro. Example usage:
 //
 // void LocalFrameView::DoExpensiveThing() {
-//   SCOPED_UMA_AND_UKM_TIMER(UmaName, kUkmEnumName);
+//   SCOPED_UMA_AND_UKM_TIMER(kUkmEnumName);
 //   // Do computation of expensive thing
 //
 // }
 //
-// |uma_name| should be the full name of an UMA defined
-// in histograms.xml. |ukm_enum| should be an entry in UkmMetricNames
-// (which in turn come from ukm.xml).
-#define SCOPED_UMA_AND_UKM_TIMER(uma_name, ukm_enum)                    \
-  DEFINE_STATIC_LOCAL_IMPL(CustomCountHistogram, scoped_uma_counter,    \
-                           (uma_name, 0, 10000000, 50), false);         \
-  auto scoped_ukm_uma_timer = EnsureUkmTimeAggregator().GetScopedTimer( \
-      static_cast<size_t>(ukm_enum), &scoped_uma_counter);
+// |ukm_enum| should be an entry in LocalFrameUkmAggregator's enum of
+// metric names (which in turn corresponds to names in from ukm.xml).
+#define SCOPED_UMA_AND_UKM_TIMER(ukm_enum) \
+  auto scoped_ukm_hierarchical_timer =     \
+      EnsureUkmAggregator().GetScopedTimer(static_cast<size_t>(ukm_enum));
 
 using namespace HTMLNames;
 
@@ -407,7 +393,7 @@
 
   ClearPrintContext();
 
-  ukm_time_aggregator_.reset();
+  ukm_aggregator_.reset();
   jank_tracker_->Dispose();
 
 #if DCHECK_IS_ON()
@@ -2263,6 +2249,11 @@
       DocumentLifecycle::kLayoutClean);
 }
 
+void LocalFrameView::RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) {
+  LocalFrameUkmAggregator& ukm_aggregator = EnsureUkmAggregator();
+  ukm_aggregator.RecordPrimarySample(frame_begin_time, CurrentTimeTicks());
+}
+
 void LocalFrameView::ScheduleVisualUpdateForPaintInvalidationIfNeeded() {
   LocalFrame& local_frame_root = GetFrame().LocalFrameRoot();
   if (local_frame_root.View()->current_update_lifecycle_phases_target_state_ <
@@ -2415,8 +2406,7 @@
   if (target_state == DocumentLifecycle::kPaintClean) {
     TRACE_EVENT0("blink,benchmark",
                  "LocalFrameView::UpdateViewportIntersectionsForSubtree");
-    SCOPED_UMA_AND_UKM_TIMER("Blink.IntersectionObservation.UpdateTime",
-                             UkmMetricNames::kIntersectionObservation);
+    SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kIntersectionObservation);
     UpdateViewportIntersectionsForSubtree();
   }
 
@@ -2533,8 +2523,7 @@
   DCHECK(layout_view);
 
   if (!RuntimeEnabledFeatures::SlimmingPaintV2Enabled()) {
-    SCOPED_UMA_AND_UKM_TIMER("Blink.Compositing.UpdateTime",
-                             UkmMetricNames::kCompositing);
+    SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kCompositing);
     layout_view->Compositor()->UpdateIfNeededRecursive(target_state);
   } else {
     ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) {
@@ -2578,8 +2567,7 @@
   });
 
   {
-    SCOPED_UMA_AND_UKM_TIMER("Blink.PrePaint.UpdateTime",
-                             UkmMetricNames::kPrePaint);
+    SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kPrePaint);
 
     PrePaintTreeWalk().WalkTree(*this);
   }
@@ -2794,7 +2782,7 @@
 
 void LocalFrameView::PaintTree() {
   TRACE_EVENT0("blink,benchmark", "LocalFrameView::paintTree");
-  SCOPED_UMA_AND_UKM_TIMER("Blink.Paint.UpdateTime", UkmMetricNames::kPaint);
+  SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kPaint);
 
   DCHECK(GetFrame().IsLocalRoot());
 
@@ -2934,8 +2922,7 @@
         paint_artifact_compositor_->RootLayer(), &GetFrame());
   }
 
-  SCOPED_UMA_AND_UKM_TIMER("Blink.CompositingCommit.UpdateTime",
-                           UkmMetricNames::kCompositingCommit);
+  SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kCompositingCommit);
 
   paint_artifact_compositor_->Update(
       paint_controller_->GetPaintArtifactShared(), composited_element_ids,
@@ -2951,8 +2938,7 @@
 }
 
 void LocalFrameView::UpdateStyleAndLayoutIfNeededRecursive() {
-  SCOPED_UMA_AND_UKM_TIMER("Blink.StyleAndLayout.UpdateTime",
-                           UkmMetricNames::kStyleAndLayout);
+  SCOPED_UMA_AND_UKM_TIMER(LocalFrameUkmAggregator::kStyleAndLayout);
   UpdateStyleAndLayoutIfNeededRecursiveInternal();
 }
 
@@ -4443,18 +4429,13 @@
       std::max<float>(1.0, GetChromeClient()->WindowToViewportScalar(1)));
 }
 
-UkmTimeAggregator& LocalFrameView::EnsureUkmTimeAggregator() {
-  if (!ukm_time_aggregator_) {
-    ukm_time_aggregator_.reset(new UkmTimeAggregator(
-        "Blink.UpdateTime", frame_->GetDocument()->UkmSourceID(),
-        frame_->GetDocument()->UkmRecorder(),
-        // Note that changing the order or values of the following vector
-        // requires changing the UkmMetricNames enum.
-        {"Compositing", "CompositingCommit", "IntersectionObservation", "Paint",
-         "PrePaint", "StyleAndLayout"},
-        TimeDelta::FromSeconds(30)));
+LocalFrameUkmAggregator& LocalFrameView::EnsureUkmAggregator() {
+  if (!ukm_aggregator_) {
+    ukm_aggregator_.reset(
+        new LocalFrameUkmAggregator(frame_->GetDocument()->UkmSourceID(),
+                                    frame_->GetDocument()->UkmRecorder()));
   }
-  return *ukm_time_aggregator_;
+  return *ukm_aggregator_;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index 75ef8d7..ee208c45 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -86,7 +86,7 @@
 class ScrollingCoordinatorContext;
 class TracedValue;
 class TransformState;
-class UkmTimeAggregator;
+class LocalFrameUkmAggregator;
 class WebPluginContainerImpl;
 struct AnnotatedRegionValue;
 struct IntrinsicSizingInfo;
@@ -349,6 +349,9 @@
   // desired state.
   bool UpdateLifecycleToLayoutClean();
 
+  // Record any UMA and UKM metrics that depend on the end of a main frame.
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time);
+
   void ScheduleVisualUpdateForPaintInvalidationIfNeeded();
 
   bool InvalidateViewportConstrainedObjects();
@@ -824,7 +827,7 @@
 
   void LayoutFromRootObject(LayoutObject& root);
 
-  UkmTimeAggregator& EnsureUkmTimeAggregator();
+  LocalFrameUkmAggregator& EnsureUkmAggregator();
 
   LayoutSize size_;
 
@@ -959,7 +962,7 @@
 
   MainThreadScrollingReasons main_thread_scrolling_reasons_;
 
-  std::unique_ptr<UkmTimeAggregator> ukm_time_aggregator_;
+  std::unique_ptr<LocalFrameUkmAggregator> ukm_aggregator_;
 
   Member<PrintContext> print_context_;
 
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
index 16207dde..27558a3 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.cc
@@ -38,32 +38,37 @@
 }
 
 void WebViewFrameWidget::Resize(const WebSize& size) {
-  return web_view_->Resize(size);
+  web_view_->Resize(size);
 }
 
 void WebViewFrameWidget::ResizeVisualViewport(const WebSize& size) {
-  return web_view_->ResizeVisualViewport(size);
+  web_view_->ResizeVisualViewport(size);
 }
 
 void WebViewFrameWidget::DidEnterFullscreen() {
-  return web_view_->DidEnterFullscreen();
+  web_view_->DidEnterFullscreen();
 }
 
 void WebViewFrameWidget::DidExitFullscreen() {
-  return web_view_->DidExitFullscreen();
+  web_view_->DidExitFullscreen();
 }
 
 void WebViewFrameWidget::SetSuppressFrameRequestsWorkaroundFor704763Only(
     bool suppress_frame_requests) {
-  return web_view_->SetSuppressFrameRequestsWorkaroundFor704763Only(
+  web_view_->SetSuppressFrameRequestsWorkaroundFor704763Only(
       suppress_frame_requests);
 }
 void WebViewFrameWidget::BeginFrame(base::TimeTicks last_frame_time) {
-  return web_view_->BeginFrame(last_frame_time);
+  web_view_->BeginFrame(last_frame_time);
+}
+
+void WebViewFrameWidget::RecordEndOfFrameMetrics(
+    base::TimeTicks frame_begin_time) {
+  web_view_->RecordEndOfFrameMetrics(frame_begin_time);
 }
 
 void WebViewFrameWidget::UpdateLifecycle(LifecycleUpdate requested_update) {
-  return web_view_->UpdateLifecycle(requested_update);
+  web_view_->UpdateLifecycle(requested_update);
 }
 
 void WebViewFrameWidget::UpdateAllLifecyclePhasesAndCompositeForTesting() {
@@ -72,20 +77,20 @@
 
 void WebViewFrameWidget::PaintContent(cc::PaintCanvas* canvas,
                                       const WebRect& view_port) {
-  return web_view_->PaintContent(canvas, view_port);
+  web_view_->PaintContent(canvas, view_port);
 }
 
 void WebViewFrameWidget::LayoutAndPaintAsync(base::OnceClosure callback) {
-  return web_view_->LayoutAndPaintAsync(std::move(callback));
+  web_view_->LayoutAndPaintAsync(std::move(callback));
 }
 
 void WebViewFrameWidget::CompositeAndReadbackAsync(
     base::OnceCallback<void(const SkBitmap&)> callback) {
-  return web_view_->CompositeAndReadbackAsync(std::move(callback));
+  web_view_->CompositeAndReadbackAsync(std::move(callback));
 }
 
 void WebViewFrameWidget::ThemeChanged() {
-  return web_view_->ThemeChanged();
+  web_view_->ThemeChanged();
 }
 
 WebInputEventResult WebViewFrameWidget::HandleInputEvent(
@@ -98,7 +103,7 @@
 }
 
 void WebViewFrameWidget::SetCursorVisibilityState(bool is_visible) {
-  return web_view_->SetCursorVisibilityState(is_visible);
+  web_view_->SetCursorVisibilityState(is_visible);
 }
 
 void WebViewFrameWidget::ApplyViewportDeltas(
@@ -107,24 +112,24 @@
     const WebFloatSize& elastic_overscroll_delta,
     float scale_factor,
     float browser_controls_shown_ratio_delta) {
-  return web_view_->ApplyViewportDeltas(
-      visual_viewport_delta, layout_viewport_delta, elastic_overscroll_delta,
-      scale_factor, browser_controls_shown_ratio_delta);
+  web_view_->ApplyViewportDeltas(visual_viewport_delta, layout_viewport_delta,
+                                 elastic_overscroll_delta, scale_factor,
+                                 browser_controls_shown_ratio_delta);
 }
 
 void WebViewFrameWidget::RecordWheelAndTouchScrollingCount(
     bool has_scrolled_by_wheel,
     bool has_scrolled_by_touch) {
-  return web_view_->RecordWheelAndTouchScrollingCount(has_scrolled_by_wheel,
-                                                      has_scrolled_by_touch);
+  web_view_->RecordWheelAndTouchScrollingCount(has_scrolled_by_wheel,
+                                               has_scrolled_by_touch);
 }
 
 void WebViewFrameWidget::MouseCaptureLost() {
-  return web_view_->MouseCaptureLost();
+  web_view_->MouseCaptureLost();
 }
 
 void WebViewFrameWidget::SetFocus(bool enable) {
-  return web_view_->SetFocus(enable);
+  web_view_->SetFocus(enable);
 }
 
 bool WebViewFrameWidget::SelectionBounds(WebRect& anchor,
@@ -137,7 +142,7 @@
 }
 
 void WebViewFrameWidget::WillCloseLayerTreeView() {
-  return web_view_->WillCloseLayerTreeView();
+  web_view_->WillCloseLayerTreeView();
 }
 
 SkColor WebViewFrameWidget::BackgroundColor() const {
@@ -152,12 +157,12 @@
     cc::BrowserControlsState constraints,
     cc::BrowserControlsState current,
     bool animate) {
-  return web_view_->UpdateBrowserControlsState(constraints, current, animate);
+  web_view_->UpdateBrowserControlsState(constraints, current, animate);
 }
 
 void WebViewFrameWidget::SetVisibilityState(
     mojom::PageVisibilityState visibility_state) {
-  return web_view_->SetVisibilityState(visibility_state, false);
+  web_view_->SetVisibilityState(visibility_state, false);
 }
 
 void WebViewFrameWidget::SetBackgroundColorOverride(SkColor color) {
@@ -165,7 +170,7 @@
 }
 
 void WebViewFrameWidget::ClearBackgroundColorOverride() {
-  return web_view_->ClearBackgroundColorOverride();
+  web_view_->ClearBackgroundColorOverride();
 }
 
 void WebViewFrameWidget::SetBaseBackgroundColorOverride(SkColor color) {
@@ -173,7 +178,7 @@
 }
 
 void WebViewFrameWidget::ClearBaseBackgroundColorOverride() {
-  return web_view_->ClearBaseBackgroundColorOverride();
+  web_view_->ClearBaseBackgroundColorOverride();
 }
 
 void WebViewFrameWidget::SetBaseBackgroundColor(SkColor color) {
diff --git a/third_party/blink/renderer/core/frame/web_view_frame_widget.h b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
index 16ee4b60..1659cf7e 100644
--- a/third_party/blink/renderer/core/frame/web_view_frame_widget.h
+++ b/third_party/blink/renderer/core/frame/web_view_frame_widget.h
@@ -48,6 +48,7 @@
   void DidExitFullscreen() override;
   void SetSuppressFrameRequestsWorkaroundFor704763Only(bool) final;
   void BeginFrame(base::TimeTicks last_frame_time) override;
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
   void UpdateLifecycle(LifecycleUpdate requested_update) override;
   void UpdateAllLifecyclePhasesAndCompositeForTesting() override;
   void PaintContent(cc::PaintCanvas*, const WebRect& view_port) override;
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
index f150ce2..7608495b 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner_test.cc
@@ -870,7 +870,7 @@
        network::mojom::FetchCredentialsMode::kInclude},
       {"http://example.test", "<script type='module' src='/script'></script>",
        network::mojom::FetchRequestMode::kCORS,
-       network::mojom::FetchCredentialsMode::kOmit},
+       network::mojom::FetchCredentialsMode::kSameOrigin},
       {"http://example.test",
        "<script type='module' crossorigin='anonymous' src='/script'></script>",
        network::mojom::FetchRequestMode::kCORS,
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
index 9b9cb77..0bd47f43 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
@@ -142,7 +142,8 @@
 
   if (needs_boundaries_update_) {
     local_visual_rect_ = object_bounding_box_;
-    SVGLayoutSupport::AdjustVisualRectWithResources(*this, local_visual_rect_);
+    SVGLayoutSupport::AdjustVisualRectWithResources(*this, object_bounding_box_,
+                                                    local_visual_rect_);
     needs_boundaries_update_ = false;
     update_parent_boundaries = true;
   }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
index 69fd4258..931ccd8 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
@@ -277,7 +277,8 @@
     needs_shape_update_ = false;
 
     local_visual_rect_ = StrokeBoundingBox();
-    SVGLayoutSupport::AdjustVisualRectWithResources(*this, local_visual_rect_);
+    SVGLayoutSupport::AdjustVisualRectWithResources(*this, ObjectBoundingBox(),
+                                                    local_visual_rect_);
     needs_boundaries_update_ = false;
 
     update_parent_boundaries = true;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc
index 78cad04..dbff4629 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_text.cc
@@ -391,7 +391,8 @@
 
 FloatRect LayoutSVGText::VisualRectInLocalSVGCoordinates() const {
   FloatRect visual_rect = StrokeBoundingBox();
-  SVGLayoutSupport::AdjustVisualRectWithResources(*this, visual_rect);
+  SVGLayoutSupport::AdjustVisualRectWithResources(*this, ObjectBoundingBox(),
+                                                  visual_rect);
 
   if (const ShadowList* text_shadow = StyleRef().TextShadow())
     text_shadow->AdjustRectForShadow(visual_rect);
diff --git a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
index 2fb3a01..02b022f 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
@@ -262,7 +262,8 @@
   }
 
   local_visual_rect = stroke_bounding_box;
-  AdjustVisualRectWithResources(*container, local_visual_rect);
+  AdjustVisualRectWithResources(*container, object_bounding_box,
+                                local_visual_rect);
 }
 
 const LayoutSVGRoot* SVGLayoutSupport::FindTreeRootObject(
@@ -386,26 +387,21 @@
 
 void SVGLayoutSupport::AdjustVisualRectWithResources(
     const LayoutObject& layout_object,
+    const FloatRect& object_bounding_box,
     FloatRect& visual_rect) {
   SVGResources* resources =
       SVGResourcesCache::CachedResourcesForLayoutObject(layout_object);
   if (!resources)
     return;
 
-  if (LayoutSVGResourceFilter* filter = resources->Filter()) {
-    visual_rect =
-        filter->ResourceBoundingBox(layout_object.ObjectBoundingBox());
-  }
+  if (LayoutSVGResourceFilter* filter = resources->Filter())
+    visual_rect = filter->ResourceBoundingBox(object_bounding_box);
 
-  if (LayoutSVGResourceClipper* clipper = resources->Clipper()) {
-    visual_rect.Intersect(
-        clipper->ResourceBoundingBox(layout_object.ObjectBoundingBox()));
-  }
+  if (LayoutSVGResourceClipper* clipper = resources->Clipper())
+    visual_rect.Intersect(clipper->ResourceBoundingBox(object_bounding_box));
 
-  if (LayoutSVGResourceMasker* masker = resources->Masker()) {
-    visual_rect.Intersect(
-        masker->ResourceBoundingBox(layout_object.ObjectBoundingBox()));
-  }
+  if (LayoutSVGResourceMasker* masker = resources->Masker())
+    visual_rect.Intersect(masker->ResourceBoundingBox(object_bounding_box));
 }
 
 bool SVGLayoutSupport::HasFilterResource(const LayoutObject& object) {
diff --git a/third_party/blink/renderer/core/layout/svg/svg_layout_support.h b/third_party/blink/renderer/core/layout/svg/svg_layout_support.h
index 8737a84c..98abb7c 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_layout_support.h
+++ b/third_party/blink/renderer/core/layout/svg/svg_layout_support.h
@@ -65,7 +65,10 @@
 
   // Adjusts the visualRect in combination with filter, clipper and masker
   // in local coordinates.
-  static void AdjustVisualRectWithResources(const LayoutObject&, FloatRect&);
+  static void AdjustVisualRectWithResources(
+      const LayoutObject&,
+      const FloatRect& object_bounding_box,
+      FloatRect&);
 
   // Determine if the LayoutObject references a filter resource object.
   static bool HasFilterResource(const LayoutObject&);
diff --git a/third_party/blink/renderer/core/loader/link_loader_test.cc b/third_party/blink/renderer/core/loader/link_loader_test.cc
index ce3eadf..9f41a033 100644
--- a/third_party/blink/renderer/core/loader/link_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/link_loader_test.cc
@@ -445,19 +445,19 @@
 
 constexpr ModulePreloadTestParams kModulePreloadTestParams[] = {
     {"", nullptr, nullptr, kCrossOriginAttributeNotSet, kReferrerPolicyDefault,
-     false, network::mojom::FetchCredentialsMode::kOmit},
+     false, network::mojom::FetchCredentialsMode::kSameOrigin},
     {"http://example.test/cat.js", nullptr, nullptr,
      kCrossOriginAttributeNotSet, kReferrerPolicyDefault, true,
-     network::mojom::FetchCredentialsMode::kOmit},
+     network::mojom::FetchCredentialsMode::kSameOrigin},
     {"http://example.test/cat.js", nullptr, nullptr,
      kCrossOriginAttributeAnonymous, kReferrerPolicyDefault, true,
      network::mojom::FetchCredentialsMode::kSameOrigin},
     {"http://example.test/cat.js", "nonce", nullptr,
      kCrossOriginAttributeNotSet, kReferrerPolicyNever, true,
-     network::mojom::FetchCredentialsMode::kOmit},
+     network::mojom::FetchCredentialsMode::kSameOrigin},
     {"http://example.test/cat.js", nullptr, "sha384-abc",
      kCrossOriginAttributeNotSet, kReferrerPolicyDefault, true,
-     network::mojom::FetchCredentialsMode::kOmit}};
+     network::mojom::FetchCredentialsMode::kSameOrigin}};
 
 class LinkLoaderModulePreloadTest
     : public testing::TestWithParam<ModulePreloadTestParams> {};
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
index 8dced17..f5f7541 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
@@ -112,6 +112,14 @@
 
   ResourceLoaderOptions options;
 
+  // TODO(domfarolino): Probably insert step 6 here, which sets the credentials
+  // mode of "worker"- and "sharedworker"-destined requests to "same-origin",
+  // ensuring cross-origin module workers result in a network error, once
+  // https://github.com/whatwg/html/pull/3656 is merged. Cross-origin
+  // workers are not supported anyways due to URL checks in
+  // AbstractWorker::ResolveURL, but it might be good to try and follow the spec
+  // here, and let this resolve in a network error as Fetch dictates?
+
   // Step 6. "Set up the module script request given request and options."
   // [spec text]
   // [SMSR]
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc
index bad410a..a97bc492 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.cc
+++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -32,11 +32,12 @@
     const KURL& url,
     Document& element_document,
     const ScriptFetchOptions& options,
+    CrossOriginAttributeValue cross_origin,
     const WTF::TextEncoding& encoding,
     ScriptElementBase* element,
     FetchParameters::DeferOption defer) {
   FetchParameters params = options.CreateFetchParameters(
-      url, element_document.GetSecurityOrigin(), encoding, defer);
+      url, element_document.GetSecurityOrigin(), cross_origin, encoding, defer);
 
   ClassicPendingScript* pending_script = new ClassicPendingScript(
       element, TextPosition(), ScriptSourceLocationType::kExternalFile, options,
@@ -277,8 +278,10 @@
   }
 
   if (intervened_) {
+    CrossOriginAttributeValue cross_origin =
+        GetCrossOriginAttributeValue(element->CrossOriginAttributeValue());
     PossiblyFetchBlockedDocWriteScript(resource, element->GetDocument(),
-                                       options_);
+                                       options_, cross_origin);
   }
 
   // We are now waiting for script streaming to finish.
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.h b/third_party/blink/renderer/core/script/classic_pending_script.h
index e99a296f..98777d1 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.h
+++ b/third_party/blink/renderer/core/script/classic_pending_script.h
@@ -36,6 +36,7 @@
   static ClassicPendingScript* Fetch(const KURL&,
                                      Document&,
                                      const ScriptFetchOptions&,
+                                     CrossOriginAttributeValue,
                                      const WTF::TextEncoding&,
                                      ScriptElementBase*,
                                      FetchParameters::DeferOption);
diff --git a/third_party/blink/renderer/core/script/document_write_intervention.cc b/third_party/blink/renderer/core/script/document_write_intervention.cc
index 69277a5..6a35c53 100644
--- a/third_party/blink/renderer/core/script/document_write_intervention.cc
+++ b/third_party/blink/renderer/core/script/document_write_intervention.cc
@@ -199,9 +199,11 @@
   return true;
 }
 
-void PossiblyFetchBlockedDocWriteScript(const Resource* resource,
-                                        Document& element_document,
-                                        const ScriptFetchOptions& options) {
+void PossiblyFetchBlockedDocWriteScript(
+    const Resource* resource,
+    Document& element_document,
+    const ScriptFetchOptions& options,
+    CrossOriginAttributeValue cross_origin) {
   if (!resource->ErrorOccurred()) {
     EmitWarningNotBlocked(resource->Url(), element_document);
     return;
@@ -214,7 +216,7 @@
   EmitErrorBlocked(resource->Url(), element_document);
 
   FetchParameters params = options.CreateFetchParameters(
-      resource->Url(), element_document.GetSecurityOrigin(),
+      resource->Url(), element_document.GetSecurityOrigin(), cross_origin,
       resource->Encoding(), FetchParameters::kIdleLoad);
   AddHeader(&params);
   ScriptResource::Fetch(params, element_document.Fetcher(), nullptr);
diff --git a/third_party/blink/renderer/core/script/document_write_intervention.h b/third_party/blink/renderer/core/script/document_write_intervention.h
index 1bb6976..b68b5413 100644
--- a/third_party/blink/renderer/core/script/document_write_intervention.h
+++ b/third_party/blink/renderer/core/script/document_write_intervention.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_DOCUMENT_WRITE_INTERVENTION_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_DOCUMENT_WRITE_INTERVENTION_H_
 
+#include "third_party/blink/renderer/platform/cross_origin_attribute_value.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 
 // document.write() intervention may
@@ -39,7 +40,8 @@
 // MaybeDisallowFetchForDocWrittenScript() returns true.
 void PossiblyFetchBlockedDocWriteScript(const Resource*,
                                         Document&,
-                                        const ScriptFetchOptions&);
+                                        const ScriptFetchOptions&,
+                                        CrossOriginAttributeValue);
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/script/script_loader.cc b/third_party/blink/renderer/core/script/script_loader.cc
index a97042b4..4d7fdbe 100644
--- a/third_party/blink/renderer/core/script/script_loader.cc
+++ b/third_party/blink/renderer/core/script/script_loader.cc
@@ -202,13 +202,18 @@
   return nomodule && script_type == ScriptType::kClassic;
 }
 
-// Step 16 of
-// https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
+// Corresponds to
+// https://html.spec.whatwg.org/multipage/urls-and-fetching.html#module-script-credentials-mode
+// which is a translation of the CORS settings attribute in the context of
+// module scripts. This is used in:
+//   - Step 17 of
+//     https://html.spec.whatwg.org/multipage/scripting.html#prepare-a-script
+//   - Step 6 of obtaining a preloaded module script
+//     https://html.spec.whatwg.org/multipage/links.html#link-type-modulepreload.
 network::mojom::FetchCredentialsMode ScriptLoader::ModuleScriptCredentialsMode(
     CrossOriginAttributeValue cross_origin) {
   switch (cross_origin) {
     case kCrossOriginAttributeNotSet:
-      return network::mojom::FetchCredentialsMode::kOmit;
     case kCrossOriginAttributeAnonymous:
       return network::mojom::FetchCredentialsMode::kSameOrigin;
     case kCrossOriginAttributeUseCredentials:
@@ -475,7 +480,8 @@
       //
       // Fetch a classic script given url, settings object, options, classic
       // script CORS setting, and encoding.</spec>
-      FetchClassicScript(url, element_document, options, encoding);
+      FetchClassicScript(url, element_document, options, cross_origin,
+                         encoding);
     } else {
       // - "module":
 
@@ -737,6 +743,7 @@
 void ScriptLoader::FetchClassicScript(const KURL& url,
                                       Document& element_document,
                                       const ScriptFetchOptions& options,
+                                      CrossOriginAttributeValue cross_origin,
                                       const WTF::TextEncoding& encoding) {
   FetchParameters::DeferOption defer = FetchParameters::kNoDefer;
   if (!parser_inserted_ || element_->AsyncAttributeValue() ||
@@ -744,7 +751,7 @@
     defer = FetchParameters::kLazyLoad;
 
   ClassicPendingScript* pending_script = ClassicPendingScript::Fetch(
-      url, element_document, options, encoding, element_, defer);
+      url, element_document, options, cross_origin, encoding, element_, defer);
   prepared_pending_script_ = pending_script;
   resource_keep_alive_ = pending_script->GetResource();
 }
diff --git a/third_party/blink/renderer/core/script/script_loader.h b/third_party/blink/renderer/core/script/script_loader.h
index 7601378..0369a823 100644
--- a/third_party/blink/renderer/core/script/script_loader.h
+++ b/third_party/blink/renderer/core/script/script_loader.h
@@ -127,6 +127,7 @@
   void FetchClassicScript(const KURL&,
                           Document&,
                           const ScriptFetchOptions&,
+                          CrossOriginAttributeValue,
                           const WTF::TextEncoding&);
   // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-module-script-tree
   void FetchModuleScriptTree(const KURL&,
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 07dc7e8b..a42b31fe 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -186,7 +186,8 @@
     return nullptr;
   const DocumentLoader* document_loader =
       GetFrame()->Loader().GetDocumentLoader();
-  DCHECK(document_loader);
+  if (!document_loader)
+    return nullptr;
   ResourceTimingInfo* info = document_loader->GetNavigationTimingInfo();
   if (!info)
     return nullptr;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 1f03eb1..813ebad9 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -1885,6 +1885,23 @@
   return String();
 }
 
+static bool ShouldInsertSpaceBetweenObjectsIfNeeded(AXObject* previous,
+                                                    AXObject* next) {
+  // If we're going between two layoutObjects that are in separate
+  // LayoutBoxes, add whitespace if it wasn't there already. Intuitively if
+  // you have <span>Hello</span><span>World</span>, those are part of the same
+  // LayoutBox so we should return "HelloWorld", but given
+  // <div>Hello</div><div>World</div> the strings are in separate boxes so we
+  // should return "Hello World".
+  if (!IsInSameNonInlineBlockFlow(next->GetLayoutObject(),
+                                  previous->GetLayoutObject()))
+    return true;
+
+  // According to the AccName spec, we need to separate controls from text nodes
+  // using a space.
+  return previous->IsControl() || next->IsControl();
+}
+
 String AXNodeObject::TextFromDescendants(AXObjectSet& visited,
                                          bool recursive) const {
   if (!CanHaveChildren() && recursive)
@@ -1913,24 +1930,18 @@
     if (child->AOMPropertyOrARIAAttributeIsTrue(AOMBooleanProperty::kHidden))
       continue;
 
-    // If we're going between two layoutObjects that are in separate
-    // LayoutBoxes, add whitespace if it wasn't there already. Intuitively if
-    // you have <span>Hello</span><span>World</span>, those are part of the same
-    // LayoutBox so we should return "HelloWorld", but given
-    // <div>Hello</div><div>World</div> the strings are in separate boxes so we
-    // should return "Hello World".
-    if (previous && accumulated_text.length() &&
-        !IsHTMLSpace(accumulated_text[accumulated_text.length() - 1])) {
-      if (!IsInSameNonInlineBlockFlow(child->GetLayoutObject(),
-                                      previous->GetLayoutObject()))
-        accumulated_text.Append(' ');
-    }
-
     String result;
     if (child->IsPresentational())
       result = child->TextFromDescendants(visited, true);
     else
       result = RecursiveTextAlternative(*child, false, visited);
+
+    if (!result.IsEmpty() && previous && accumulated_text.length() &&
+        !IsHTMLSpace(accumulated_text[accumulated_text.length() - 1])) {
+      if (ShouldInsertSpaceBetweenObjectsIfNeeded(previous, child))
+        accumulated_text.Append(' ');
+    }
+
     accumulated_text.Append(result);
     previous = child;
   }
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
index b4b8afd..837a0a2 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_icon_loader.cc
@@ -98,6 +98,7 @@
       network::mojom::FetchRequestMode::kNoCORS);
   resource_request.SetFetchCredentialsMode(
       network::mojom::FetchCredentialsMode::kInclude);
+  resource_request.SetSkipServiceWorker(true);
 
   threadable_loader_ =
       new ThreadableLoader(*execution_context, this, resource_loader_options);
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 48e4fe1c..f56bbd13 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1357,8 +1357,6 @@
     "transforms/transformation_matrix.h",
     "transforms/translate_transform_operation.cc",
     "transforms/translate_transform_operation.h",
-    "ukm_time_aggregator.cc",
-    "ukm_time_aggregator.h",
     "uuid.cc",
     "uuid.h",
     "waitable_event.cc",
@@ -1797,7 +1795,6 @@
     "transforms/rotation_test.cc",
     "transforms/transform_operations_test.cc",
     "transforms/transformation_matrix_test.cc",
-    "ukm_time_aggregator_test.cc",
     "uuid_test.cc",
     "web_icon_sizes_parser_test.cc",
     "web_screen_info_test.cc",
diff --git a/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.cc b/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.cc
index f553884..acc74e3 100644
--- a/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.cc
@@ -13,6 +13,7 @@
 FetchParameters ScriptFetchOptions::CreateFetchParameters(
     const KURL& url,
     const SecurityOrigin* security_origin,
+    CrossOriginAttributeValue cross_origin,
     const WTF::TextEncoding& encoding,
     FetchParameters::DeferOption defer) const {
   // Step 1. Let request be the result of creating a potential-CORS request
@@ -26,16 +27,8 @@
   params.SetRequestContext(WebURLRequest::kRequestContextScript);
 
   // Step 1. ... and CORS setting. [spec text]
-  //
-  // Instead of using CrossOriginAttributeValue that corresponds to |CORS
-  // setting|, we use ScriptFetchOptions::CredentialsMode().
-  // We shouldn't call SetCrossOriginAccessControl() if CredentialsMode() is
-  // kFetchCredentialsModeOmit, because in that case the request should be
-  // no-cors, while SetCrossOriginAccessControl(kFetchCredentialsModeOmit)
-  // would result in a cors request.
-  if (CredentialsMode() != network::mojom::FetchCredentialsMode::kOmit) {
-    params.SetCrossOriginAccessControl(security_origin, CredentialsMode());
-  }
+  if (cross_origin != kCrossOriginAttributeNotSet)
+    params.SetCrossOriginAccessControl(security_origin, cross_origin);
 
   // Step 2. Set request's client to settings object. [spec text]
   // Note: Implemented at ClassicPendingScript::Fetch().
diff --git a/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h b/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h
index 6aec651..0f20f74 100644
--- a/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h
+++ b/third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_SCRIPT_FETCH_OPTIONS_H_
 
 #include "third_party/blink/public/platform/web_url_request.h"
+#include "third_party/blink/renderer/platform/cross_origin_attribute_value.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h"
 #include "third_party/blink/renderer/platform/loader/fetch/integrity_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
@@ -28,6 +29,9 @@
   // cryptographic nonce is the empty string, integrity metadata is the empty
   // string, parser metadata is "not-parser-inserted", and credentials mode
   // is "omit"." [spec text]
+  // TODO(domfarolino): Update this to use probably "include" or "same-origin"
+  // credentials mode, once spec decision is made at
+  // https://github.com/whatwg/html/pull/3656.
   ScriptFetchOptions()
       : parser_state_(ParserDisposition::kNotParserInserted),
         credentials_mode_(network::mojom::FetchCredentialsMode::kOmit),
@@ -64,6 +68,7 @@
   // Steps 1 and 3.
   FetchParameters CreateFetchParameters(const KURL&,
                                         const SecurityOrigin*,
+                                        CrossOriginAttributeValue,
                                         const WTF::TextEncoding&,
                                         FetchParameters::DeferOption) const;
 
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn
index 4fef56f..564587c5 100644
--- a/third_party/crashpad/crashpad/util/BUILD.gn
+++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -650,14 +650,6 @@
     }
   }
 
-
-  if (crashpad_is_in_chromium) {
-    if (is_asan && is_component_build) {
-      # TODO(crbug.com/856174): Re-enable these once Windows ASan is fixed.
-      sources -= [ "stdlib/string_number_conversion_test.cc" ]
-    }
-  }
-
   data = [
     "net/testdata/",
   ]
diff --git a/third_party/libFuzzer/BUILD.gn b/third_party/libFuzzer/BUILD.gn
index f11bdc638..70d5c4f 100644
--- a/third_party/libFuzzer/BUILD.gn
+++ b/third_party/libFuzzer/BUILD.gn
@@ -17,11 +17,6 @@
     "src/FuzzerDataFlowTrace.cpp",
     "src/FuzzerDriver.cpp",
     "src/FuzzerExtFunctionsDlsym.cpp",
-
-    # Don't compile FuzzerExtFunctionsDlsymWin.cpp since it prevents use of
-    # LLVMFuzzerInitialize and LLVMFuzzerCustom* in non-component fuzzer builds
-    # on Windows and component fuzzer builds are not supported on Windows.
-    # See https://reviews.llvm.org/D51700 for more details.
     "src/FuzzerExtFunctionsWeak.cpp",
     "src/FuzzerExtFunctionsWeakAlias.cpp",
     "src/FuzzerExtraCounters.cpp",
diff --git a/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.cpp b/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.cpp
index f0a9bf3..699b740 100644
--- a/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.cpp
+++ b/tools/clang/blink_gc_plugin/CheckFinalizerVisitor.cpp
@@ -56,7 +56,7 @@
 
 void MightBeCollectedVisitor::VisitCollection(Collection* edge) {
   if (edge->on_heap() && !is_eagerly_finalized_) {
-    might_be_collected_ = !edge->is_root();
+    might_be_collected_ = true;
   } else {
     edge->AcceptMembers(this);
   }
diff --git a/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.cpp b/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.cpp
index ab2d260..92cfa97 100644
--- a/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.cpp
+++ b/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.cpp
@@ -46,8 +46,3 @@
 void CheckGCRootsVisitor::VisitPersistent(Persistent* edge) {
   gc_roots_.push_back(current_);
 }
-
-void CheckGCRootsVisitor::AtCollection(Collection* edge) {
-  if (edge->is_root())
-    gc_roots_.push_back(current_);
-}
diff --git a/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.h b/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.h
index b3cede16..6257d4e 100644
--- a/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.h
+++ b/tools/clang/blink_gc_plugin/CheckGCRootsVisitor.h
@@ -27,7 +27,6 @@
 
   void VisitValue(Value* edge) override;
   void VisitPersistent(Persistent* edge) override;
-  void AtCollection(Collection* edge) override;
 
  private:
   RootPath current_;
diff --git a/tools/clang/blink_gc_plugin/Config.h b/tools/clang/blink_gc_plugin/Config.h
index bd347b8..a4573eb 100644
--- a/tools/clang/blink_gc_plugin/Config.h
+++ b/tools/clang/blink_gc_plugin/Config.h
@@ -79,24 +79,10 @@
   }
 
   static bool IsGCCollection(const std::string& name) {
-    return name == "HeapVector" ||
-           name == "HeapDeque" ||
-           name == "HeapHashSet" ||
-           name == "HeapListHashSet" ||
-           name == "HeapLinkedHashSet" ||
-           name == "HeapHashCountedSet" ||
-           name == "HeapHashMap" ||
-           IsPersistentGCCollection(name);
-  }
-
-  static bool IsPersistentGCCollection(const std::string& name) {
-    return name == "PersistentHeapVector" ||
-           name == "PersistentHeapDeque" ||
-           name == "PersistentHeapHashSet" ||
-           name == "PersistentHeapListHashSet" ||
-           name == "PersistentHeapLinkedHashSet" ||
-           name == "PersistentHeapHashCountedSet" ||
-           name == "PersistentHeapHashMap";
+    return name == "HeapVector" || name == "HeapDeque" ||
+           name == "HeapHashSet" || name == "HeapListHashSet" ||
+           name == "HeapLinkedHashSet" || name == "HeapHashCountedSet" ||
+           name == "HeapHashMap";
   }
 
   static bool IsGCCollectionWithUnsafeIterator(const std::string& name) {
diff --git a/tools/clang/blink_gc_plugin/Edge.h b/tools/clang/blink_gc_plugin/Edge.h
index 5549e6a7..74ccd4d 100644
--- a/tools/clang/blink_gc_plugin/Edge.h
+++ b/tools/clang/blink_gc_plugin/Edge.h
@@ -226,10 +226,7 @@
 class Collection : public Edge {
  public:
   typedef std::vector<Edge*> Members;
-  Collection(RecordInfo* info, bool on_heap, bool is_root)
-      : info_(info),
-        on_heap_(on_heap),
-        is_root_(is_root) {}
+  Collection(RecordInfo* info, bool on_heap) : info_(info), on_heap_(on_heap) {}
   ~Collection() {
     for (Members::iterator it = members_.begin(); it != members_.end(); ++it) {
       assert(*it && "Collection-edge members must be non-null");
@@ -237,9 +234,8 @@
     }
   }
   bool IsCollection() override { return true; }
-  LivenessKind Kind() override { return is_root_ ? kRoot : kStrong; }
+  LivenessKind Kind() override { return kStrong; }
   bool on_heap() { return on_heap_; }
-  bool is_root() { return is_root_; }
   Members& members() { return members_; }
   void Accept(EdgeVisitor* visitor) override { visitor->VisitCollection(this); }
   void AcceptMembers(EdgeVisitor* visitor) {
@@ -248,8 +244,6 @@
   }
   bool NeedsFinalization() override;
   TracingStatus NeedsTracing(NeedsTracingOption) override {
-    if (is_root_)
-      return TracingStatus::Unneeded();
     if (on_heap_)
       return TracingStatus::Needed();
     // For off-heap collections, determine tracing status of members.
@@ -265,7 +259,6 @@
   RecordInfo* info_;
   Members members_;
   bool on_heap_;
-  bool is_root_;
 };
 
 // An iterator edge is a direct edge to some iterator type.
diff --git a/tools/clang/blink_gc_plugin/RecordInfo.cpp b/tools/clang/blink_gc_plugin/RecordInfo.cpp
index 30a5c74..6af11e82 100644
--- a/tools/clang/blink_gc_plugin/RecordInfo.cpp
+++ b/tools/clang/blink_gc_plugin/RecordInfo.cpp
@@ -703,12 +703,11 @@
 
   if (Config::IsGCCollection(info->name()) ||
       Config::IsWTFCollection(info->name())) {
-    bool is_root = Config::IsPersistentGCCollection(info->name());
-    bool on_heap = is_root || info->IsHeapAllocatedCollection();
+    bool on_heap = info->IsHeapAllocatedCollection();
     size_t count = Config::CollectionDimension(info->name());
     if (!info->GetTemplateArgs(count, &args))
       return 0;
-    Collection* edge = new Collection(info, on_heap, is_root);
+    Collection* edge = new Collection(info, on_heap);
     for (TemplateArgs::iterator it = args.begin(); it != args.end(); ++it) {
       if (Edge* member = CreateEdge(*it)) {
         edge->members().push_back(member);
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
index 27825023..3f2797e 100644
--- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h
+++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -277,9 +277,6 @@
 template<typename K, typename V>
 class HeapHashMap : public HashMap<K, V, void, void, void, HeapAllocator> { };
 
-template<typename T>
-class PersistentHeapVector : public Vector<T, 0, HeapAllocator> { };
-
 class Visitor {
  public:
   template <typename T, void (T::*method)(Visitor*)>
diff --git a/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.h b/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.h
index 546d749..8e4d1034 100644
--- a/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.h
+++ b/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.h
@@ -23,7 +23,7 @@
 private:
     PartObject m_part;
     HeapVector<PartObject> m_parts;
-    PersistentHeapVector<Member<HeapObject> > m_objs;
+    Persistent<HeapVector<Member<HeapObject>>> m_objs;
     WeakPersistent<HeapObject> m_weakPersistent;
 };
 
diff --git a/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.txt b/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.txt
index 29286ff..b9127b6 100644
--- a/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.txt
+++ b/tools/clang/blink_gc_plugin/tests/persistent_field_in_gc_managed_class.txt
@@ -21,7 +21,7 @@
 class HeapObject : public GarbageCollected<HeapObject> {
 ^
 ./persistent_field_in_gc_managed_class.h:26:5: note: [blink-gc] Field 'm_objs' defining a GC root declared here:
-    PersistentHeapVector<Member<HeapObject> > m_objs;
+    Persistent<HeapVector<Member<HeapObject>>> m_objs;
     ^
 ./persistent_field_in_gc_managed_class.h:20:1: warning: [blink-gc] Class 'HeapObject' contains GC root in field 'm_weakPersistent'.
 class HeapObject : public GarbageCollected<HeapObject> {
@@ -32,6 +32,9 @@
 ./persistent_field_in_gc_managed_class.h:20:1: warning: [blink-gc] Class 'HeapObject' requires finalization.
 class HeapObject : public GarbageCollected<HeapObject> {
 ^
+./persistent_field_in_gc_managed_class.h:26:5: note: [blink-gc] Field 'm_objs' requiring finalization declared here:
+    Persistent<HeapVector<Member<HeapObject>>> m_objs;
+    ^
 ./persistent_field_in_gc_managed_class.h:27:5: note: [blink-gc] Field 'm_weakPersistent' requiring finalization declared here:
     WeakPersistent<HeapObject> m_weakPersistent;
     ^
diff --git a/tools/clang/scripts/package.py b/tools/clang/scripts/package.py
index 54f92b6a..745362c 100755
--- a/tools/clang/scripts/package.py
+++ b/tools/clang/scripts/package.py
@@ -253,7 +253,7 @@
                  # runtime libraries:
                  'lib/clang/*/lib/darwin/*asan_osx*',
                  'lib/clang/*/lib/darwin/*asan_iossim*',
-                 'lib/clang/*/lib/darwin/*fuzzer*',
+                 'lib/clang/*/lib/darwin/*fuzzer_no_main*',
                  'lib/clang/*/lib/darwin/*profile_osx*',
                  'lib/clang/*/lib/darwin/*profile_iossim*',
                  # And the OSX and ios builtin libraries (iossim is lipo'd into
@@ -270,7 +270,7 @@
     # but not dfsan.
     want.extend(['lib/clang/*/lib/linux/*[atm]san*',
                  'lib/clang/*/lib/linux/*ubsan*',
-                 'lib/clang/*/lib/linux/*libclang_rt.fuzzer*',
+                 'lib/clang/*/lib/linux/*libclang_rt.fuzzer_no_main*',
                  'lib/clang/*/lib/linux/*libclang_rt.san*',
                  'lib/clang/*/lib/linux/*profile*',
                  'lib/clang/*/share/msan_blacklist.txt',
@@ -278,7 +278,7 @@
   elif sys.platform == 'win32':
     want.extend(['lib/clang/*/lib/windows/clang_rt.asan*.dll',
                  'lib/clang/*/lib/windows/clang_rt.asan*.lib',
-                 'lib/clang/*/lib/windows/clang_rt.fuzzer*.lib',
+                 'lib/clang/*/lib/windows/clang_rt.fuzzer_no_main*.lib',
                  'lib/clang/*/lib/windows/clang_rt.profile*.lib',
                  'lib/clang/*/lib/windows/clang_rt.ubsan*.lib',
                  ])
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl
index 24d06b0..65da08de 100644
--- a/tools/gritsettings/translation_expectations.pyl
+++ b/tools/gritsettings/translation_expectations.pyl
@@ -55,10 +55,11 @@
   },
   "android_grds": {
     "languages": [
-      "am", "ar", "bg", "ca", "cs", "da", "de", "el", "en-GB", "es", "es-419",
-      "fa", "fi", "fil", "fr", "hi", "hr", "hu", "id", "it", "iw", "ja", "ko",
-      "lt", "lv", "nl", "no", "pl", "pt-BR", "pt-PT", "ro", "ru", "sk", "sl",
-      "sr", "sv", "sw", "th", "tr", "uk", "vi", "zh-CN", "zh-TW",
+      "am", "ar", "bg", "bn", "ca", "cs", "da", "de", "el", "en-GB", "es",
+      "es-419", "et", "fa", "fi", "fil", "fr", "gu", "hi", "hr", "hu", "id",
+      "it", "iw", "ja", "kn", "ko", "lt", "lv", "ml", "mr", "ms", "nl", "no",
+      "pl", "pt-BR", "pt-PT", "ro", "ru", "sk", "sl", "sr", "sv", "sw", "ta",
+      "te", "th", "tr", "uk", "vi", "zh-CN", "zh-TW",
     ],
     "files": [
       "android_webview/java/strings/android_webview_strings.grd",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7d871b2..bf6ba963 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -12092,6 +12092,7 @@
   <int value="5" label="Android Package Archive (.apk file)">
     application/vnd.android.package-archive MIME type.
   </int>
+  <int value="6" label="Virtual Contact File">text/vcard MIME type.</int>
 </enum>
 
 <enum name="DownloadNotificationForegroundLifecycle">
@@ -36145,6 +36146,24 @@
       label="Account was not seeded before FireRefreshTokenAvailable"/>
 </enum>
 
+<enum name="OCSPResponseStatus">
+  <int value="0" label="Not checked"/>
+  <int value="1" label="Missing"/>
+  <int value="2" label="Provided"/>
+  <int value="3" label="Error response"/>
+  <int value="4" label="Bad producedAt"/>
+  <int value="5" label="No matching response"/>
+  <int value="6" label="Invalid date"/>
+  <int value="7" label="Parse response error"/>
+  <int value="8" label="Response data error"/>
+</enum>
+
+<enum name="OCSPRevocationStatus">
+  <int value="0" label="Good"/>
+  <int value="1" label="Revoked"/>
+  <int value="2" label="Unknown"/>
+</enum>
+
 <enum name="OfflineIndicatorCTREvent">
   <int value="0" label="Displayed"/>
   <int value="1" label="Clicked"/>
@@ -44958,6 +44977,18 @@
   <int value="12" label="Certificate requirements not met"/>
 </enum>
 
+<enum name="SignedExchangeSignatureVerificationResult">
+  <int value="0" label="Success"/>
+  <int value="1" label="No certificate"/>
+  <int value="2" label="No cert-sha256"/>
+  <int value="3" label="cert-sha256 mismatch"/>
+  <int value="4" label="Failed to reconstruct signed message"/>
+  <int value="5" label="Failed to verify signature"/>
+  <int value="6" label="Invalid integrity scheme"/>
+  <int value="7" label="Invalid timestamp"/>
+  <int value="8" label="Unsupported certificate type"/>
+</enum>
+
 <enum name="SigninAccessPoint">
   <int value="0" label="Start page"/>
   <int value="1" label="NTP Link"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 8d217027..9de61c2 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -9112,6 +9112,77 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Blink.MainFrame.CompositingCommitRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for committing paint results to the compositor.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Blink.MainFrame.CompositingRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing Compositing.
+  </summary>
+</histogram>
+
+=
+<histogram base="true" name="Blink.MainFrame.IntersectionRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing Intersection Observations.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Blink.MainFrame.PaintRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing Paint.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Blink.MainFrame.PrePaintRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing PrePaint.
+  </summary>
+</histogram>
+
+<histogram base="true" name="Blink.MainFrame.StyleAndLayoutRatio" units="%">
+  <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+  <summary>
+    The percentage of time between a BeginMainFrame and paint results commit in
+    Blink that is used for computing Style and Layout.
+  </summary>
+</histogram>
+
+<histogram name="Blink.MainFrame.UpdateTime" units="microseconds">
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Time between a BeginMainFrame and paint results commit in Blink.
+
+    This histogram will not record metrics on machines with low-resolution
+    clocks.
+  </summary>
+</histogram>
+
 <histogram name="Blink.MediaDocument.DownloadButton"
     enum="MediaDocumentDownloadButtonType">
   <obsolete>
@@ -30451,6 +30522,17 @@
   </summary>
 </histogram>
 
+<histogram name="Extensions.ManifestIconSetIconWasVisibleForUnpacked"
+    enum="Boolean" expires_after="2019-09-07">
+  <owner>dbertoni@chromium.org</owner>
+  <owner>extensions-core@chromium.org</owner>
+  <summary>
+    Reports whether loading an icon declarated in the extension's manifest icon
+    set is considered visible by our icon analysis code. This stat is only for
+    unpacked extensions, which we check at load time.
+  </summary>
+</histogram>
+
 <histogram name="Extensions.ManifestReloadNeedsRelocalization"
     expires_after="2018-08-30">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -97147,7 +97229,30 @@
   </summary>
 </histogram>
 
-<histogram name="SignedExchange.LoadResult" enum="SignedExchangeLoadResult">
+<histogram name="SignedExchange.CertVerificationResult" enum="NetErrorCodes"
+    expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>ksakamoto@chromium.org</owner>
+  <summary>
+    Reports the result of Signed Exchange cert verification, including success.
+  </summary>
+</histogram>
+
+<histogram name="SignedExchange.CTVerificationResult" enum="CTComplianceStatus"
+    expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>ksakamoto@chromium.org</owner>
+  <summary>
+    Reports the result of Signed Exchange CT verification, including success.
+  </summary>
+</histogram>
+
+<histogram name="SignedExchange.LoadResult" enum="SignedExchangeLoadResult"
+    expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
     Records the result of loading a resource from Signed HTTP Exchange. Emitted
@@ -97155,6 +97260,29 @@
   </summary>
 </histogram>
 
+<histogram name="SignedExchange.OCSPResponseStatus" enum="OCSPResponseStatus"
+    expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>ksakamoto@chromium.org</owner>
+  <summary>
+    The status of OCSP response in Signed Exchange certificates. Reported each
+    time Signed Exchange's OCSP check is performed.
+  </summary>
+</histogram>
+
+<histogram name="SignedExchange.OCSPRevocationStatus"
+    enum="OCSPRevocationStatus" expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>ksakamoto@chromium.org</owner>
+  <summary>
+    Reports the revocation status of OCSP response in Signed Exchange
+    certificates. Emitted when Signed Exchange's OCSP check is performed, but
+    only when an up-to-date OCSP response was stapled.
+  </summary>
+</histogram>
+
 <histogram name="SignedExchange.SignatureVerificationError.Expired"
     units="seconds" expires_after="2019-09-20">
   <owner>kinuko@chromium.org</owner>
@@ -97177,6 +97305,17 @@
   </summary>
 </histogram>
 
+<histogram name="SignedExchange.SignatureVerificationResult"
+    enum="SignedExchangeSignatureVerificationResult" expires_after="2019-09-20">
+  <owner>kinuko@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>ksakamoto@chromium.org</owner>
+  <summary>
+    Reports the result of Signed Exchange signature verification, including
+    success.
+  </summary>
+</histogram>
+
 <histogram name="SignedExchange.TimeUntilExpiration" units="seconds">
   <owner>kinuko@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
@@ -121126,6 +121265,18 @@
       name="Blink.LazyLoad.CrossOriginFrames.InitialDeferralAction"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" separator=".">
+  <suffix name="1msTo5ms" label="Ratio when main frame between 1ms and 5ms."/>
+  <suffix name="LessThan1ms" label="Ratio when main frame shorter than 1ms."/>
+  <suffix name="MoreThan5ms" label="Ratio when main frame longer than 5ms."/>
+  <affected-histogram name="Blink.MainFrame.CompositingCommitRatio"/>
+  <affected-histogram name="Blink.MainFrame.CompositingRatio"/>
+  <affected-histogram name="Blink.MainFrame.IntersectionRatio"/>
+  <affected-histogram name="Blink.MainFrame.PaintRatio"/>
+  <affected-histogram name="Blink.MainFrame.PrePaintRatio"/>
+  <affected-histogram name="Blink.MainFrame.StyleAndLayoutRatio"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="BlinkVisibleLoadTimeSuffixes" separator=".">
   <suffix name="2G" label="2G effective connection type"/>
   <suffix name="3G" label="3G effective connection type"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 9976527..9d4a462 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -547,11 +547,11 @@
 </event>
 
 <event name="Blink.UpdateTime">
-  <owner>vmpstr@chromium.org</owner>
+  <owner>schenney@chromium.org</owner>
   <summary>
     Metrics that measure various update times in Blink. This includes paint,
-    compositing, and layout update times. The metrics are recorded once per
-    second and at the destruction of the local frame root.
+    compositing, and layout update times. The metrics are recorded once per 30
+    seconds and at the destruction of the local frame root.
   </summary>
   <metric name="Compositing.Average">
     <summary>
@@ -559,34 +559,87 @@
       event period.
     </summary>
   </metric>
+  <metric name="Compositing.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken in the compositing phase to the total time for the main frame. An
+      int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="Compositing.WorstCase">
     <summary>
       The longest single time taken by the compositing phase in microseconds in
       the event period.
     </summary>
   </metric>
+  <metric name="Compositing.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever used by the compositing phase
+      within the sample window. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="CompositingCommit.Average">
     <summary>
       The average time taken by the compositing commit at the end of the blink
       lifecycle, in microseconds in the event period.
     </summary>
   </metric>
+  <metric name="CompositingCommit.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken by the compositing commit at the end of the blink lifecycle to the
+      total time for the main frame. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="CompositingCommit.WorstCase">
     <summary>
       The longest single time taken by the compositing commit at the end of the
       blink lifecycle, in microseconds in the event period.
     </summary>
   </metric>
+  <metric name="CompositingCommit.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever taken by the compositing commit at
+      the end of the blink lifecycle to the total time for the main frame. An
+      int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="IntersectionObservation.Average">
     <summary>
       The average time taken to compute IntersectionObserver observations in
       microseconds in the event period.
     </summary>
   </metric>
+  <metric name="IntersectionObservation.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken compute IntersectionObserver observations to the total time for the
+      main frame. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="IntersectionObservation.WorstCase">
     <summary>
-      The longest single time taken by to compute IntersectionObserver
-      observations in microseconds in the event period.
+      The longest single time taken to compute IntersectionObserver observations
+      in microseconds in the event period.
+    </summary>
+  </metric>
+  <metric name="IntersectionObservation.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever taken to compute
+      IntersectionObserver observations within the sample window. An int in the
+      range [0,100].
+    </summary>
+  </metric>
+  <metric name="MainFrame.Average">
+    <summary>
+      The average time between a BeginMainFrame and the commit of paint results,
+      in microseconds.
+    </summary>
+  </metric>
+  <metric name="MainFrame.WorstCase">
+    <summary>
+      The longest single time between a BeginMainFrame and the commit of paint
+      results, in microseconds.
     </summary>
   </metric>
   <metric name="Paint.Average">
@@ -595,36 +648,75 @@
       period.
     </summary>
   </metric>
+  <metric name="Paint.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken in the paint phase to the total time for the main frame. An int in
+      the range [0,100].
+    </summary>
+  </metric>
   <metric name="Paint.WorstCase">
     <summary>
       The longest single time taken by the paint phase in microseconds in the
       event period.
     </summary>
   </metric>
+  <metric name="Paint.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever used by the paint phase within the
+      sample window. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="PrePaint.Average">
     <summary>
       The average time taken by the pre-paint phase in microseconds in the event
       period.
     </summary>
   </metric>
+  <metric name="PrePaint.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken in the pre-paint phase to the total time for the main frame. An int
+      in the range [0,100].
+    </summary>
+  </metric>
   <metric name="PrePaint.WorstCase">
     <summary>
       The longest single time taken by the pre-paint phase in microseconds in
       the event period.
     </summary>
   </metric>
+  <metric name="PrePaint.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever used by the pre-paint phase within
+      the sample window. An int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="StyleAndLayout.Average">
     <summary>
       The average time taken by the style and layout phases in microseconds in
       the event period.
     </summary>
   </metric>
+  <metric name="StyleAndLayout.AverageRatio">
+    <summary>
+      The average over frames within the sample window of the ratio of time
+      taken to update style and layout to the total time for the main frame. An
+      int in the range [0,100].
+    </summary>
+  </metric>
   <metric name="StyleAndLayout.WorstCase">
     <summary>
       The longest single time taken by the style and layout phases in
       microseconds in the event period.
     </summary>
   </metric>
+  <metric name="StyleAndLayout.WorstCaseRatio">
+    <summary>
+      The highest proportion of a frame ever used to compute style and layout
+      within the sample window. An int in the range [0,100].
+    </summary>
+  </metric>
 </event>
 
 <event name="Blink.UseCounter">
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index c447293..c1c47d0 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -64,10 +64,10 @@
 tab_switching.typical_25,vovoy@chromium.org,OS>Performance,,"2016,tabs_switching"
 tracing.tracing_with_background_memory_infra,ssid@chromium.org,,,
 tracing_perftests,"kkraynov@chromium.org, primiano@chromium.org",,,
-v8.browsing_desktop,"mythria@chromium.org, ulan@chromium.org",,,"2016,2018,health_check,infinite_scroll,international,javascript_heavy,webgl"
-v8.browsing_desktop-future,"mythria@chromium.org, ulan@chromium.org",,,"2016,2018,health_check,infinite_scroll,international,javascript_heavy,webgl"
-v8.browsing_mobile,"mythria@chromium.org, ulan@chromium.org",,,"2016,2018,emerging_market,health_check,infinite_scroll,international,javascript_heavy"
-v8.browsing_mobile-future,"mythria@chromium.org, ulan@chromium.org",,,"2016,2018,emerging_market,health_check,infinite_scroll,international,javascript_heavy"
+v8.browsing_desktop,"mythria@chromium.org, ulan@chromium.org",Blink>JavaScript,,"2016,2018,health_check,infinite_scroll,international,javascript_heavy,webgl"
+v8.browsing_desktop-future,"mythria@chromium.org, ulan@chromium.org",Blink>JavaScript,,"2016,2018,health_check,infinite_scroll,international,javascript_heavy,webgl"
+v8.browsing_mobile,"mythria@chromium.org, ulan@chromium.org",Blink>JavaScript,,"2016,2018,emerging_market,health_check,infinite_scroll,international,javascript_heavy"
+v8.browsing_mobile-future,"mythria@chromium.org, ulan@chromium.org",Blink>JavaScript,,"2016,2018,emerging_market,health_check,infinite_scroll,international,javascript_heavy"
 v8.runtime_stats.top_25,cbruni@chromium.org,,,"cold,hot,warm"
 validating_command_buffer_perftests,"piman@chromium.org, chrome-gpu-perf-owners@chromium.org",Internals>GPU,,
 views_perftests,tapted@chromium.org,Internals>Views,,
diff --git a/tools/perf/benchmarks/v8_browsing.py b/tools/perf/benchmarks/v8_browsing.py
index 8922363..399faac 100644
--- a/tools/perf/benchmarks/v8_browsing.py
+++ b/tools/perf/benchmarks/v8_browsing.py
@@ -116,7 +116,9 @@
     return V8BrowsingShouldAddValue(name)
 
 
-@benchmark.Info(emails=['mythria@chromium.org','ulan@chromium.org'])
+@benchmark.Info(
+   emails=['mythria@chromium.org','ulan@chromium.org'],
+   component='Blink>JavaScript')
 class V8DesktopBrowsingBenchmark(
     _V8BrowsingBenchmark):
   PLATFORM = 'desktop'
@@ -131,7 +133,9 @@
     return 'v8.browsing_desktop'
 
 
-@benchmark.Info(emails=['mythria@chromium.org','ulan@chromium.org'])
+@benchmark.Info(
+   emails=['mythria@chromium.org','ulan@chromium.org'],
+   component='Blink>JavaScript')
 class V8MobileBrowsingBenchmark(
     _V8BrowsingBenchmark):
   PLATFORM = 'mobile'
@@ -146,7 +150,9 @@
     return 'v8.browsing_mobile'
 
 
-@benchmark.Info(emails=['mythria@chromium.org','ulan@chromium.org'])
+@benchmark.Info(
+   emails=['mythria@chromium.org','ulan@chromium.org'],
+   component='Blink>JavaScript')
 class V8FutureDesktopBrowsingBenchmark(
     _V8BrowsingBenchmark):
   PLATFORM = 'desktop'
@@ -162,7 +168,9 @@
     return 'v8.browsing_desktop-future'
 
 
-@benchmark.Info(emails=['mythria@chromium.org','ulan@chromium.org'])
+@benchmark.Info(
+   emails=['mythria@chromium.org','ulan@chromium.org'],
+   component='Blink>JavaScript')
 class V8FutureMobileBrowsingBenchmark(
     _V8BrowsingBenchmark):
   PLATFORM = 'mobile'
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index 90158da..2466fc7 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -89,8 +89,6 @@
     "clipboard/clipboard_win.cc",
     "clipboard/clipboard_win.h",
     "clipboard/custom_data_helper_mac.mm",
-    "cocoa/a11y_util.h",
-    "cocoa/a11y_util.mm",
     "cocoa/accessibility_hostable.h",
     "cocoa/animation_utils.h",
     "cocoa/appkit_utils.h",
@@ -105,12 +103,6 @@
     "cocoa/constrained_window/constrained_window_animation.mm",
     "cocoa/controls/button_utils.h",
     "cocoa/controls/button_utils.mm",
-    "cocoa/controls/hyperlink_button_cell.h",
-    "cocoa/controls/hyperlink_button_cell.mm",
-    "cocoa/controls/hyperlink_text_view.h",
-    "cocoa/controls/hyperlink_text_view.mm",
-    "cocoa/controls/imageview_utils.h",
-    "cocoa/controls/imageview_utils.mm",
     "cocoa/controls/textfield_utils.h",
     "cocoa/controls/textfield_utils.mm",
     "cocoa/defaults_utils.h",
@@ -868,8 +860,6 @@
       "cocoa/bubble_closer_unittest.mm",
       "cocoa/cocoa_base_utils_unittest.mm",
       "cocoa/constrained_window/constrained_window_animation_unittest.mm",
-      "cocoa/controls/hyperlink_button_cell_unittest.mm",
-      "cocoa/controls/hyperlink_text_view_unittest.mm",
       "cocoa/focus_tracker_unittest.mm",
       "cocoa/hover_button_unittest.mm",
       "cocoa/hover_image_button_unittest.mm",
diff --git a/ui/base/cocoa/a11y_util.h b/ui/base/cocoa/a11y_util.h
deleted file mode 100644
index a304b77c..0000000
--- a/ui/base/cocoa/a11y_util.h
+++ /dev/null
@@ -1,28 +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 UI_BASE_COCOA_A11Y_UTIL_H
-#define UI_BASE_COCOA_A11Y_UTIL_H
-
-#import <Cocoa/Cocoa.h>
-
-#include "ui/base/ui_base_export.h"
-
-namespace ui {
-namespace a11y_util {
-
-// Hides the given |view| from the accessibility order for Voice Over. This
-// should be used when the view provides no additional information with
-// voice over (i.e., an icon next to a written description of the icon).
-UI_BASE_EXPORT void HideImageFromAccessibilityOrder(NSImageView* view);
-
-// Ask VoiceOver to play a sound for |object|, generally a view or window
-// (undocumented). Built-in apps seem to use this to indicate that something
-// interesting has happened, like a failed download or available completions.
-UI_BASE_EXPORT void PlayElementUpdatedSound(id source);
-
-}  // namespace a11y_util
-}  // namespace ui
-
-#endif  // UI_BASE_COCOA_A11Y_UTIL_H
diff --git a/ui/base/cocoa/a11y_util.mm b/ui/base/cocoa/a11y_util.mm
deleted file mode 100644
index e6a27ad2..0000000
--- a/ui/base/cocoa/a11y_util.mm
+++ /dev/null
@@ -1,25 +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.
-
-#import "ui/base/cocoa/a11y_util.h"
-
-namespace ui {
-namespace a11y_util {
-
-void HideImageFromAccessibilityOrder(NSImageView* view) {
-  // This is the minimum change necessary to get VoiceOver to skip the image
-  // (instead of reading the word "image"). Accessibility mechanisms in OSX
-  // change once in a while, so this may be fragile.
-  [[view cell] accessibilitySetOverrideValue:@""
-                                forAttribute:NSAccessibilityRoleAttribute];
-}
-
-void PlayElementUpdatedSound(id source) {
-  NSAccessibilityPostNotificationWithUserInfo(
-      source, @"AXPlaySound",
-      @{@"AXSoundIdentifier" : @"AXElementUpdatedSound"});
-}
-
-}  // namespace a11y_util
-}  // namespace ui
diff --git a/ui/base/cocoa/controls/button_utils.h b/ui/base/cocoa/controls/button_utils.h
index 8759436..740c9141 100644
--- a/ui/base/cocoa/controls/button_utils.h
+++ b/ui/base/cocoa/controls/button_utils.h
@@ -22,9 +22,6 @@
 
 + (NSButton*)checkboxWithTitle:(NSString*)title;
 
-+ (NSButton*)linkWithTitle:(NSString*)title
-                    action:(SEL)action
-                    target:(id)target;
 @end
 
 #endif  // UI_BASE_COCOA_CONTROLS_BUTTON_UTILS_H_
diff --git a/ui/base/cocoa/controls/button_utils.mm b/ui/base/cocoa/controls/button_utils.mm
index 51a3b44..0a74df2 100644
--- a/ui/base/cocoa/controls/button_utils.mm
+++ b/ui/base/cocoa/controls/button_utils.mm
@@ -4,8 +4,6 @@
 
 #import "ui/base/cocoa/controls/button_utils.h"
 
-#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
-
 @implementation ButtonUtils
 
 + (NSButton*)buttonWithTitle:(NSString*)title
@@ -31,18 +29,4 @@
   return button;
 }
 
-+ (NSButton*)linkWithTitle:(NSString*)title
-                    action:(SEL)action
-                    target:(id)target {
-  NSButton* button = [[[NSButton alloc] initWithFrame:NSZeroRect] autorelease];
-  // The cell has to be replaced before doing any of the other setup, or it will
-  // not get the new configuration.
-  [button setCell:[[[HyperlinkButtonCell alloc] init] autorelease]];
-  [button setAction:action];
-  [button setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]];
-  [button setTarget:target];
-  [button setTitle:title];
-  return button;
-}
-
 @end
diff --git a/ui/base/cocoa/controls/hyperlink_button_cell.h b/ui/base/cocoa/controls/hyperlink_button_cell.h
deleted file mode 100644
index f8753e4..0000000
--- a/ui/base/cocoa/controls/hyperlink_button_cell.h
+++ /dev/null
@@ -1,58 +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 UI_BASE_COCOA_CONTROLS_HYPERLINK_BUTTON_CELL_H_
-#define UI_BASE_COCOA_CONTROLS_HYPERLINK_BUTTON_CELL_H_
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#include "ui/base/ui_base_export.h"
-
-// A HyperlinkButtonCell is used to create an NSButton that looks and acts
-// like a hyperlink. The default styling is to look like blue (#3367D6) text
-// with no underline and to have the pointingHand cursor on mouse over.
-//
-// To use in Interface Builder:
-//  1. Drag out an NSButton.
-//  2. Double click on the button so you have the cell component selected.
-//  3. In the Identity panel of the inspector, set the custom class to this.
-//  4. In the Attributes panel, change the Bezel to Square.
-//  5. In the Size panel, set the Height to 16.
-//
-// Use this if all of your text is a link. If you need text that contains
-// embedded links but also regular text, use HyperlinkTextView.
-
-namespace hyperlink_button_cell {
-
-enum class UI_BASE_EXPORT UnderlineBehavior {
-  ALWAYS,
-  NEVER,
-  ON_HOVER,
-};
-
-}  // namespace hyperlink_button_cell
-
-UI_BASE_EXPORT
-@interface HyperlinkButtonCell : NSButtonCell {
-  base::scoped_nsobject<NSColor> textColor_;
-  hyperlink_button_cell::UnderlineBehavior underlineBehavior_;
-  BOOL mouseIsInside_;
-}
-@property(nonatomic, retain) NSColor* textColor;
-@property(nonatomic, assign) hyperlink_button_cell::UnderlineBehavior
-    underlineBehavior;
-
-+ (NSColor*)defaultTextColor;
-
-// Helper function to create a button with HyperLinkButtonCell as its cell.
-+ (NSButton*)buttonWithString:(NSString*)string;
-
-@end
-
-@interface HyperlinkButtonCell (ExposedForTesting)
-- (NSDictionary*)linkAttributes;
-@end
-
-#endif  // UI_BASE_COCOA_CONTROLS_HYPERLINK_BUTTON_CELL_H_
diff --git a/ui/base/cocoa/controls/hyperlink_button_cell.mm b/ui/base/cocoa/controls/hyperlink_button_cell.mm
deleted file mode 100644
index 754be72..0000000
--- a/ui/base/cocoa/controls/hyperlink_button_cell.mm
+++ /dev/null
@@ -1,167 +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.
-
-#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
-
-using hyperlink_button_cell::UnderlineBehavior;
-
-@interface HyperlinkButtonCell ()
-- (void)customizeButtonCell;
-@end
-
-@implementation HyperlinkButtonCell
-
-@dynamic textColor;
-@synthesize underlineBehavior = underlineBehavior_;
-
-+ (NSColor*)defaultTextColor {
-  // Equates to rgb(51, 103, 214) or #3367D6.
-  return [NSColor colorWithCalibratedRed:51.0/255.0
-                                   green:103.0/255.0
-                                    blue:214.0/255.0
-                                   alpha:1.0];
-}
-
-+ (NSButton*)buttonWithString:(NSString*)string {
-  NSButton* button = [[[NSButton alloc] initWithFrame:NSZeroRect] autorelease];
-  base::scoped_nsobject<HyperlinkButtonCell> cell(
-      [[HyperlinkButtonCell alloc] initTextCell:string]);
-  [cell setAlignment:NSLeftTextAlignment];
-  [button setCell:cell.get()];
-  [button setBezelStyle:NSRegularSquareBezelStyle];
-  return button;
-}
-
-// Designated initializer.
-- (id)init {
-  if ((self = [super init])) {
-    [self customizeButtonCell];
-  }
-  return self;
-}
-
-// Initializer called when the cell is loaded from the NIB.
-- (id)initWithCoder:(NSCoder*)aDecoder {
-  if ((self = [super initWithCoder:aDecoder])) {
-    [self customizeButtonCell];
-  }
-  return self;
-}
-
-// Initializer for code-based creation.
-- (id)initTextCell:(NSString*)title {
-  if ((self = [super initTextCell:title])) {
-    [self customizeButtonCell];
-  }
-  return self;
-}
-
-- (id)copyWithZone:(NSZone*)zone {
-  NSColor* color = textColor_.release();
-  HyperlinkButtonCell* cell = [super copyWithZone:zone];
-  cell->textColor_.reset([color copy]);
-  textColor_.reset(color);
-  return cell;
-}
-
-// Because an NSButtonCell has multiple initializers, this method performs the
-// common cell customization code.
-- (void)customizeButtonCell {
-  [self setBordered:NO];
-  [self setTextColor:[HyperlinkButtonCell defaultTextColor]];
-  [self setUnderlineBehavior:UnderlineBehavior::NEVER];
-
-  CGFloat fontSize = [NSFont systemFontSizeForControlSize:[self controlSize]];
-  NSFont* font = [NSFont controlContentFontOfSize:fontSize];
-  [self setFont:font];
-
-  // Do not change button appearance when we are pushed.
-  [self setHighlightsBy:NSNoCellMask];
-
-  // We need to set this so that we can override |-mouseEntered:| and
-  // |-mouseExited:| to change the cursor style on hover states.
-  [self setShowsBorderOnlyWhileMouseInside:YES];
-}
-
-- (void)setControlSize:(NSControlSize)size {
-  [super setControlSize:size];
-  [self customizeButtonCell];  // recompute |font|.
-}
-
-// Creates the NSDictionary of attributes for the attributed string.
-- (NSDictionary*)linkAttributes {
-  NSUInteger underlineMask = NSUnderlineStyleNone;
-  if (underlineBehavior_ == UnderlineBehavior::ALWAYS ||
-      (mouseIsInside_ && [self isEnabled] &&
-       underlineBehavior_ == UnderlineBehavior::ON_HOVER)) {
-    underlineMask = NSUnderlinePatternSolid | NSUnderlineStyleSingle;
-  }
-
-  base::scoped_nsobject<NSMutableParagraphStyle> paragraphStyle(
-      [[NSParagraphStyle defaultParagraphStyle] mutableCopy]);
-  [paragraphStyle setAlignment:[self alignment]];
-  [paragraphStyle setLineBreakMode:[self lineBreakMode]];
-
-  return [NSDictionary dictionaryWithObjectsAndKeys:
-      [self textColor], NSForegroundColorAttributeName,
-      [NSNumber numberWithInt:underlineMask], NSUnderlineStyleAttributeName,
-      [self font], NSFontAttributeName,
-      [NSCursor pointingHandCursor], NSCursorAttributeName,
-      paragraphStyle.get(), NSParagraphStyleAttributeName,
-      nil
-  ];
-}
-
-// Override the drawing for the cell so that the custom style attributes
-// can always be applied and so that ellipses will appear when appropriate.
-- (NSRect)drawTitle:(NSAttributedString*)title
-          withFrame:(NSRect)frame
-             inView:(NSView*)controlView {
-  NSDictionary* linkAttributes = [self linkAttributes];
-  NSString* plainTitle = [title string];
-  [plainTitle drawWithRect:frame
-                   options:(NSStringDrawingUsesLineFragmentOrigin |
-                            NSStringDrawingTruncatesLastVisibleLine)
-                attributes:linkAttributes];
-  return frame;
-}
-
-// Override the default behavior to draw the border. Instead, change the cursor.
-- (void)mouseEntered:(NSEvent*)event {
-  mouseIsInside_ = YES;
-  if ([self isEnabled])
-    [[NSCursor pointingHandCursor] push];
-  else
-    [[NSCursor currentCursor] push];
-  if (underlineBehavior_ == UnderlineBehavior::ON_HOVER)
-    [[self controlView] setNeedsDisplay:YES];
-}
-
-- (void)mouseExited:(NSEvent*)event {
-  mouseIsInside_ = NO;
-  [NSCursor pop];
-  if (underlineBehavior_ == UnderlineBehavior::ON_HOVER)
-    [[self controlView] setNeedsDisplay:YES];
-}
-
-// Setters and getters.
-- (NSColor*)textColor {
-  if ([self isEnabled])
-    return textColor_.get();
-  else
-    return [NSColor disabledControlTextColor];
-}
-
-- (void)setTextColor:(NSColor*)color {
-  textColor_.reset([color retain]);
-}
-
-// Override so that |-sizeToFit| works better with this type of cell.
-- (NSSize)cellSize {
-  NSSize size = [super cellSize];
-  size.width += 2;
-  return size;
-}
-
-@end
diff --git a/ui/base/cocoa/controls/hyperlink_button_cell_unittest.mm b/ui/base/cocoa/controls/hyperlink_button_cell_unittest.mm
deleted file mode 100644
index 2caf8a6..0000000
--- a/ui/base/cocoa/controls/hyperlink_button_cell_unittest.mm
+++ /dev/null
@@ -1,143 +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.
-
-#import "ui/base/cocoa/controls/hyperlink_button_cell.h"
-
-#import <Cocoa/Cocoa.h>
-
-#include "base/mac/foundation_util.h"
-#include "base/mac/scoped_nsobject.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#import "testing/gtest_mac.h"
-#include "testing/platform_test.h"
-#import "ui/base/test/cocoa_helper.h"
-#include "ui/events/test/cocoa_test_event_utils.h"
-
-namespace ui {
-
-namespace {
-
-class HyperlinkButtonCellTest : public CocoaTest {
- public:
-  HyperlinkButtonCellTest() {
-    NSRect frame = NSMakeRect(0, 0, 50, 30);
-    base::scoped_nsobject<NSButton> view(
-        [[NSButton alloc] initWithFrame:frame]);
-    view_ = view.get();
-    base::scoped_nsobject<HyperlinkButtonCell> cell(
-        [[HyperlinkButtonCell alloc] initTextCell:@"Testing"]);
-    cell_ = cell.get();
-    [view_ setCell:cell_];
-    [[test_window() contentView] addSubview:view_];
-  }
-
-  void TestCellCustomization(HyperlinkButtonCell* cell) {
-    EXPECT_FALSE([cell isBordered]);
-    EXPECT_EQ(NSNoCellMask, [cell_ highlightsBy]);
-    EXPECT_TRUE([cell showsBorderOnlyWhileMouseInside]);
-    EXPECT_TRUE([cell textColor]);
-  }
-
- protected:
-  bool HasUnderlineAttribute(NSDictionary* attributes) {
-    NSNumber* number = base::mac::ObjCCastStrict<NSNumber>(
-        [attributes objectForKey:NSUnderlineStyleAttributeName]);
-    return [number unsignedIntegerValue] != 0;
-  }
-
-  NSButton* view_;
-  HyperlinkButtonCell* cell_;
-};
-
-TEST_VIEW(HyperlinkButtonCellTest, view_)
-
-// Tests the three designated intializers.
-TEST_F(HyperlinkButtonCellTest, Initializers) {
-  TestCellCustomization(cell_);  // |-initTextFrame:|
-  base::scoped_nsobject<HyperlinkButtonCell> cell(
-      [[HyperlinkButtonCell alloc] init]);
-  TestCellCustomization(cell.get());
-
-  // Need to create a dummy archiver to test |-initWithCoder:|.
-  NSData* emptyData = [NSKeyedArchiver archivedDataWithRootObject:@""];
-  NSCoder* coder =
-    [[[NSKeyedUnarchiver alloc] initForReadingWithData:emptyData] autorelease];
-  cell.reset([[HyperlinkButtonCell alloc] initWithCoder:coder]);
-  TestCellCustomization(cell);
-}
-
-// Test set color.
-TEST_F(HyperlinkButtonCellTest, SetTextColor) {
-  NSColor* textColor = [NSColor redColor];
-  EXPECT_NE(textColor, [cell_ textColor]);
-  [cell_ setTextColor:textColor];
-  EXPECT_EQ(textColor, [cell_ textColor]);
-}
-
-// Test mouse events.
-TEST_F(HyperlinkButtonCellTest, MouseHover) {
-  [[NSCursor disappearingItemCursor] push];  // Set a known state.
-  [cell_ mouseEntered:cocoa_test_event_utils::EnterEvent()];
-  EXPECT_EQ([NSCursor pointingHandCursor], [NSCursor currentCursor]);
-  [cell_ mouseExited:cocoa_test_event_utils::ExitEvent()];
-  EXPECT_EQ([NSCursor disappearingItemCursor], [NSCursor currentCursor]);
-  [NSCursor pop];
-}
-
-// Test mouse events when button is disabled. {
-TEST_F(HyperlinkButtonCellTest, MouseHoverWhenDisabled) {
-  [cell_ setEnabled:NO];
-
-  [[NSCursor disappearingItemCursor] push];  // Set a known state.
-  [cell_ mouseEntered:cocoa_test_event_utils::EnterEvent()];
-  EXPECT_EQ([NSCursor disappearingItemCursor], [NSCursor currentCursor]);
-
-  [cell_ mouseExited:cocoa_test_event_utils::ExitEvent()];
-  EXPECT_EQ([NSCursor disappearingItemCursor], [NSCursor currentCursor]);
-  [NSCursor pop];
-  [NSCursor pop];
-}
-
-// Test underline on hover.
-TEST_F(HyperlinkButtonCellTest, UnderlineOnHover) {
-  // Default is for no underline.
-  EXPECT_FALSE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseEntered:cocoa_test_event_utils::EnterEvent()];
-  EXPECT_FALSE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseExited:cocoa_test_event_utils::ExitEvent()];
-  EXPECT_FALSE(HasUnderlineAttribute([cell_ linkAttributes]));
-
-  // Setting behavior to ALWAYS will result in always having an underline.
-  [cell_ setUnderlineBehavior:hyperlink_button_cell::UnderlineBehavior::ALWAYS];
-  EXPECT_TRUE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseEntered:cocoa_test_event_utils::EnterEvent()];
-  EXPECT_TRUE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseExited:cocoa_test_event_utils::ExitEvent()];
-  EXPECT_TRUE(HasUnderlineAttribute([cell_ linkAttributes]));
-
-  // Setting behavior to ON_HOVER will result in only underlining when the
-  // mouse is hovering over the link.
-  [cell_ setUnderlineBehavior:
-      hyperlink_button_cell::UnderlineBehavior::ON_HOVER];
-  EXPECT_FALSE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseEntered:cocoa_test_event_utils::EnterEvent()];
-  EXPECT_TRUE(HasUnderlineAttribute([cell_ linkAttributes]));
-  [cell_ mouseExited:cocoa_test_event_utils::ExitEvent()];
-  EXPECT_FALSE(HasUnderlineAttribute([cell_ linkAttributes]));
-}
-
-TEST_F(HyperlinkButtonCellTest, Copy) {
-  base::scoped_nsobject<HyperlinkButtonCell> cell1([[HyperlinkButtonCell alloc]
-      initTextCell:@"Cell"]);
-  [cell1 setTextColor:[NSColor redColor]];
-
-  base::scoped_nsobject<HyperlinkButtonCell> cell2([cell1 copy]);
-  EXPECT_NSEQ([cell1 textColor], [cell2 textColor]);
-  [cell1 setTextColor:[NSColor purpleColor]];
-  [cell2 setTextColor:[NSColor greenColor]];
-}
-
-}  // namespace
-
-}  // namespace ui
diff --git a/ui/base/cocoa/controls/hyperlink_text_view.h b/ui/base/cocoa/controls/hyperlink_text_view.h
deleted file mode 100644
index 0a0cb440..0000000
--- a/ui/base/cocoa/controls/hyperlink_text_view.h
+++ /dev/null
@@ -1,39 +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.
-
-#import <Cocoa/Cocoa.h>
-
-#include "ui/base/ui_base_export.h"
-
-@class NSColor;
-
-// HyperlinkTextView is an NSTextView subclass for unselectable, linkable text.
-// This subclass doesn't show the text caret or IBeamCursor, whereas the base
-// class NSTextView displays both with full keyboard accessibility enabled.
-UI_BASE_EXPORT
-@interface HyperlinkTextView : NSTextView {
- @private
-  BOOL refusesFirstResponder_;
-  BOOL drawsBackgroundUsingSuperview_;
-  BOOL isValidLink_;
-}
-
-@property(nonatomic, assign) BOOL drawsBackgroundUsingSuperview;
-
-// Set the |message| displayed by the HyperlinkTextView, using |font| and
-// |messageColor|.
-- (void)setMessage:(NSString*)message
-          withFont:(NSFont*)font
-      messageColor:(NSColor*)messageColor;
-
-// Marks a |range| within the given message as a link. Pass nil as the url to
-// create a link that can neither be copied nor dragged.
-- (void)addLinkRange:(NSRange)range
-             withURL:(NSString*)url
-           linkColor:(NSColor*)linkColor;
-
-// This is NO (by default) if the view rejects first responder status.
-- (void)setRefusesFirstResponder:(BOOL)refusesFirstResponder;
-
-@end
diff --git a/ui/base/cocoa/controls/hyperlink_text_view.mm b/ui/base/cocoa/controls/hyperlink_text_view.mm
deleted file mode 100644
index 86204e9..0000000
--- a/ui/base/cocoa/controls/hyperlink_text_view.mm
+++ /dev/null
@@ -1,179 +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.
-
-#import "ui/base/cocoa/controls/hyperlink_text_view.h"
-
-#include "base/logging.h"
-#include "base/mac/scoped_nsobject.h"
-#include "ui/base/cocoa/nsview_additions.h"
-
-// The baseline shift for text in the NSTextView.
-const float kTextBaselineShift = -1.0;
-
-@interface HyperlinkTextView(Private)
-// Initialize the NSTextView properties for this subclass.
-- (void)configureTextView;
-
-// Change the current IBeamCursor to an arrowCursor.
-- (void)fixupCursor;
-@end
-
-@implementation HyperlinkTextView
-
-@synthesize drawsBackgroundUsingSuperview = drawsBackgroundUsingSuperview_;
-
-- (id)initWithCoder:(NSCoder*)decoder {
-  if ((self = [super initWithCoder:decoder]))
-    [self configureTextView];
-  return self;
-}
-
-- (id)initWithFrame:(NSRect)frameRect {
-  if ((self = [super initWithFrame:frameRect]))
-    [self configureTextView];
-  return self;
-}
-
-- (BOOL)acceptsFirstResponder {
-  return !refusesFirstResponder_;
-}
-
-- (void)drawViewBackgroundInRect:(NSRect)rect {
-  if (drawsBackgroundUsingSuperview_)
-    [self cr_drawUsingAncestor:[self superview] inRect:rect];
-  else
-    [super drawViewBackgroundInRect:rect];
-}
-
-// Never draw the insertion point (otherwise, it shows up without any user
-// action if full keyboard accessibility is enabled).
-- (BOOL)shouldDrawInsertionPoint {
-  return NO;
-}
-
-- (NSRange)selectionRangeForProposedRange:(NSRange)proposedSelRange
-                              granularity:(NSSelectionGranularity)granularity {
-  // Return a range of length 0 to prevent text selection. Note that the start
-  // of the range (the first argument) is treated as the position of the
-  // subsequent click so it must not be 0. If it is, links that begin at a
-  // non-zero position in the text will not function correctly when they are
-  // clicked in such a way as to look like a possible text selection.
-  return NSMakeRange(proposedSelRange.location, 0);
-}
-
-// Convince NSTextView to not show an I-Beam cursor when the cursor is over the
-// text view but not over actual text.
-//
-// http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg10791.html
-// "NSTextView sets the cursor over itself dynamically, based on considerations
-// including the text under the cursor. It does so in -mouseEntered:,
-// -mouseMoved:, and -cursorUpdate:, so those would be points to consider
-// overriding."
-- (void)mouseMoved:(NSEvent*)e {
-  [super mouseMoved:e];
-  [self fixupCursor];
-}
-
-- (void)mouseEntered:(NSEvent*)e {
-  [super mouseEntered:e];
-  [self fixupCursor];
-}
-
-- (void)cursorUpdate:(NSEvent*)e {
-  [super cursorUpdate:e];
-  [self fixupCursor];
-}
-
-- (void)configureTextView {
-  [self setEditable:NO];
-  [self setDrawsBackground:NO];
-  [self setHorizontallyResizable:NO];
-  [self setVerticallyResizable:NO];
-
-  // When text is rendered, linkTextAttributes override anything set via
-  // addAttributes for text that has NSLinkAttributeName. Set to nil to allow
-  // custom attributes to take precedence.
-  [self setLinkTextAttributes:nil];
-  [self setDisplaysLinkToolTips:NO];
-
-  refusesFirstResponder_ = NO;
-  drawsBackgroundUsingSuperview_ = NO;
-  isValidLink_ = NO;
-}
-
-- (void)fixupCursor {
-  if ([[NSCursor currentCursor] isEqual:[NSCursor IBeamCursor]])
-    [[NSCursor arrowCursor] set];
-}
-
-// Only allow contextual menus (which allow copying of the link URL) if the link
-// is a valid one.
-- (NSMenu*)menuForEvent:(NSEvent*)e {
-  if (isValidLink_)
-    return [super menuForEvent:e];
-
-  return nil;
-}
-
-// Only allow dragging of valid links.
-- (BOOL)dragSelectionWithEvent:(NSEvent*)event
-                        offset:(NSSize)mouseOffset
-                     slideBack:(BOOL)slideBack {
-  if (isValidLink_) {
-    return [super dragSelectionWithEvent:event
-                                  offset:mouseOffset
-                               slideBack:slideBack];
-  }
-
-  return NO;
-}
-
-- (void)setMessage:(NSString*)message
-          withFont:(NSFont*)font
-      messageColor:(NSColor*)messageColor {
-  // Create an attributes dictionary for the message and link.
-  NSDictionary* attributes = @{
-    NSForegroundColorAttributeName : messageColor,
-    NSCursorAttributeName : [NSCursor arrowCursor],
-    NSFontAttributeName : font,
-    NSBaselineOffsetAttributeName : @(kTextBaselineShift)
-  };
-
-  // Create the attributed string for the message.
-  base::scoped_nsobject<NSAttributedString> attributedMessage(
-      [[NSMutableAttributedString alloc] initWithString:message
-                                             attributes:attributes]);
-
-  // Update the text view with the new text.
-  [[self textStorage] setAttributedString:attributedMessage];
-}
-
-- (void)addLinkRange:(NSRange)range
-             withURL:(NSString*)url
-           linkColor:(NSColor*)linkColor {
-  // If a URL is provided, make sure it is a valid one.
-  if (url) {
-    DCHECK_GT([url length], 0u);
-    DCHECK([NSURL URLWithString:url]);
-    isValidLink_ = YES;
-  } else {
-    url = @"";
-    isValidLink_ = NO;
-  }
-  NSDictionary* attributes = @{
-    NSForegroundColorAttributeName : linkColor,
-    NSUnderlineStyleAttributeName : @(YES),
-    NSCursorAttributeName : [NSCursor pointingHandCursor],
-    NSLinkAttributeName : url,
-    NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)
-  };
-
-  [[self textStorage] addAttributes:attributes range:range];
-}
-
-- (void)setRefusesFirstResponder:(BOOL)refusesFirstResponder {
-  refusesFirstResponder_ = refusesFirstResponder;
-}
-
-@end
diff --git a/ui/base/cocoa/controls/hyperlink_text_view_unittest.mm b/ui/base/cocoa/controls/hyperlink_text_view_unittest.mm
deleted file mode 100644
index d4fbd07..0000000
--- a/ui/base/cocoa/controls/hyperlink_text_view_unittest.mm
+++ /dev/null
@@ -1,155 +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.
-
-#import "ui/base/cocoa/controls/hyperlink_text_view.h"
-
-#include "base/mac/scoped_nsobject.h"
-#include "testing/gtest_mac.h"
-#import "ui/base/test/cocoa_helper.h"
-
-namespace {
-
-class HyperlinkTextViewTest : public ui::CocoaTest {
- public:
-  HyperlinkTextViewTest() {
-    NSRect frame = NSMakeRect(0, 0, 50, 50);
-    base::scoped_nsobject<HyperlinkTextView> view(
-        [[HyperlinkTextView alloc] initWithFrame:frame]);
-    view_ = view.get();
-    [[test_window() contentView] addSubview:view_];
-  }
-
-  NSFont* GetDefaultFont() {
-    return [NSFont labelFontOfSize:
-         [NSFont systemFontSizeForControlSize:NSRegularControlSize]];
-  }
-
-  NSDictionary* GetDefaultTextAttributes() {
-    const float kTextBaselineShift = -1.0;
-    return @{
-      NSForegroundColorAttributeName : [NSColor blackColor],
-      NSCursorAttributeName : [NSCursor arrowCursor],
-      NSFontAttributeName : GetDefaultFont(),
-      NSBaselineOffsetAttributeName : @(kTextBaselineShift)
-    };
-  }
-
-  NSMutableDictionary* GetDefaultLinkAttributes() {
-    if (!linkAttributes_.get()) {
-      linkAttributes_.reset(
-          [[NSMutableDictionary dictionaryWithDictionary:
-              GetDefaultTextAttributes()] retain]);
-      [linkAttributes_ addEntriesFromDictionary:@{
-        NSForegroundColorAttributeName : [NSColor blueColor],
-        NSUnderlineStyleAttributeName : @(YES),
-        NSCursorAttributeName : [NSCursor pointingHandCursor],
-        NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle),
-        NSLinkAttributeName : @""
-      }];
-    }
-    return [NSMutableDictionary dictionaryWithDictionary:linkAttributes_];
-  }
-
-  HyperlinkTextView* view_;
-
- private:
-  base::scoped_nsobject<NSMutableDictionary> linkAttributes_;
-};
-
-TEST_VIEW(HyperlinkTextViewTest, view_);
-
-TEST_F(HyperlinkTextViewTest, TestSelectionRange) {
-  NSRange actualRange;
-
-  // The length of the selection range should be 0.
-  actualRange = [view_ selectionRangeForProposedRange:NSMakeRange(0, 20)
-                                          granularity:NSSelectByCharacter];
-  EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, 0), actualRange));
-
-  // While the location should always match the location of the proposed range.
-  actualRange = [view_ selectionRangeForProposedRange:NSMakeRange(50, 100)
-                                          granularity:NSSelectByCharacter];
-  EXPECT_TRUE(NSEqualRanges(NSMakeRange(50, 0), actualRange));
-}
-
-TEST_F(HyperlinkTextViewTest, TestViewConfiguration) {
-  EXPECT_FALSE([view_ isEditable]);
-  EXPECT_FALSE([view_ drawsBackground]);
-  EXPECT_FALSE([view_ isHorizontallyResizable]);
-  EXPECT_FALSE([view_ isVerticallyResizable]);
-}
-
-TEST_F(HyperlinkTextViewTest, TestSetMessage) {
-  // Verifies setMessage sets text and attributes properly.
-  NSString* message = @"Test message";
-  [view_ setMessage:message
-           withFont:GetDefaultFont()
-       messageColor:[NSColor blackColor]];
-  EXPECT_NSEQ(@"Test message", [[view_ textStorage] string]);
-
-  NSDictionary* attributes;
-  NSRange rangeLimit = NSMakeRange(0, [message length]);
-  NSRange range;
-  attributes = [[view_ textStorage] attributesAtIndex:0
-                                longestEffectiveRange:&range
-                                              inRange:rangeLimit];
-  EXPECT_EQ(0U, range.location);
-  EXPECT_EQ([message length], range.length);
-  EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
-}
-
-TEST_F(HyperlinkTextViewTest, TestAddLinkRange) {
-  NSString* message = @"One Two Three Four";
-  [view_ setMessage:message
-           withFont:GetDefaultFont()
-       messageColor:[NSColor blackColor]];
-
-  NSColor* blue = [NSColor blueColor];
-  [view_ addLinkRange:NSMakeRange(4,3) withURL:@"http://2" linkColor:blue];
-  [view_ addLinkRange:NSMakeRange(14,4) withURL:@"http://4" linkColor:blue];
-
-  NSDictionary* attributes;
-  NSRange rangeLimit = NSMakeRange(0, [message length]);
-  NSRange range;
-  attributes = [[view_ textStorage] attributesAtIndex:0
-                                longestEffectiveRange:&range
-                                              inRange:rangeLimit];
-  EXPECT_EQ(0U, range.location);
-  EXPECT_EQ(4U, range.length);
-  EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
-
-  NSMutableDictionary* linkAttributes = GetDefaultLinkAttributes();
-  [linkAttributes setObject:@"http://2" forKey:NSLinkAttributeName];
-  attributes = [[view_ textStorage] attributesAtIndex:4
-                                longestEffectiveRange:&range
-                                              inRange:rangeLimit];
-  EXPECT_EQ(4U, range.location);
-  EXPECT_EQ(3U, range.length);
-  EXPECT_NSEQ(linkAttributes, attributes);
-
-  attributes = [[view_ textStorage] attributesAtIndex:7
-                                longestEffectiveRange:&range
-                                              inRange:rangeLimit];
-  EXPECT_EQ(7U, range.location);
-  EXPECT_EQ(7U, range.length);
-  EXPECT_NSEQ(GetDefaultTextAttributes(), attributes);
-
-  [linkAttributes setObject:@"http://4" forKey:NSLinkAttributeName];
-  attributes = [[view_ textStorage] attributesAtIndex:14
-                                longestEffectiveRange:&range
-                                              inRange:rangeLimit];
-  EXPECT_EQ(14U, range.location);
-  EXPECT_EQ(4U, range.length);
-  EXPECT_NSEQ(linkAttributes, attributes);
-}
-
-TEST_F(HyperlinkTextViewTest, FirstResponderBehavior) {
-  // By default, accept.
-  EXPECT_TRUE([view_ acceptsFirstResponder]);
-
-  [view_ setRefusesFirstResponder:YES];
-  EXPECT_FALSE([view_ acceptsFirstResponder]);
-}
-
-}  // namespace
diff --git a/ui/base/cocoa/controls/imageview_utils.h b/ui/base/cocoa/controls/imageview_utils.h
deleted file mode 100644
index b0e3570..0000000
--- a/ui/base/cocoa/controls/imageview_utils.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_COCOA_CONTROLS_IMAGEVIEW_UTILS_H_
-#define UI_BASE_COCOA_CONTROLS_IMAGEVIEW_UTILS_H_
-
-#include "ui/base/ui_base_export.h"
-
-#include <Cocoa/Cocoa.h>
-
-UI_BASE_EXPORT
-@interface ImageViewUtils : NSObject
-
-// These methods are a polyfill for convenience constructors that exist on
-// NSImageView in macOS 10.12+.
-// TODO(ellyjones): once we target only 10.12+, delete these and migrate
-// callers over to NSImageView directly.
-+ (NSImageView*)imageViewWithImage:(NSImage*)image;
-
-@end
-
-#endif  // UI_BASE_COCOA_CONTROLS_IMAGEVIEW_UTILS_H_
diff --git a/ui/base/cocoa/controls/imageview_utils.mm b/ui/base/cocoa/controls/imageview_utils.mm
deleted file mode 100644
index a12d2b4c..0000000
--- a/ui/base/cocoa/controls/imageview_utils.mm
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "ui/base/cocoa/controls/imageview_utils.h"
-
-@implementation ImageViewUtils
-
-+ (NSImageView*)imageViewWithImage:(NSImage*)image {
-  NSImageView* imageView = [[[NSImageView alloc] init] autorelease];
-  [imageView setImage:image];
-  return imageView;
-}
-
-@end
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index bcbdfc13a..92ed2ff0 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -407,6 +407,7 @@
   void DidPresentCompositorFrame(
       uint32_t frame_token,
       const gfx::PresentationFeedback& feedback) override {}
+  void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override {}
 
   // cc::LayerTreeHostSingleThreadClient implementation.
   void DidSubmitCompositorFrame() override;
diff --git a/ui/file_manager/audio_player/icons/audio-player-128.png b/ui/file_manager/audio_player/icons/audio-player-128.png
index 5954c60..049f99e 100644
--- a/ui/file_manager/audio_player/icons/audio-player-128.png
+++ b/ui/file_manager/audio_player/icons/audio-player-128.png
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-16.png b/ui/file_manager/audio_player/icons/audio-player-16.png
new file mode 100644
index 0000000..fd8e0b7
--- /dev/null
+++ b/ui/file_manager/audio_player/icons/audio-player-16.png
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-192.png b/ui/file_manager/audio_player/icons/audio-player-192.png
new file mode 100644
index 0000000..b71cbf45
--- /dev/null
+++ b/ui/file_manager/audio_player/icons/audio-player-192.png
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-256.png b/ui/file_manager/audio_player/icons/audio-player-256.png
deleted file mode 100644
index 2dd439cc..0000000
--- a/ui/file_manager/audio_player/icons/audio-player-256.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-32.png b/ui/file_manager/audio_player/icons/audio-player-32.png
deleted file mode 100644
index e32a22a7..0000000
--- a/ui/file_manager/audio_player/icons/audio-player-32.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-48.png b/ui/file_manager/audio_player/icons/audio-player-48.png
index d7f41c69..dfad22b 100644
--- a/ui/file_manager/audio_player/icons/audio-player-48.png
+++ b/ui/file_manager/audio_player/icons/audio-player-48.png
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-64.png b/ui/file_manager/audio_player/icons/audio-player-64.png
deleted file mode 100644
index 5ace5c8..0000000
--- a/ui/file_manager/audio_player/icons/audio-player-64.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-96.png b/ui/file_manager/audio_player/icons/audio-player-96.png
deleted file mode 100644
index 8b1f007..0000000
--- a/ui/file_manager/audio_player/icons/audio-player-96.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-favicon-16.png b/ui/file_manager/audio_player/icons/audio-player-favicon-16.png
index ace23a2..971bb366 100644
--- a/ui/file_manager/audio_player/icons/audio-player-favicon-16.png
+++ b/ui/file_manager/audio_player/icons/audio-player-favicon-16.png
Binary files differ
diff --git a/ui/file_manager/audio_player/icons/audio-player-favicon-32.png b/ui/file_manager/audio_player/icons/audio-player-favicon-32.png
index 7ff6fd3..6f4941d 100644
--- a/ui/file_manager/audio_player/icons/audio-player-favicon-32.png
+++ b/ui/file_manager/audio_player/icons/audio-player-favicon-32.png
Binary files differ
diff --git a/ui/file_manager/audio_player/js/background.js b/ui/file_manager/audio_player/js/background.js
index 3b31dca..07772e6 100644
--- a/ui/file_manager/audio_player/js/background.js
+++ b/ui/file_manager/audio_player/js/background.js
@@ -4,13 +4,12 @@
 
 /**
  * Icon of the audio player.
- * TODO(yoshiki): Consider providing an exact size icon, instead of relying
- * on downsampling by ash.
+ * Use maximum size and let ash downsample the icon.
  *
  * @type {!string}
  * @const
  */
-var AUDIO_PLAYER_ICON = 'icons/audio-player-64.png';
+var AUDIO_PLAYER_ICON = 'icons/audio-player-192.png';
 
 /**
  * HTML source of the audio player.
diff --git a/ui/file_manager/audio_player/manifest.json b/ui/file_manager/audio_player/manifest.json
index b58f4e02..db47316 100644
--- a/ui/file_manager/audio_player/manifest.json
+++ b/ui/file_manager/audio_player/manifest.json
@@ -8,13 +8,10 @@
   "display_in_launcher": false,
   "incognito" : "split",
   "icons": {
-    "16": "icons/audio-player-favicon-16.png",
-    "32": "icons/audio-player-32.png",
+    "16": "icons/audio-player-16.png",
     "48": "icons/audio-player-48.png",
-    "64": "icons/audio-player-64.png",
-    "96": "icons/audio-player-96.png",
     "128": "icons/audio-player-128.png",
-    "256": "icons/audio-player-256.png"
+    "192": "icons/audio-player-192.png"
   },
   "permissions": [
     "commandLinePrivate",
diff --git a/ui/file_manager/file_manager_resources.grd b/ui/file_manager/file_manager_resources.grd
index 1e37bbc..f5913969 100644
--- a/ui/file_manager/file_manager_resources.grd
+++ b/ui/file_manager/file_manager_resources.grd
@@ -75,12 +75,9 @@
       <include name="IDR_FILE_MANAGER_ICON_128" file="file_manager/common/images/icon128.png" type="BINDATA" />
       <include name="IDR_FILE_MANAGER_ICON_192" file="file_manager/common/images/icon192.png" type="BINDATA" />
       <include name="IDR_FILE_MANAGER_GALLERY_ICON_16" file="gallery/images/icon16.png" type="BINDATA" />
-      <include name="IDR_FILE_MANAGER_GALLERY_ICON_32" file="gallery/images/icon32.png" type="BINDATA" />
       <include name="IDR_FILE_MANAGER_GALLERY_ICON_48" file="gallery/images/icon48.png" type="BINDATA" />
-      <include name="IDR_FILE_MANAGER_GALLERY_ICON_64" file="gallery/images/icon64.png" type="BINDATA" />
-      <include name="IDR_FILE_MANAGER_GALLERY_ICON_96" file="gallery/images/icon96.png" type="BINDATA" />
       <include name="IDR_FILE_MANAGER_GALLERY_ICON_128" file="gallery/images/icon128.png" type="BINDATA" />
-      <include name="IDR_FILE_MANAGER_GALLERY_ICON_256" file="gallery/images/icon256.png" type="BINDATA" />
+      <include name="IDR_FILE_MANAGER_GALLERY_ICON_192" file="gallery/images/icon192.png" type="BINDATA" />
 
       <!-- Resources used for file type icon in launcher search result. -->
       <include name="IDR_FILE_MANAGER_IMG_LAUNCHER_FILETYPE_AUDIO" file="file_manager/foreground/images/launcher_filetypes/launcher_filetype_audio.png" type="BINDATA" />
@@ -136,12 +133,10 @@
       <include name="IDR_VIDEO_PLAYER_JS" file="video_player/js/video_player_scripts.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_VIDEO_PLAYER_BACKGROUND_JS" file="video_player/js/background_scripts.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_VIDEO_PLAYER_ICON_FAVICON_16" file="video_player/images/icon/video-player-favicon-16.png" type="BINDATA" />
-      <include name="IDR_VIDEO_PLAYER_ICON_32" file="video_player/images/icon/video-player-32.png" type="BINDATA" />
+      <include name="IDR_VIDEO_PLAYER_ICON_16" file="video_player/images/icon/video-player-16.png" type="BINDATA" />
       <include name="IDR_VIDEO_PLAYER_ICON_48" file="video_player/images/icon/video-player-48.png" type="BINDATA" />
-      <include name="IDR_VIDEO_PLAYER_ICON_64" file="video_player/images/icon/video-player-64.png" type="BINDATA" />
-      <include name="IDR_VIDEO_PLAYER_ICON_96" file="video_player/images/icon/video-player-96.png" type="BINDATA" />
       <include name="IDR_VIDEO_PLAYER_ICON_128" file="video_player/images/icon/video-player-128.png" type="BINDATA" />
-      <include name="IDR_VIDEO_PLAYER_ICON_256" file="video_player/images/icon/video-player-256.png" type="BINDATA" />
+      <include name="IDR_VIDEO_PLAYER_ICON_192" file="video_player/images/icon/video-player-192.png" type="BINDATA" />
       <include name="IDR_VIDEO_PLAYER_ICON_FAVICON_32" file="video_player/images/icon/video-player-favicon-32.png" type="BINDATA" />
 
       <!-- The AudioPlayer app pages and scripts. -->
@@ -167,12 +162,10 @@
       <include name="IDR_AUDIO_PLAYER_JS" file="audio_player/js/audio_player_scripts.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_AUDIO_PLAYER_ICON_FAVICON_16" file="audio_player/icons/audio-player-favicon-16.png" type="BINDATA" />
       <include name="IDR_AUDIO_PLAYER_ICON_FAVICON_32" file="audio_player/icons/audio-player-favicon-32.png" type="BINDATA" />
-      <include name="IDR_AUDIO_PLAYER_ICON_32" file="audio_player/icons/audio-player-32.png" type="BINDATA" />
+      <include name="IDR_AUDIO_PLAYER_ICON_16" file="audio_player/icons/audio-player-16.png" type="BINDATA" />
       <include name="IDR_AUDIO_PLAYER_ICON_48" file="audio_player/icons/audio-player-48.png" type="BINDATA" />
-      <include name="IDR_AUDIO_PLAYER_ICON_64" file="audio_player/icons/audio-player-64.png" type="BINDATA" />
-      <include name="IDR_AUDIO_PLAYER_ICON_96" file="audio_player/icons/audio-player-96.png" type="BINDATA" />
       <include name="IDR_AUDIO_PLAYER_ICON_128" file="audio_player/icons/audio-player-128.png" type="BINDATA" />
-      <include name="IDR_AUDIO_PLAYER_ICON_256" file="audio_player/icons/audio-player-256.png" type="BINDATA" />
+      <include name="IDR_AUDIO_PLAYER_ICON_192" file="audio_player/icons/audio-player-192.png" type="BINDATA" />
 
       <!-- The Gallery app pages and scripts. -->
       <include name="IDR_GALLERY_MANIFEST" file="gallery/manifest.json" type="BINDATA" />
diff --git a/ui/file_manager/gallery/images/icon128.png b/ui/file_manager/gallery/images/icon128.png
index 9f5399a..5a78096 100644
--- a/ui/file_manager/gallery/images/icon128.png
+++ b/ui/file_manager/gallery/images/icon128.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon16.png b/ui/file_manager/gallery/images/icon16.png
index 1dbf7873..d153978 100644
--- a/ui/file_manager/gallery/images/icon16.png
+++ b/ui/file_manager/gallery/images/icon16.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon192.png b/ui/file_manager/gallery/images/icon192.png
new file mode 100644
index 0000000..991d3f3
--- /dev/null
+++ b/ui/file_manager/gallery/images/icon192.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon256.png b/ui/file_manager/gallery/images/icon256.png
deleted file mode 100644
index f125ceb..0000000
--- a/ui/file_manager/gallery/images/icon256.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon32.png b/ui/file_manager/gallery/images/icon32.png
deleted file mode 100644
index a4ac39b8..0000000
--- a/ui/file_manager/gallery/images/icon32.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon48.png b/ui/file_manager/gallery/images/icon48.png
index 3a957a1..5fc01d92 100644
--- a/ui/file_manager/gallery/images/icon48.png
+++ b/ui/file_manager/gallery/images/icon48.png
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon64.png b/ui/file_manager/gallery/images/icon64.png
deleted file mode 100644
index e0409075..0000000
--- a/ui/file_manager/gallery/images/icon64.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/gallery/images/icon96.png b/ui/file_manager/gallery/images/icon96.png
deleted file mode 100644
index 84ed0f7..0000000
--- a/ui/file_manager/gallery/images/icon96.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/gallery/manifest.json b/ui/file_manager/gallery/manifest.json
index c59f6c7..3436ee31e 100644
--- a/ui/file_manager/gallery/manifest.json
+++ b/ui/file_manager/gallery/manifest.json
@@ -9,12 +9,9 @@
   "incognito" : "split",
   "icons": {
     "16": "images/icon16.png",
-    "32": "images/icon32.png",
     "48": "images/icon48.png",
-    "64": "images/icon64.png",
-    "96": "images/icon96.png",
     "128": "images/icon128.png",
-    "256": "images/icon256.png"
+    "192": "images/icon192.png"
   },
   "permissions": [
     "accessibilityFeatures.read",
diff --git a/ui/file_manager/video_player/images/icon/video-player-128.png b/ui/file_manager/video_player/images/icon/video-player-128.png
index bca680d..e1c081c 100644
--- a/ui/file_manager/video_player/images/icon/video-player-128.png
+++ b/ui/file_manager/video_player/images/icon/video-player-128.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-16.png b/ui/file_manager/video_player/images/icon/video-player-16.png
new file mode 100644
index 0000000..9e070a3
--- /dev/null
+++ b/ui/file_manager/video_player/images/icon/video-player-16.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-192.png b/ui/file_manager/video_player/images/icon/video-player-192.png
new file mode 100644
index 0000000..f93b2be
--- /dev/null
+++ b/ui/file_manager/video_player/images/icon/video-player-192.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-256.png b/ui/file_manager/video_player/images/icon/video-player-256.png
deleted file mode 100644
index 669ca83..0000000
--- a/ui/file_manager/video_player/images/icon/video-player-256.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-32.png b/ui/file_manager/video_player/images/icon/video-player-32.png
deleted file mode 100644
index 31d8e21..0000000
--- a/ui/file_manager/video_player/images/icon/video-player-32.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-48.png b/ui/file_manager/video_player/images/icon/video-player-48.png
index ce573b3..d6b8e4d7 100644
--- a/ui/file_manager/video_player/images/icon/video-player-48.png
+++ b/ui/file_manager/video_player/images/icon/video-player-48.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-64.png b/ui/file_manager/video_player/images/icon/video-player-64.png
deleted file mode 100644
index 286e725..0000000
--- a/ui/file_manager/video_player/images/icon/video-player-64.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-96.png b/ui/file_manager/video_player/images/icon/video-player-96.png
deleted file mode 100644
index e757329..0000000
--- a/ui/file_manager/video_player/images/icon/video-player-96.png
+++ /dev/null
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-favicon-16.png b/ui/file_manager/video_player/images/icon/video-player-favicon-16.png
index 4a5bee1..f686584 100644
--- a/ui/file_manager/video_player/images/icon/video-player-favicon-16.png
+++ b/ui/file_manager/video_player/images/icon/video-player-favicon-16.png
Binary files differ
diff --git a/ui/file_manager/video_player/images/icon/video-player-favicon-32.png b/ui/file_manager/video_player/images/icon/video-player-favicon-32.png
index 53927bd..61bb7c6 100644
--- a/ui/file_manager/video_player/images/icon/video-player-favicon-32.png
+++ b/ui/file_manager/video_player/images/icon/video-player-favicon-32.png
Binary files differ
diff --git a/ui/file_manager/video_player/js/background.js b/ui/file_manager/video_player/js/background.js
index dfaa40f..cc1bd56 100644
--- a/ui/file_manager/video_player/js/background.js
+++ b/ui/file_manager/video_player/js/background.js
@@ -3,14 +3,12 @@
 // found in the LICENSE file.
 
 /**
- * Icon of the video player.
- * TODO(yoshiki): Consider providing an exact size icon, instead of relying
- * on downsampling by ash.
+ * Use maximum size and let ash downsample the icon.
  *
  * @type {!string}
  * @const
  */
-var ICON_IMAGE = 'images/icon/video-player-64.png';
+var ICON_IMAGE = 'images/icon/video-player-192.png';
 
 /**
  * Configuration of the video player panel.
diff --git a/ui/file_manager/video_player/manifest.json b/ui/file_manager/video_player/manifest.json
index ce21577..8148f9b 100644
--- a/ui/file_manager/video_player/manifest.json
+++ b/ui/file_manager/video_player/manifest.json
@@ -8,13 +8,10 @@
   "display_in_launcher": false,
   "incognito" : "split",
   "icons": {
-    "16": "images/icon/video-player-favicon-16.png",
-    "32": "images/icon/video-player-32.png",
+    "16": "images/icon/video-player-16.png",
     "48": "images/icon/video-player-48.png",
-    "64": "images/icon/video-player-64.png",
-    "96": "images/icon/video-player-96.png",
     "128": "images/icon/video-player-128.png",
-    "256": "images/icon/video-player-256.png"
+    "192": "images/icon/video-player-192.png"
   },
   "permissions": [
     "commandLinePrivate",
diff --git a/ui/views/cocoa/bridged_native_widget.h b/ui/views/cocoa/bridged_native_widget.h
index bcee3c0..8758fa4 100644
--- a/ui/views/cocoa/bridged_native_widget.h
+++ b/ui/views/cocoa/bridged_native_widget.h
@@ -20,7 +20,6 @@
 #include "ui/display/display_observer.h"
 #import "ui/views/cocoa/bridged_native_widget_owner.h"
 #include "ui/views/views_export.h"
-#include "ui/views/widget/widget.h"
 #import "ui/views_bridge_mac/cocoa_mouse_capture_delegate.h"
 #include "ui/views_bridge_mac/mojo/bridged_native_widget.mojom.h"
 
@@ -106,9 +105,9 @@
   void SetBounds(const gfx::Rect& new_bounds);
 
   // Start moving the window, pinned to the mouse cursor, and monitor events.
-  // Return MOVE_LOOP_SUCCESSFUL on mouse up or MOVE_LOOP_CANCELED on premature
-  // termination via EndMoveLoop() or when window is destroyed during the drag.
-  Widget::MoveLoopResult RunMoveLoop(const gfx::Vector2d& drag_offset);
+  // Return true on mouse up or false on premature termination via EndMoveLoop()
+  // or when window is destroyed during the drag.
+  bool RunMoveLoop(const gfx::Vector2d& drag_offset);
   void EndMoveLoop();
 
   // Sets the cursor associated with the NSWindow. Retains |cursor|.
@@ -188,16 +187,9 @@
   // Enables or disables all window animations.
   void SetAnimationEnabled(bool animate);
 
-  // Sets which transitions will animate. Currently this only affects non-native
-  // animations. TODO(tapted): Use scoping to disable native animations at
-  // appropriate times as well.
-  void set_transitions_to_animate(int transitions) {
-    transitions_to_animate_ = transitions;
-  }
-
   // Whether to run a custom animation for the provided |transition|.
   bool ShouldRunCustomAnimationFor(
-      Widget::VisibilityTransition transition) const;
+      views_bridge_mac::mojom::VisibilityTransition transition) const;
 
   // display::DisplayObserver:
   void OnDisplayMetricsChanged(const display::Display& display,
@@ -224,6 +216,8 @@
                  const gfx::Size& minimum_content_size) override;
   void SetVisibilityState(
       views_bridge_mac::mojom::WindowVisibilityState new_state) override;
+  void SetTransitionsToAnimate(
+      views_bridge_mac::mojom::VisibilityTransition transitions) override;
   void SetVisibleOnAllSpaces(bool always_visible) override;
   void SetFullscreen(bool fullscreen) override;
   void SetMiniaturized(bool miniaturized) override;
@@ -317,8 +311,9 @@
   gfx::Rect bounds_before_fullscreen_;
 
   // The transition types to animate when not relying on native NSWindow
-  // animation behaviors. Bitmask of Widget::VisibilityTransition.
-  int transitions_to_animate_ = Widget::ANIMATE_BOTH;
+  // animation behaviors.
+  views_bridge_mac::mojom::VisibilityTransition transitions_to_animate_ =
+      views_bridge_mac::mojom::VisibilityTransition::kBoth;
 
   // Whether this window wants to be fullscreen. If a fullscreen animation is in
   // progress then it might not be actually fullscreen.
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm
index ffc6669..6a538dc 100644
--- a/ui/views/cocoa/bridged_native_widget.mm
+++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -27,7 +27,6 @@
 #include "ui/gfx/geometry/dip_util.h"
 #import "ui/gfx/mac/coordinate_conversion.h"
 #import "ui/gfx/mac/nswindow_frame_controls.h"
-#import "ui/native_theme/native_theme_mac.h"
 #import "ui/views/cocoa/bridged_content_view.h"
 #import "ui/views/cocoa/cocoa_window_move_loop.h"
 #import "ui/views/cocoa/drag_drop_client_mac.h"
@@ -38,6 +37,7 @@
 #import "ui/views_bridge_mac/cocoa_mouse_capture.h"
 #include "ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom.h"
 
+using views_bridge_mac::mojom::VisibilityTransition;
 using views_bridge_mac::mojom::WindowVisibilityState;
 
 namespace {
@@ -490,7 +490,7 @@
   }
 
   // For other modal types, animate the close.
-  if (ShouldRunCustomAnimationFor(Widget::ANIMATE_HIDE)) {
+  if (ShouldRunCustomAnimationFor(VisibilityTransition::kHide)) {
     [ViewsNSWindowCloseAnimator closeWindowWithAnimation:window];
     return;
   }
@@ -603,7 +603,7 @@
 
   // For non-sheet modal types, use the constrained window animations to make
   // the window appear.
-  if (ShouldRunCustomAnimationFor(Widget::ANIMATE_SHOW)) {
+  if (ShouldRunCustomAnimationFor(VisibilityTransition::kShow)) {
     show_animation_.reset(
         [[ModalShowAnimationWithLayer alloc] initWithBridgedNativeWidget:this]);
 
@@ -619,6 +619,13 @@
   }
 }
 
+void BridgedNativeWidgetImpl::SetTransitionsToAnimate(
+    VisibilityTransition transitions) {
+  // TODO(tapted): Use scoping to disable native animations at appropriate
+  // times as well.
+  transitions_to_animate_ = transitions;
+}
+
 void BridgedNativeWidgetImpl::AcquireCapture() {
   if (HasCapture())
     return;
@@ -645,8 +652,7 @@
   return mouse_capture_ && mouse_capture_->IsActive();
 }
 
-Widget::MoveLoopResult BridgedNativeWidgetImpl::RunMoveLoop(
-    const gfx::Vector2d& drag_offset) {
+bool BridgedNativeWidgetImpl::RunMoveLoop(const gfx::Vector2d& drag_offset) {
   DCHECK(!HasCapture());
   // https://crbug.com/876493
   CHECK(!window_move_loop_);
@@ -839,7 +845,7 @@
 }
 
 void BridgedNativeWidgetImpl::OnSystemControlTintChanged() {
-  ui::NativeTheme::GetInstanceForNativeUi()->NotifyObservers();
+  host_->OnWindowNativeThemeChanged();
 }
 
 void BridgedNativeWidgetImpl::OnBackingPropertiesChanged() {
@@ -948,15 +954,14 @@
 }
 
 bool BridgedNativeWidgetImpl::ShouldRunCustomAnimationFor(
-    Widget::VisibilityTransition transition) const {
+    VisibilityTransition transition) const {
   // The logic around this needs to change if new transition types are set.
   // E.g. it would be nice to distinguish "hide" from "close". Mac currently
   // treats "hide" only as "close". Hide (e.g. Cmd+h) should not animate on Mac.
-  constexpr int kSupported =
-      Widget::ANIMATE_SHOW | Widget::ANIMATE_HIDE | Widget::ANIMATE_NONE;
-  DCHECK_EQ(0, transitions_to_animate_ & ~kSupported);
-  if (!(transitions_to_animate_ & transition))
+  if (transitions_to_animate_ != transition &&
+      transitions_to_animate_ != VisibilityTransition::kBoth) {
     return false;
+  }
 
   // Custom animations are only used for tab-modals.
   bool widget_is_modal = false;
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h
index 91a2e35a..8f9dcdf 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.h
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -202,6 +202,7 @@
 
   // views_bridge_mac::mojom::BridgedNativeWidgetHost:
   void OnVisibilityChanged(bool visible) override;
+  void OnWindowNativeThemeChanged() override;
   void SetViewSize(const gfx::Size& new_size) override;
   void SetKeyboardAccessible(bool enabled) override;
   void SetIsFirstResponder(bool is_first_responder) override;
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm
index d3e9d99e1..637db633 100644
--- a/ui/views/cocoa/bridged_native_widget_host_impl.mm
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -13,6 +13,7 @@
 #include "ui/compositor/recyclable_compositor_mac.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/dip_util.h"
+#include "ui/native_theme/native_theme_mac.h"
 #include "ui/views/cocoa/bridged_native_widget.h"
 #include "ui/views/cocoa/native_widget_mac_nswindow.h"
 #include "ui/views/cocoa/tooltip_manager_mac.h"
@@ -498,6 +499,10 @@
       window_visible);
 }
 
+void BridgedNativeWidgetHostImpl::OnWindowNativeThemeChanged() {
+  ui::NativeTheme::GetInstanceForNativeUi()->NotifyObservers();
+}
+
 void BridgedNativeWidgetHostImpl::OnScrollEvent(
     std::unique_ptr<ui::Event> event) {
   root_view_->GetWidget()->OnScrollEvent(event->AsScrollEvent());
diff --git a/ui/views/cocoa/cocoa_window_move_loop.h b/ui/views/cocoa/cocoa_window_move_loop.h
index 3ddfa701..68699ff 100644
--- a/ui/views/cocoa/cocoa_window_move_loop.h
+++ b/ui/views/cocoa/cocoa_window_move_loop.h
@@ -22,7 +22,8 @@
   ~CocoaWindowMoveLoop();
 
   // Initiates the drag until a mouse up event is observed, or End() is called.
-  Widget::MoveLoopResult Run();
+  // Returns true if a mouse up event ended the loop.
+  bool Run();
   void End();
 
  private:
diff --git a/ui/views/cocoa/cocoa_window_move_loop.mm b/ui/views/cocoa/cocoa_window_move_loop.mm
index fb2e375152..2d7dfdc 100644
--- a/ui/views/cocoa/cocoa_window_move_loop.mm
+++ b/ui/views/cocoa/cocoa_window_move_loop.mm
@@ -65,7 +65,7 @@
   owner_ = nullptr;
 }
 
-Widget::MoveLoopResult CocoaWindowMoveLoop::Run() {
+bool CocoaWindowMoveLoop::Run() {
   LoopExitReason exit_reason = ENDED_EXTERNALLY;
   exit_reason_ref_ = &exit_reason;
   NSWindow* window = owner_->ns_window();
@@ -123,8 +123,7 @@
     owner_->EndMoveLoop();       // Deletes |this|.
   }
 
-  return exit_reason != MOUSE_UP ? Widget::MOVE_LOOP_CANCELED
-                                 : Widget::MOVE_LOOP_SUCCESSFUL;
+  return exit_reason == MOUSE_UP;
 }
 
 void CocoaWindowMoveLoop::End() {
diff --git a/ui/views/view_properties.h b/ui/views/view_properties.h
index 16b9b06..5f63c1b 100644
--- a/ui/views/view_properties.h
+++ b/ui/views/view_properties.h
@@ -47,5 +47,5 @@
 DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, gfx::Insets*);
 DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT,
                                         views::BubbleDialogDelegateView*);
-
+DECLARE_EXPORTED_UI_CLASS_PROPERTY_TYPE(VIEWS_EXPORT, gfx::Path*);
 #endif  // UI_VIEWS_VIEW_PROPERTIES_H_
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index cba45a1a7..e14e355 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -566,7 +566,8 @@
   if (!bridge_impl())
     return Widget::MOVE_LOOP_CANCELED;
 
-  return bridge_impl()->RunMoveLoop(drag_offset);
+  return bridge_impl()->RunMoveLoop(drag_offset) ? Widget::MOVE_LOOP_SUCCESSFUL
+                                                 : Widget::MOVE_LOOP_CANCELED;
 }
 
 void NativeWidgetMac::EndMoveLoop() {
@@ -585,9 +586,25 @@
 }
 
 void NativeWidgetMac::SetVisibilityAnimationTransition(
-    Widget::VisibilityTransition transition) {
-  if (bridge_impl())
-    bridge_impl()->set_transitions_to_animate(transition);
+    Widget::VisibilityTransition widget_transitions) {
+  views_bridge_mac::mojom::VisibilityTransition transitions =
+      views_bridge_mac::mojom::VisibilityTransition::kNone;
+  switch (widget_transitions) {
+    case Widget::ANIMATE_NONE:
+      transitions = views_bridge_mac::mojom::VisibilityTransition::kNone;
+      break;
+    case Widget::ANIMATE_SHOW:
+      transitions = views_bridge_mac::mojom::VisibilityTransition::kShow;
+      break;
+    case Widget::ANIMATE_HIDE:
+      transitions = views_bridge_mac::mojom::VisibilityTransition::kHide;
+      break;
+    case Widget::ANIMATE_BOTH:
+      transitions = views_bridge_mac::mojom::VisibilityTransition::kBoth;
+      break;
+  }
+  if (bridge())
+    bridge()->SetTransitionsToAnimate(transitions);
 }
 
 bool NativeWidgetMac::IsTranslucentWindowOpacitySupported() const {
diff --git a/ui/views_bridge_mac/mojo/bridged_native_widget.mojom b/ui/views_bridge_mac/mojo/bridged_native_widget.mojom
index 6403f18..e576f99f 100644
--- a/ui/views_bridge_mac/mojo/bridged_native_widget.mojom
+++ b/ui/views_bridge_mac/mojo/bridged_native_widget.mojom
@@ -27,6 +27,14 @@
   kShowInactive
 };
 
+// Window transitions to animate, mirrors views::Widget::VisibilityTransition.
+enum VisibilityTransition {
+  kShow = 1,
+  kHide = 2,
+  kBoth = 3,
+  kNone = 4,
+};
+
 struct BridgedNativeWidgetInitParams {
   ui.mojom.ModalType modal_type;
   // If true, the underlying window potentially be seen through.
@@ -92,6 +100,10 @@
   // descendant windows where necessary.
   SetVisibilityState(WindowVisibilityState new_state);
 
+  // Sets which transitions will animate. Currently this only affects non-native
+  // animations.
+  SetTransitionsToAnimate(VisibilityTransition transitions);
+
   // Sets the collection behavior so that the window will or will not be visible
   // on all spaces.
   SetVisibleOnAllSpaces(bool always_visible);
diff --git a/ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom b/ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom
index 6434f74..cba9a6b 100644
--- a/ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom
+++ b/ui/views_bridge_mac/mojo/bridged_native_widget_host.mojom
@@ -17,6 +17,9 @@
   // Update the views::Widget, ui::Compositor and ui::Layer's visibility.
   OnVisibilityChanged(bool visible);
 
+  // Called when the window's native theme changes.
+  OnWindowNativeThemeChanged();
+
   // Resize the underlying views::View to |new_size|. Note that this will not
   // necessarily match the content bounds from OnWindowGeometryChanged.
   SetViewSize(gfx.mojom.Size new_size);
diff --git a/ui/webui/resources/cr_elements/cr_input/cr_input.html b/ui/webui/resources/cr_elements/cr_input/cr_input.html
index ea27fdc7..b328ee4 100644
--- a/ui/webui/resources/cr_elements/cr_input/cr_input.html
+++ b/ui/webui/resources/cr_elements/cr_input/cr_input.html
@@ -115,7 +115,7 @@
           <input id="input" disabled="[[disabled]]" autofocus="[[autofocus]]"
               value="{{value::input}}" tabindex$="[[tabindex]]" type="[[type]]"
               readonly$="[[readonly]]" maxlength$="[[maxlength]]"
-              pattern="[[pattern]]" required="[[required]]"
+              pattern$="[[pattern]]" required="[[required]]"
               minlength$="[[minlength]]"
               max="[[max]]" min="[[min]]" on-focus="onInputFocus_"
               on-blur="onInputBlur_" on-change="onInputChange_"
diff --git a/webrunner/README.md b/webrunner/README.md
index 01e6e680..1abbeb9 100644
--- a/webrunner/README.md
+++ b/webrunner/README.md
@@ -1,2 +1,85 @@
-This directory contains WebRunner implementation. WebRunner allows to run
-web applications on Fuchsia.
\ No newline at end of file
+# Chromium web_runner
+This directory contains the web_runner implementation. Web_runner enables
+Fuchsia applications to embed Chrome frames for rendering web content.
+
+
+### Building and deploying web_runner
+When you build web_runner, Chromium will automatically generate scripts for
+you that will automatically provision a device with Fuchsia and then install
+`web_runner` and its dependencies.
+
+To build and run web_runner, follow these steps:
+
+0. Ensure that you have a device ready to boot into Fuchsia.
+
+   If you wish to have WebRunner manage the OS deployment process, then you
+   should have the device booting into
+   [Zedboot](https://fuchsia.googlesource.com/zircon/+/master/docs/targets/bootloader_setup.md).
+
+1. Build web_runner.
+
+   ```
+   $ autoninja -C out/Debug webrunner
+   ```
+
+2. Install web_runner.
+
+    * **For devices running Zedboot**
+
+          ```
+          $ out/Debug/bin/install_webrunner -d
+          ```
+
+    * **For devices already running Fuchsia**
+
+          You will need to add command line flags specifying the device's IP
+          address and the path to the `ssh_config` used by the device
+          (located at `FUCHSIA_OUT_DIR/ssh-keys/ssh_config`):
+
+          ```
+          $ out/Debug/bin/install_webrunner -d --ssh-config PATH_TO_SSH_CONFIG
+          --host DEVICE_IP
+          ```
+
+3. Run "tiles" on the device.
+
+   ```
+   $ run tiles&
+   ```
+
+4. Press the OS key on your device to switch back to terminal mode.
+   (Also known as the "Windows key" or "Super key" on many keyboards).
+
+5. Launch a webpage.
+
+   ```
+   $ tiles_ctl add https://www.chromium.org/
+   ```
+
+6. Press the OS key to switch back to graphical view. The browser window should
+   be displayed and ready to use.
+
+7. You can deploy and run new versions of Chromium without needing to reboot.
+
+   First kill any running processes:
+
+      ```
+      $ killall chromium; killall web_runner
+      ```
+
+   Then repeat steps 1 through 6 from the installation instructions, excluding
+   step #3 (running Tiles).
+
+
+### Closing a webpage
+
+1. Press the Windows key to return to the terminal.
+
+2. Instruct tiles_ctl to remove the webpage's window tile. The tile's number is
+   reported by step 6, or it can be found by running `tiles_ctl list` and
+   noting the ID of the "url" entry.
+
+   ```shell
+   $ tiles_ctl remove TILE_NUMBER
+   ```
+