diff --git a/.gn b/.gn
index 1a59712..42fe8d1e 100644
--- a/.gn
+++ b/.gn
@@ -242,7 +242,6 @@
   "//build/util/branding.gni",
   "//build/util/version.gni",
   "//chrome/android/BUILD.gn",
-  "//chrome/browser/BUILD.gn",
   "//chrome/browser/chromeos/BUILD.gn",
   "//chrome/browser/extensions/BUILD.gn",
   "//chrome/browser/resources/chromeos/chromevox/BUILD.gn",
@@ -299,7 +298,6 @@
   "//third_party/WebKit/Source/config.gni",
   "//third_party/WebKit/Source/core/core.gni",
   "//third_party/WebKit/Source/modules/modules.gni",
-  "//third_party/WebKit/Source/platform/BUILD.gn",
   "//third_party/WebKit/Source/platform/platform.gni",
   "//third_party/WebKit/Source/web/BUILD.gn",
   "//tools/gn/BUILD.gn",
diff --git a/AUTHORS b/AUTHORS
index 777b11c..778b9a47 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -688,6 +688,7 @@
 Xing Zhang <xzhang@adobe.com>
 Xinghua Cao <xinghua.cao@intel.com>
 Xu Samuel <samuel.xu@intel.com>
+Xu Xing <xing.xu@intel.com>
 Xuefei Ren <xrenishere@gmail.com>
 Xun Sun <xun.sun@intel.com>
 Yael Aharon <yael.aharon@intel.com>
diff --git a/BUILD.gn b/BUILD.gn
index 298b2b6..9ab0ee0 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -287,8 +287,8 @@
       "//mojo/edk/test:mojo_public_system_unittests",
       "//net:net_perftests",
       "//services/shell/public/cpp",
-      "//third_party/WebKit/Source/platform:blink_heap_unittests",
       "//third_party/WebKit/Source/platform:blink_platform_unittests",
+      "//third_party/WebKit/Source/platform/heap:blink_heap_unittests",
       "//third_party/WebKit/Source/web:webkit_unit_tests",
       "//third_party/WebKit/Source/wtf:wtf_unittests",
       "//third_party/catapult/telemetry:bitmaptools($host_toolchain)",
@@ -1115,8 +1115,8 @@
       "//remoting:remoting_unittests",
       "//skia:skia_unittests",
       "//sql:sql_unittests",
-      "//third_party/WebKit/Source/platform:blink_heap_unittests",
       "//third_party/WebKit/Source/platform:blink_platform_unittests",
+      "//third_party/WebKit/Source/platform/heap:blink_heap_unittests",
       "//third_party/angle/src/tests:angle_unittests",
       "//third_party/cacheinvalidation:cacheinvalidation_unittests",
       "//third_party/leveldatabase:env_chromium_unittests",
diff --git a/DEPS b/DEPS
index 9df093a..e2e98d5 100644
--- a/DEPS
+++ b/DEPS
@@ -36,11 +36,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': '982e7c502f4499044a4bff8420cdddddce0ce357',
+  'skia_revision': '13a7eee2504e7deb0e27ed3e69a787696d57b037',
   # 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': '3e5d344f9cb90d626b251d5f9b3c4015bfd61f6b',
+  'v8_revision': '2bc7c2bdde2650a9fa5c9d29b10530fe29bf3f2f',
   # 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.
@@ -60,7 +60,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '21ce1a68bb9f80bfbd4f295fd3b7181e56502fdc',
+  'pdfium_revision': '21b111fcf71e4e189035f29606ca9d3fdf3ebd92',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -92,7 +92,7 @@
   # 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': 'aa7c58eb04599138bc97f93245c1acf3c5b81f85',
+  'catapult_revision': 'ca10e840fb1eabf13a2909647258add3dc68fcb6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -943,7 +943,7 @@
     'action': ['python',
                'src/build/get_syzygy_binaries.py',
                '--output-dir=src/third_party/syzygy/binaries',
-               '--revision=eb38b59577062c496435c346d7595dc609326a0a',
+               '--revision=5f06b860d3d0cf3079736c14f4bc1be47089edd4',
                '--overwrite',
     ],
   },
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index d5ea693..64f95762 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -75,7 +75,6 @@
 import org.chromium.ui.base.PageTransition;
 import org.chromium.ui.base.ViewAndroidDelegate;
 import org.chromium.ui.base.WindowAndroid;
-import org.chromium.ui.gfx.DeviceDisplayInfo;
 
 import java.io.File;
 import java.lang.annotation.Annotation;
@@ -302,8 +301,6 @@
 
     private Bitmap mFavicon;
     private boolean mHasRequestedVisitedHistoryFromClient;
-    // TODO(boliu): This should be in a global context, not per webview.
-    private final double mDIPScale;
     // Whether this WebView is a popup.
     private boolean mIsPopupWindow = false;
 
@@ -772,9 +769,7 @@
         mContentViewClient = new AwContentViewClient(contentsClient, settings, this, mContext);
         mLayoutSizer = dependencyFactory.createLayoutSizer();
         mSettings = settings;
-        mDIPScale = DeviceDisplayInfo.create(mContext).getDIPScale();
         mLayoutSizer.setDelegate(new AwLayoutSizerDelegate());
-        mLayoutSizer.setDIPScale(mDIPScale);
         mWebContentsDelegate = new AwWebContentsDelegateAdapter(
                 this, contentsClient, mContentViewClient, mContext, mContainerView);
         mContentsClientBridge = new AwContentsClientBridge(mContext, contentsClient,
@@ -805,7 +800,6 @@
         mDefaultVideoPosterRequestHandler = new DefaultVideoPosterRequestHandler(mContentsClient);
         mSettings.setDefaultVideoPosterURL(
                 mDefaultVideoPosterRequestHandler.getDefaultVideoPosterURL());
-        mSettings.setDIPScale(mDIPScale);
         mScrollOffsetManager =
                 dependencyFactory.createScrollOffsetManager(new AwScrollOffsetManagerDelegate());
         mScrollAccessibilityHelper = new ScrollAccessibilityHelper(mContainerView);
@@ -1066,7 +1060,12 @@
         mNavigationController = mWebContents.getNavigationController();
         installWebContentsObserver();
         mSettings.setWebContents(webContents);
-        nativeSetDipScale(mNativeAwContents, (float) mDIPScale);
+
+        float dipScale = mContentViewCore.getDeviceScaleFactor();
+        nativeSetDipScale(mNativeAwContents, dipScale);
+        mLayoutSizer.setDIPScale(dipScale);
+        mSettings.setDIPScale(dipScale);
+
         updateContentViewCoreVisibility();
 
         // The native side object has been bound to this java instance, so now is the time to
@@ -2101,7 +2100,7 @@
      */
     public float getScale() {
         if (isDestroyed(WARN)) return 1;
-        return (float) (mPageScaleFactor * mDIPScale);
+        return (float) (mPageScaleFactor * mContentViewCore.getDeviceScaleFactor());
     }
 
     /**
@@ -2684,8 +2683,8 @@
 
     @CalledByNative
     private long onCreateTouchHandle() {
-        PopupTouchHandleDrawable drawable =
-                PopupTouchHandleDrawable.create(mTouchHandleDrawables, mContentViewCore, mDIPScale);
+        PopupTouchHandleDrawable drawable = PopupTouchHandleDrawable.create(
+                mTouchHandleDrawables, mContentViewCore, mContentViewCore.getDeviceScaleFactor());
         return drawable.getNativeDrawable();
     }
 
@@ -2879,9 +2878,9 @@
         if (mPageScaleFactor != pageScaleFactor) {
             float oldPageScaleFactor = mPageScaleFactor;
             mPageScaleFactor = pageScaleFactor;
+            float dipScale = mContentViewCore.getDeviceScaleFactor();
             mContentsClient.getCallbackHelper().postOnScaleChangedScaled(
-                    (float) (oldPageScaleFactor * mDIPScale),
-                    (float) (mPageScaleFactor * mDIPScale));
+                    oldPageScaleFactor * dipScale, mPageScaleFactor * dipScale);
         }
     }
 
@@ -3107,10 +3106,10 @@
             if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                 // Note this will trigger IPC back to browser even if nothing is
                 // hit.
+                float dipScale = mContentViewCore.getDeviceScaleFactor();
                 nativeRequestNewHitTestDataAt(mNativeAwContents,
-                        event.getX() / (float) mDIPScale,
-                        event.getY() / (float) mDIPScale,
-                        Math.max(event.getTouchMajor(), event.getTouchMinor()) / (float) mDIPScale);
+                        event.getX() / dipScale, event.getY() / dipScale,
+                        Math.max(event.getTouchMajor(), event.getTouchMinor()) / dipScale);
             }
 
             if (mOverScrollGlow != null) {
diff --git a/android_webview/native/aw_web_contents_delegate.cc b/android_webview/native/aw_web_contents_delegate.cc
index 9588586..ad7e7e3 100644
--- a/android_webview/native/aw_web_contents_delegate.cc
+++ b/android_webview/native/aw_web_contents_delegate.cc
@@ -138,7 +138,7 @@
                                            bool* was_blocked) {
   JNIEnv* env = AttachCurrentThread();
 
-  bool is_dialog = disposition == NEW_POPUP;
+  bool is_dialog = disposition == WindowOpenDisposition::NEW_POPUP;
   ScopedJavaLocalRef<jobject> java_delegate = GetJavaDelegate(env);
   bool create_popup = false;
 
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index d6642dd..7917861f 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -24,6 +24,7 @@
   public_deps = [
     "//ash/common/strings",
     "//ash/resources",
+    "//ash/resources/vector_icons",
   ]
   deps = [
     "//ash/autoclick/common:autoclick",
diff --git a/ash/accelerators/accelerator_controller_delegate_aura.cc b/ash/accelerators/accelerator_controller_delegate_aura.cc
index 8c3584f..bb430d3d 100644
--- a/ash/accelerators/accelerator_controller_delegate_aura.cc
+++ b/ash/accelerators/accelerator_controller_delegate_aura.cc
@@ -15,14 +15,11 @@
 #include "ash/common/ash_switches.h"
 #include "ash/common/gpu_support.h"
 #include "ash/common/session/session_state_delegate.h"
-#include "ash/common/shelf/shelf_widget.h"
 #include "ash/common/shelf/wm_shelf.h"
 #include "ash/common/shell_delegate.h"
 #include "ash/common/shell_window_ids.h"
-#include "ash/common/system/status_area_widget.h"
 #include "ash/common/system/system_notifier.h"
 #include "ash/common/system/tray/system_tray.h"
-#include "ash/common/system/web_notification/web_notification_tray.h"
 #include "ash/common/wallpaper/wallpaper_delegate.h"
 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
 #include "ash/common/wm/window_state.h"
@@ -201,29 +198,6 @@
   }
 }
 
-bool CanHandleShowMessageCenterBubble() {
-  RootWindowController* controller =
-      RootWindowController::ForTargetRootWindow();
-  StatusAreaWidget* status_area_widget =
-      controller->shelf_widget()->status_area_widget();
-  return status_area_widget &&
-         status_area_widget->web_notification_tray()->visible();
-}
-
-void HandleShowMessageCenterBubble() {
-  base::RecordAction(UserMetricsAction("Accel_Show_Message_Center_Bubble"));
-  RootWindowController* controller =
-      RootWindowController::ForTargetRootWindow();
-  StatusAreaWidget* status_area_widget =
-      controller->shelf_widget()->status_area_widget();
-  if (status_area_widget) {
-    WebNotificationTray* notification_tray =
-        status_area_widget->web_notification_tray();
-    if (notification_tray->visible())
-      notification_tray->ShowMessageCenterBubble();
-  }
-}
-
 void HandleShowSystemTrayBubble() {
   base::RecordAction(UserMetricsAction("Accel_Show_System_Tray_Bubble"));
   RootWindowController* controller =
@@ -408,8 +382,6 @@
     case SCALE_UI_RESET:
     case SCALE_UI_UP:
       return accelerators::IsInternalDisplayZoomEnabled();
-    case SHOW_MESSAGE_CENTER_BUBBLE:
-      return CanHandleShowMessageCenterBubble();
     case UNPIN:
       return CanHandleUnpin();
 
@@ -494,9 +466,6 @@
     case SCALE_UI_UP:
       accelerators::ZoomInternalDisplay(true /* up */);
       break;
-    case SHOW_MESSAGE_CENTER_BUBBLE:
-      HandleShowMessageCenterBubble();
-      break;
     case SHOW_SYSTEM_TRAY_BUBBLE:
       HandleShowSystemTrayBubble();
       break;
diff --git a/ash/ash.gyp b/ash/ash.gyp
index dbeffae..22ad673f 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -535,7 +535,6 @@
       'common/wm_lookup.h',
       'common/wm_root_window_controller.cc',
       'common/wm_root_window_controller.h',
-      'common/wm_root_window_controller_observer.h',
       'common/wm_shell.cc',
       'common/wm_shell.h',
       'common/wm_transient_window_observer.h',
diff --git a/ash/aura/wm_root_window_controller_aura.cc b/ash/aura/wm_root_window_controller_aura.cc
index 90638cb..2fedcf4 100644
--- a/ash/aura/wm_root_window_controller_aura.cc
+++ b/ash/aura/wm_root_window_controller_aura.cc
@@ -8,7 +8,6 @@
 #include "ash/aura/wm_shell_aura.h"
 #include "ash/aura/wm_window_aura.h"
 #include "ash/common/shelf/shelf_widget.h"
-#include "ash/common/wm_root_window_controller_observer.h"
 #include "ash/display/window_tree_host_manager.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -16,7 +15,6 @@
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_property.h"
 #include "ui/aura/window_tree_host.h"
-#include "ui/display/screen.h"
 #include "ui/events/event_targeter.h"
 #include "ui/events/event_utils.h"
 
@@ -36,14 +34,9 @@
       root_window_controller_(root_window_controller) {
   root_window_controller_->GetRootWindow()->SetProperty(
       kWmRootWindowControllerKey, this);
-  WmShell::Get()->AddShellObserver(this);
-  display::Screen::GetScreen()->AddObserver(this);
 }
 
-WmRootWindowControllerAura::~WmRootWindowControllerAura() {
-  WmShell::Get()->RemoveShellObserver(this);
-  display::Screen::GetScreen()->RemoveObserver(this);
-}
+WmRootWindowControllerAura::~WmRootWindowControllerAura() {}
 
 // static
 const WmRootWindowControllerAura* WmRootWindowControllerAura::Get(
@@ -67,7 +60,7 @@
 }
 
 bool WmRootWindowControllerAura::HasShelf() {
-  return root_window_controller_->shelf_widget() != nullptr;
+  return root_window_controller_->wm_shelf_aura()->shelf_widget() != nullptr;
 }
 
 WmShell* WmRootWindowControllerAura::GetShell() {
@@ -114,27 +107,4 @@
       ->GetLastMouseLocationInRoot();
 }
 
-void WmRootWindowControllerAura::OnShelfAlignmentChanged(
-    WmWindow* root_window) {
-  if (WmWindowAura::GetAuraWindow(root_window) !=
-      root_window_controller_->GetRootWindow())
-    return;
-
-  FOR_EACH_OBSERVER(WmRootWindowControllerObserver, *observers(),
-                    OnShelfAlignmentChanged());
-}
-
-void WmRootWindowControllerAura::OnDisplayAdded(
-    const display::Display& display) {}
-
-void WmRootWindowControllerAura::OnDisplayRemoved(
-    const display::Display& display) {}
-
-void WmRootWindowControllerAura::OnDisplayMetricsChanged(
-    const display::Display& display,
-    uint32_t metrics) {
-  FOR_EACH_OBSERVER(WmRootWindowControllerObserver, *observers(),
-                    OnWorkAreaChanged());
-}
-
 }  // namespace ash
diff --git a/ash/aura/wm_root_window_controller_aura.h b/ash/aura/wm_root_window_controller_aura.h
index d93d3a9..65cfe94 100644
--- a/ash/aura/wm_root_window_controller_aura.h
+++ b/ash/aura/wm_root_window_controller_aura.h
@@ -6,10 +6,8 @@
 #define ASH_AURA_WM_ROOT_CONTROLLER_AURA_H_
 
 #include "ash/ash_export.h"
-#include "ash/common/shell_observer.h"
 #include "ash/common/wm_root_window_controller.h"
 #include "base/macros.h"
-#include "ui/display/display_observer.h"
 
 namespace aura {
 class Window;
@@ -19,9 +17,7 @@
 
 class RootWindowController;
 
-class ASH_EXPORT WmRootWindowControllerAura : public WmRootWindowController,
-                                              public ShellObserver,
-                                              public display::DisplayObserver {
+class ASH_EXPORT WmRootWindowControllerAura : public WmRootWindowController {
  public:
   explicit WmRootWindowControllerAura(
       RootWindowController* root_window_controller);
@@ -46,15 +42,6 @@
   WmWindow* FindEventTarget(const gfx::Point& location_in_screen) override;
   gfx::Point GetLastMouseLocationInRoot() override;
 
-  // ShellObserver:
-  void OnShelfAlignmentChanged(WmWindow* root_window) override;
-
-  // DisplayObserver:
-  void OnDisplayAdded(const display::Display& display) override;
-  void OnDisplayRemoved(const display::Display& display) override;
-  void OnDisplayMetricsChanged(const display::Display& display,
-                               uint32_t metrics) override;
-
  private:
   friend class RootWindowController;
 
diff --git a/ash/aura/wm_shelf_aura.cc b/ash/aura/wm_shelf_aura.cc
index 33c5d02..36e428e 100644
--- a/ash/aura/wm_shelf_aura.cc
+++ b/ash/aura/wm_shelf_aura.cc
@@ -51,8 +51,8 @@
   return DimmerView::Create(this, disable_animations_for_test);
 }
 
-void WmShelfAura::SetShelfLayoutManager(ShelfLayoutManager* manager) {
-  WmShelf::SetShelfLayoutManager(manager);
+void WmShelfAura::CreateShelfWidget(WmWindow* root) {
+  WmShelf::CreateShelfWidget(root);
   bezel_event_handler_.reset(new ShelfBezelEventHandler(this));
 }
 
diff --git a/ash/aura/wm_shelf_aura.h b/ash/aura/wm_shelf_aura.h
index 5fa47bd..06f2616b 100644
--- a/ash/aura/wm_shelf_aura.h
+++ b/ash/aura/wm_shelf_aura.h
@@ -21,7 +21,7 @@
 
   // WmShelf:
   WmDimmerView* CreateDimmerView(bool disable_animations_for_test) override;
-  void SetShelfLayoutManager(ShelfLayoutManager* manager) override;
+  void CreateShelfWidget(WmWindow* root) override;
   void WillDeleteShelfLayoutManager() override;
   void WillChangeVisibilityState(ShelfVisibilityState new_state) override;
 
diff --git a/ash/common/DEPS b/ash/common/DEPS
index a88b6f0..586757e 100644
--- a/ash/common/DEPS
+++ b/ash/common/DEPS
@@ -2,6 +2,7 @@
   "-ash",
   "+ash/ash_export.h",
   "+ash/common",
+  "+ash/resources",
   "+ash/shared",
   "+ui",
   "-ui/aura",
diff --git a/ash/common/accelerators/accelerator_controller.cc b/ash/common/accelerators/accelerator_controller.cc
index bd150611..339f230e8 100644
--- a/ash/common/accelerators/accelerator_controller.cc
+++ b/ash/common/accelerators/accelerator_controller.cc
@@ -24,6 +24,7 @@
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/system/tray/system_tray_notifier.h"
 #include "ash/common/system/volume_control_delegate.h"
+#include "ash/common/system/web_notification/web_notification_tray.h"
 #include "ash/common/wm/mru_window_tracker.h"
 #include "ash/common/wm/overview/window_selector_controller.h"
 #include "ash/common/wm/window_cycle_controller.h"
@@ -221,6 +222,27 @@
   WmShell::Get()->new_window_delegate()->ShowKeyboardOverlay();
 }
 
+bool CanHandleShowMessageCenterBubble() {
+  WmWindow* target_root = WmShell::Get()->GetRootWindowForNewWindows();
+  StatusAreaWidget* status_area_widget =
+      WmShelf::ForWindow(target_root)->shelf_widget()->status_area_widget();
+  return status_area_widget &&
+         status_area_widget->web_notification_tray()->visible();
+}
+
+void HandleShowMessageCenterBubble() {
+  base::RecordAction(UserMetricsAction("Accel_Show_Message_Center_Bubble"));
+  WmWindow* target_root = WmShell::Get()->GetRootWindowForNewWindows();
+  StatusAreaWidget* status_area_widget =
+      WmShelf::ForWindow(target_root)->shelf_widget()->status_area_widget();
+  if (status_area_widget) {
+    WebNotificationTray* notification_tray =
+        status_area_widget->web_notification_tray();
+    if (notification_tray->visible())
+      notification_tray->ShowMessageCenterBubble();
+  }
+}
+
 void HandleShowTaskManager() {
   base::RecordAction(UserMetricsAction("Accel_Show_Task_Manager"));
   WmShell::Get()->new_window_delegate()->ShowTaskManager();
@@ -729,6 +751,8 @@
       return CanHandleNextIme(ime_control_delegate_.get());
     case PREVIOUS_IME:
       return CanHandlePreviousIme(ime_control_delegate_.get());
+    case SHOW_MESSAGE_CENTER_BUBBLE:
+      return CanHandleShowMessageCenterBubble();
     case SWITCH_IME:
       return CanHandleSwitchIme(ime_control_delegate_.get(), accelerator);
     case TOGGLE_APP_LIST:
@@ -910,6 +934,9 @@
     case SHOW_KEYBOARD_OVERLAY:
       HandleShowKeyboardOverlay();
       break;
+    case SHOW_MESSAGE_CENTER_BUBBLE:
+      HandleShowMessageCenterBubble();
+      break;
     case SHOW_TASK_MANAGER:
       HandleShowTaskManager();
       break;
diff --git a/ash/common/shelf/shelf_layout_manager.cc b/ash/common/shelf/shelf_layout_manager.cc
index 6761f97..d30c07f 100644
--- a/ash/common/shelf/shelf_layout_manager.cc
+++ b/ash/common/shelf/shelf_layout_manager.cc
@@ -23,7 +23,6 @@
 #include "ash/common/wm/wm_screen_util.h"
 #include "ash/common/wm_lookup.h"
 #include "ash/common/wm_root_window_controller.h"
-#include "ash/common/wm_root_window_controller_observer.h"
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
 #include "base/auto_reset.h"
@@ -106,42 +105,6 @@
   DISALLOW_COPY_AND_ASSIGN(UpdateShelfObserver);
 };
 
-// ShelfLayoutManager::RootWindowControllerObserverImpl ------------------------
-
-// NOTE: Some other layout managers also observe for OnShelfAlignmentChanged()
-// via WmRootWindowControllerObserver instead of via ShellObserver. There are
-// implicit assumptions that these layout managers run in order. In order to
-// preserve the ordering, OnShelfAlignmentChanged() is implemented here in terms
-// of a WmRootWindowControllerObserver instead of a ShellObserver. This gives us
-// a sane ordering (or at least ordering as we've always had it in ash).
-class ShelfLayoutManager::RootWindowControllerObserverImpl
-    : public WmRootWindowControllerObserver {
- public:
-  explicit RootWindowControllerObserverImpl(
-      ShelfLayoutManager* shelf_layout_manager)
-      : shelf_layout_manager_(shelf_layout_manager),
-        root_window_controller_(
-            WmLookup::Get()
-                ->GetWindowForWidget(shelf_layout_manager->shelf_widget())
-                ->GetRootWindowController()) {
-    root_window_controller_->AddObserver(this);
-  }
-  ~RootWindowControllerObserverImpl() override {
-    root_window_controller_->RemoveObserver(this);
-  }
-
-  // WmRootWindowControllerObserver:
-  void OnShelfAlignmentChanged() override {
-    shelf_layout_manager_->LayoutShelf();
-  }
-
- private:
-  ShelfLayoutManager* shelf_layout_manager_;
-  WmRootWindowController* root_window_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(RootWindowControllerObserverImpl);
-};
-
 // ShelfLayoutManager ----------------------------------------------------------
 
 ShelfLayoutManager::ShelfLayoutManager(ShelfWidget* shelf_widget,
@@ -156,9 +119,7 @@
       gesture_drag_auto_hide_state_(SHELF_AUTO_HIDE_SHOWN),
       update_shelf_observer_(NULL),
       chromevox_panel_height_(0),
-      duration_override_in_ms_(0),
-      root_window_controller_observer_(
-          new RootWindowControllerObserverImpl(this)) {
+      duration_override_in_ms_(0) {
   DCHECK(shelf_widget_);
   DCHECK(wm_shelf_);
   WmShell::Get()->AddShellObserver(this);
diff --git a/ash/common/shelf/shelf_layout_manager.h b/ash/common/shelf/shelf_layout_manager.h
index aae684e..b16b13df 100644
--- a/ash/common/shelf/shelf_layout_manager.h
+++ b/ash/common/shelf/shelf_layout_manager.h
@@ -186,7 +186,6 @@
   void SetChromeVoxPanelHeight(int height);
 
  private:
-  class RootWindowControllerObserverImpl;
   class UpdateShelfObserver;
   friend class PanelLayoutManagerTest;
   friend class ShelfLayoutManagerTest;
@@ -372,9 +371,6 @@
   // TODO(oshima): Remove this when MD immersive is launched.
   bool invisible_auto_hide_shelf_ = false;
 
-  std::unique_ptr<RootWindowControllerObserverImpl>
-      root_window_controller_observer_;
-
   DISALLOW_COPY_AND_ASSIGN(ShelfLayoutManager);
 };
 
diff --git a/ash/common/shelf/shelf_widget.cc b/ash/common/shelf/shelf_widget.cc
index 4d6a790..01d4109 100644
--- a/ash/common/shelf/shelf_widget.cc
+++ b/ash/common/shelf/shelf_widget.cc
@@ -287,10 +287,9 @@
   SchedulePaint();
 }
 
-ShelfWidget::ShelfWidget(WmWindow* shelf_container,
-                         WmWindow* status_container,
-                         WmShelf* wm_shelf)
+ShelfWidget::ShelfWidget(WmWindow* shelf_container, WmShelf* wm_shelf)
     : wm_shelf_(wm_shelf),
+      status_area_widget_(nullptr),
       delegate_view_(new DelegateView(wm_shelf, this)),
       shelf_view_(nullptr),
       background_animator_(SHELF_BACKGROUND_DEFAULT, wm_shelf_),
@@ -320,17 +319,6 @@
   background_animator_.PaintBackground(
       shelf_layout_manager_->GetShelfBackgroundType(),
       BACKGROUND_CHANGE_IMMEDIATE);
-  wm_shelf_->SetShelfLayoutManager(shelf_layout_manager_);
-
-  // TODO(jamescook): Move ownership to RootWindowController.
-  status_area_widget_ = new StatusAreaWidget(status_container, wm_shelf_);
-  status_area_widget_->CreateTrayViews();
-  if (WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted())
-    status_area_widget_->Show();
-  WmShell::Get()->focus_cycler()->AddWidget(status_area_widget_);
-  background_animator_.AddObserver(status_area_widget_);
-  status_container->SetLayoutManager(
-      base::MakeUnique<StatusAreaLayoutManager>(this));
 
   views::Widget::AddObserver(this);
 }
@@ -345,6 +333,20 @@
   background_animator_.RemoveObserver(this);
 }
 
+void ShelfWidget::CreateStatusAreaWidget(WmWindow* status_container) {
+  DCHECK(status_container);
+  DCHECK(!status_area_widget_);
+  // TODO(jamescook): Move ownership to RootWindowController.
+  status_area_widget_ = new StatusAreaWidget(status_container, wm_shelf_);
+  status_area_widget_->CreateTrayViews();
+  if (WmShell::Get()->GetSessionStateDelegate()->IsActiveUserSessionStarted())
+    status_area_widget_->Show();
+  WmShell::Get()->focus_cycler()->AddWidget(status_area_widget_);
+  background_animator_.AddObserver(status_area_widget_);
+  status_container->SetLayoutManager(
+      base::MakeUnique<StatusAreaLayoutManager>(this));
+}
+
 void ShelfWidget::SetPaintsBackground(
     ShelfBackgroundType background_type,
     BackgroundAnimatorChangeType change_type) {
diff --git a/ash/common/shelf/shelf_widget.h b/ash/common/shelf/shelf_widget.h
index 1db458c..b02a3c3 100644
--- a/ash/common/shelf/shelf_widget.h
+++ b/ash/common/shelf/shelf_widget.h
@@ -34,11 +34,11 @@
                                public ShelfBackgroundAnimatorObserver,
                                public ShelfLayoutManagerObserver {
  public:
-  ShelfWidget(WmWindow* shelf_container,
-              WmWindow* status_container,
-              WmShelf* wm_shelf);
+  ShelfWidget(WmWindow* shelf_container, WmShelf* wm_shelf);
   ~ShelfWidget() override;
 
+  void CreateStatusAreaWidget(WmWindow* status_container);
+
   // Returns if shelf alignment option is enabled, and the user is able to
   // adjust the alignment (guest and supervised mode users cannot for example).
   static bool ShelfAlignmentAllowed();
@@ -130,6 +130,8 @@
 
   // Owned by the shelf container's window.
   ShelfLayoutManager* shelf_layout_manager_;
+
+  // Owned by the native widget.
   StatusAreaWidget* status_area_widget_;
 
   // |delegate_view_| is the contents view of this widget and is cleaned up
diff --git a/ash/common/shelf/wm_shelf.cc b/ash/common/shelf/wm_shelf.cc
index f7c6e7a..c131ac2 100644
--- a/ash/common/shelf/wm_shelf.cc
+++ b/ash/common/shelf/wm_shelf.cc
@@ -10,6 +10,7 @@
 #include "ash/common/shelf/shelf_widget.h"
 #include "ash/common/shelf/wm_shelf.h"
 #include "ash/common/shelf/wm_shelf_observer.h"
+#include "ash/common/shell_window_ids.h"
 #include "ash/common/wm_lookup.h"
 #include "ash/common/wm_root_window_controller.h"
 #include "ash/common/wm_shell.h"
@@ -24,13 +25,31 @@
   return window->GetRootWindowController()->GetShelf();
 }
 
-void WmShelf::SetShelfLayoutManager(ShelfLayoutManager* manager) {
+void WmShelf::CreateShelfWidget(WmWindow* root) {
+  DCHECK(!shelf_widget_);
+  WmWindow* shelf_container =
+      root->GetChildByShellWindowId(kShellWindowId_ShelfContainer);
+  shelf_widget_.reset(new ShelfWidget(shelf_container, this));
+
   DCHECK(!shelf_layout_manager_);
-  DCHECK(manager);
-  shelf_layout_manager_ = manager;
+  shelf_layout_manager_ = shelf_widget_->shelf_layout_manager();
   shelf_layout_manager_->AddObserver(this);
-  DCHECK(manager->shelf_widget());
-  shelf_widget_ = manager->shelf_widget();
+
+  // Must occur after |shelf_widget_| is constructed because the system tray
+  // constructors call back into WmShelf::shelf_widget().
+  DCHECK(!shelf_widget_->status_area_widget());
+  WmWindow* status_container =
+      root->GetChildByShellWindowId(kShellWindowId_StatusContainer);
+  shelf_widget_->CreateStatusAreaWidget(status_container);
+}
+
+void WmShelf::ShutdownShelfWidget() {
+  if (shelf_widget_)
+    shelf_widget_->Shutdown();
+}
+
+void WmShelf::DestroyShelfWidget() {
+  shelf_widget_.reset();
 }
 
 void WmShelf::InitializeShelf() {
@@ -58,10 +77,7 @@
 }
 
 WmWindow* WmShelf::GetWindow() {
-  // Use |shelf_layout_manager_| to access ShelfWidget because it is set before
-  // before the Shelf instance is available.
-  return WmLookup::Get()->GetWindowForWidget(
-      shelf_layout_manager_->shelf_widget());
+  return WmLookup::Get()->GetWindowForWidget(shelf_widget_.get());
 }
 
 void WmShelf::SetAlignment(ShelfAlignment alignment) {
@@ -79,10 +95,10 @@
 
   alignment_ = alignment;
   // The ShelfWidget notifies the ShelfView of the alignment change.
-  shelf_layout_manager_->shelf_widget()->OnShelfAlignmentChanged();
+  shelf_widget_->OnShelfAlignmentChanged();
   WmShell::Get()->shelf_delegate()->OnShelfAlignmentChanged(this);
+  shelf_layout_manager_->LayoutShelf();
   WmShell::Get()->NotifyShelfAlignmentChanged(GetWindow()->GetRootWindow());
-  // ShelfLayoutManager will resize the shelf.
 }
 
 bool WmShelf::IsHorizontalAlignment() const {
@@ -139,7 +155,7 @@
 }
 
 ShelfBackgroundType WmShelf::GetBackgroundType() const {
-  return shelf_layout_manager_->shelf_widget()->GetBackgroundType();
+  return shelf_widget_->GetBackgroundType();
 }
 
 WmDimmerView* WmShelf::CreateDimmerView(bool disable_animations_for_test) {
@@ -147,7 +163,7 @@
 }
 
 bool WmShelf::IsDimmed() const {
-  return shelf_layout_manager_->shelf_widget()->GetDimsShelf();
+  return shelf_widget_->GetDimsShelf();
 }
 
 bool WmShelf::IsVisible() const {
@@ -174,14 +190,13 @@
 }
 
 void WmShelf::UpdateIconPositionForPanel(WmWindow* panel) {
-  shelf_layout_manager_->shelf_widget()->UpdateIconPositionForPanel(panel);
+  shelf_widget_->UpdateIconPositionForPanel(panel);
 }
 
 gfx::Rect WmShelf::GetScreenBoundsOfItemIconForWindow(WmWindow* window) {
-  if (!shelf_layout_manager_)
+  if (!shelf_widget_)
     return gfx::Rect();
-  return shelf_layout_manager_->shelf_widget()
-      ->GetScreenBoundsOfItemIconForWindow(window);
+  return shelf_widget_->GetScreenBoundsOfItemIconForWindow(window);
 }
 
 // static
@@ -244,7 +259,7 @@
 }
 
 StatusAreaWidget* WmShelf::GetStatusAreaWidget() const {
-  return shelf_layout_manager_->shelf_widget()->status_area_widget();
+  return shelf_widget_->status_area_widget();
 }
 
 void WmShelf::SetVirtualKeyboardBoundsForTesting(const gfx::Rect& bounds) {
diff --git a/ash/common/shelf/wm_shelf.h b/ash/common/shelf/wm_shelf.h
index aa1abe5ff..514c1487 100644
--- a/ash/common/shelf/wm_shelf.h
+++ b/ash/common/shelf/wm_shelf.h
@@ -39,13 +39,15 @@
   // widget may not exist, or the shelf may not be visible.
   static WmShelf* ForWindow(WmWindow* window);
 
-  // TODO(jamescook): Create the ShelfLayoutManager in this class.
-  virtual void SetShelfLayoutManager(ShelfLayoutManager* manager);
+  virtual void CreateShelfWidget(WmWindow* root);
+  void ShutdownShelfWidget();
+  void DestroyShelfWidget();
+
   ShelfLayoutManager* shelf_layout_manager() const {
     return shelf_layout_manager_;
   }
 
-  ShelfWidget* shelf_widget() { return shelf_widget_; }
+  ShelfWidget* shelf_widget() { return shelf_widget_.get(); }
 
   // Creates the shelf view.
   void InitializeShelf();
@@ -155,8 +157,7 @@
   // ShelfWidget and lifetimes are managed by the container windows themselves.
   ShelfLayoutManager* shelf_layout_manager_ = nullptr;
 
-  // TODO(jamescook): Move ShelfWidget ownership here.
-  ShelfWidget* shelf_widget_ = nullptr;
+  std::unique_ptr<ShelfWidget> shelf_widget_;
 
   // Internal implementation detail. Do not expose externally. Owned by views
   // hierarchy. Null before login and in secondary display init.
diff --git a/ash/common/system/ime/tray_ime_chromeos.cc b/ash/common/system/ime/tray_ime_chromeos.cc
index 8b69585b..6038e3b4 100644
--- a/ash/common/system/ime/tray_ime_chromeos.cc
+++ b/ash/common/system/ime/tray_ime_chromeos.cc
@@ -20,6 +20,7 @@
 #include "ash/common/system/tray/tray_utils.h"
 #include "ash/common/system/tray_accessibility.h"
 #include "ash/common/wm_shell.h"
+#include "ash/resources/vector_icons/vector_icons.h"
 #include "base/logging.h"
 #include "base/strings/utf_string_conversions.h"
 #include "grit/ash_resources.h"
@@ -30,7 +31,6 @@
 #include "ui/gfx/font.h"
 #include "ui/gfx/image/image.h"
 #include "ui/gfx/paint_vector_icon.h"
-#include "ui/gfx/vector_icons_public.h"
 #include "ui/keyboard/keyboard_util.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -70,11 +70,10 @@
 
 class IMEDefaultView : public TrayItemMore {
  public:
-  explicit IMEDefaultView(SystemTrayItem* owner, const base::string16& label)
+  IMEDefaultView(SystemTrayItem* owner, const base::string16& label)
       : TrayItemMore(owner, true) {
     if (MaterialDesignController::IsSystemTrayMenuMaterial()) {
-      SetImage(gfx::CreateVectorIcon(gfx::VectorIconId::SYSTEM_MENU_KEYBOARD,
-                                     kMenuIconColor));
+      SetImage(gfx::CreateVectorIcon(kSystemMenuKeyboardIcon, kMenuIconColor));
     } else {
       ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
       SetImage(*bundle.GetImageNamed(IDR_AURA_UBER_TRAY_IME).ToImageSkia());
diff --git a/ash/common/wm/dock/docked_window_layout_manager.cc b/ash/common/wm/dock/docked_window_layout_manager.cc
index 6905634..331231b 100644
--- a/ash/common/wm/dock/docked_window_layout_manager.cc
+++ b/ash/common/wm/dock/docked_window_layout_manager.cc
@@ -29,6 +29,7 @@
 #include "ui/compositor/paint_recorder.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/display/display.h"
+#include "ui/display/screen.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/image_skia_operations.h"
 #include "ui/views/background.h"
@@ -432,7 +433,7 @@
   DCHECK(dock_container);
   dock_container_->GetShell()->AddShellObserver(this);
   dock_container->GetShell()->AddActivationObserver(this);
-  root_window_controller_->AddObserver(this);
+  display::Screen::GetScreen()->AddObserver(this);
 }
 
 DockedWindowLayoutManager::~DockedWindowLayoutManager() {
@@ -460,7 +461,7 @@
   }
   dock_container_->GetShell()->RemoveActivationObserver(this);
   dock_container_->GetShell()->RemoveShellObserver(this);
-  root_window_controller_->RemoveObserver(this);
+  display::Screen::GetScreen()->RemoveObserver(this);
 }
 
 void DockedWindowLayoutManager::AddObserver(
@@ -770,32 +771,19 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// DockedWindowLayoutManager, WmRootWindowControllerObserver implementation:
+// DockedWindowLayoutManager, display::DisplayObserver implementation:
 
-void DockedWindowLayoutManager::OnWorkAreaChanged() {
+void DockedWindowLayoutManager::OnDisplayMetricsChanged(
+    const display::Display& display,
+    uint32_t changed_metrics) {
+  if (dock_container_->GetDisplayNearestWindow().id() != display.id())
+    return;
+
   Relayout();
   UpdateDockBounds(DockedWindowLayoutManagerObserver::DISPLAY_INSETS_CHANGED);
   MaybeMinimizeChildrenExcept(dragged_window_);
 }
 
-void DockedWindowLayoutManager::OnShelfAlignmentChanged() {
-  if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE)
-    return;
-
-  // Do not allow shelf and dock on the same side. Switch side that
-  // the dock is attached to and move all dock windows to that new side.
-  ShelfAlignment shelf_alignment = shelf_->GetAlignment();
-  if (alignment_ == DOCKED_ALIGNMENT_LEFT &&
-      shelf_alignment == SHELF_ALIGNMENT_LEFT) {
-    alignment_ = DOCKED_ALIGNMENT_RIGHT;
-  } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT &&
-             shelf_alignment == SHELF_ALIGNMENT_RIGHT) {
-    alignment_ = DOCKED_ALIGNMENT_LEFT;
-  }
-  Relayout();
-  UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED);
-}
-
 /////////////////////////////////////////////////////////////////////////////
 // DockedWindowLayoutManager, WindowStateObserver implementation:
 
@@ -892,6 +880,23 @@
 // DockedWindowLayoutManager, ShellObserver implementation:
 
 void DockedWindowLayoutManager::OnShelfAlignmentChanged(WmWindow* root_window) {
+  if (!shelf_ || alignment_ == DOCKED_ALIGNMENT_NONE ||
+      root_window != shelf_->GetWindow()->GetRootWindow()) {
+    return;
+  }
+
+  // Do not allow shelf and dock on the same side. Switch side that
+  // the dock is attached to and move all dock windows to that new side.
+  ShelfAlignment shelf_alignment = shelf_->GetAlignment();
+  if (alignment_ == DOCKED_ALIGNMENT_LEFT &&
+      shelf_alignment == SHELF_ALIGNMENT_LEFT) {
+    alignment_ = DOCKED_ALIGNMENT_RIGHT;
+  } else if (alignment_ == DOCKED_ALIGNMENT_RIGHT &&
+             shelf_alignment == SHELF_ALIGNMENT_RIGHT) {
+    alignment_ = DOCKED_ALIGNMENT_LEFT;
+  }
+  Relayout();
+  UpdateDockBounds(DockedWindowLayoutManagerObserver::SHELF_ALIGNMENT_CHANGED);
 }
 
 void DockedWindowLayoutManager::OnFullscreenStateChanged(
diff --git a/ash/common/wm/dock/docked_window_layout_manager.h b/ash/common/wm/dock/docked_window_layout_manager.h
index 8aafe24..539205c 100644
--- a/ash/common/wm/dock/docked_window_layout_manager.h
+++ b/ash/common/wm/dock/docked_window_layout_manager.h
@@ -14,12 +14,12 @@
 #include "ash/common/wm/window_state_observer.h"
 #include "ash/common/wm/wm_snap_to_pixel_layout_manager.h"
 #include "ash/common/wm_activation_observer.h"
-#include "ash/common/wm_root_window_controller_observer.h"
 #include "ash/common/wm_window_observer.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
+#include "ui/display/display_observer.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 
@@ -44,7 +44,7 @@
 // common functionality.
 class ASH_EXPORT DockedWindowLayoutManager
     : public wm::WmSnapToPixelLayoutManager,
-      public WmRootWindowControllerObserver,
+      public display::DisplayObserver,
       public WmWindowObserver,
       public WmActivationObserver,
       public ShellObserver,
@@ -135,9 +135,9 @@
   void SetChildBounds(WmWindow* child,
                       const gfx::Rect& requested_bounds) override;
 
-  // WmRootWindowControllerObserver:
-  void OnWorkAreaChanged() override;
-  void OnShelfAlignmentChanged() override;
+  // display::DisplayObserver:
+  void OnDisplayMetricsChanged(const display::Display& display,
+                               uint32_t changed_metrics) override;
 
   // wm::WindowStateObserver:
   void OnPreWindowStateTypeChange(wm::WindowState* window_state,
diff --git a/ash/common/wm/window_cycle_list.cc b/ash/common/wm/window_cycle_list.cc
index 4006b03..17591a08 100644
--- a/ash/common/wm/window_cycle_list.cc
+++ b/ash/common/wm/window_cycle_list.cc
@@ -390,6 +390,10 @@
     }
   }
 
+  void OnMouseCaptureLost() override {
+    WmShell::Get()->window_cycle_controller()->StopCycling();
+  }
+
   View* GetContentsView() override { return this; }
 
   View* GetInitiallyFocusedView() override {
@@ -464,6 +468,7 @@
       current_index_(0),
       initial_direction_(WindowCycleController::FORWARD),
       cycle_view_(nullptr),
+      cycle_ui_widget_(nullptr),
       screen_observer_(this) {
   if (!ShouldShowUi())
     WmShell::Get()->mru_window_tracker()->SetIgnoreActivations(true);
@@ -495,6 +500,9 @@
     target_window->Show();
     target_window->GetWindowState()->Activate();
   }
+
+  if (cycle_ui_widget_)
+    cycle_ui_widget_->Close();
 }
 
 void WindowCycleList::Step(WindowCycleController::Direction direction) {
@@ -598,7 +606,6 @@
   views::Widget::InitParams params;
   params.delegate = cycle_view_;
   params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
-  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
   params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
   params.accept_events = true;
   params.name = "WindowCycleList (Alt+Tab)";
@@ -616,7 +623,9 @@
   widget_rect.set_height(widget_height);
   widget->SetBounds(widget_rect);
   widget->Show();
-  cycle_ui_widget_.reset(widget);
+  widget->SetCapture(cycle_view_);
+  widget->set_auto_release_capture(false);
+  cycle_ui_widget_ = widget;
 }
 
 }  // namespace ash
diff --git a/ash/common/wm/window_cycle_list.h b/ash/common/wm/window_cycle_list.h
index 49a98dcb..0557396 100644
--- a/ash/common/wm/window_cycle_list.h
+++ b/ash/common/wm/window_cycle_list.h
@@ -95,7 +95,7 @@
   WindowCycleView* cycle_view_;
 
   // The widget that hosts the window cycle UI.
-  std::unique_ptr<views::Widget> cycle_ui_widget_;
+  views::Widget* cycle_ui_widget_;
 
   // The window list will dismiss if the display metrics change.
   ScopedObserver<display::Screen, display::DisplayObserver> screen_observer_;
diff --git a/ash/common/wm/workspace/workspace_layout_manager.cc b/ash/common/wm/workspace/workspace_layout_manager.cc
index 61c188c..0f5ed64 100644
--- a/ash/common/wm/workspace/workspace_layout_manager.cc
+++ b/ash/common/wm/workspace/workspace_layout_manager.cc
@@ -23,6 +23,8 @@
 #include "base/command_line.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/layer.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
 #include "ui/keyboard/keyboard_controller.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 
@@ -38,7 +40,7 @@
   shell_->AddShellObserver(this);
   shell_->AddActivationObserver(this);
   root_window_->AddObserver(this);
-  root_window_controller_->AddObserver(this);
+  display::Screen::GetScreen()->AddObserver(this);
   DCHECK(window->GetBoolProperty(
       WmWindowProperty::SNAP_CHILDREN_TO_PIXEL_BOUNDARY));
 }
@@ -51,7 +53,7 @@
     window_state->RemoveObserver(this);
     window->RemoveObserver(this);
   }
-  root_window_->GetRootWindowController()->RemoveObserver(this);
+  display::Screen::GetScreen()->RemoveObserver(this);
   shell_->RemoveActivationObserver(this);
   shell_->RemoveShellObserver(this);
 }
@@ -174,19 +176,6 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////
-// WorkspaceLayoutManager, WmRootWindowControllerObserver implementation:
-
-void WorkspaceLayoutManager::OnWorkAreaChanged() {
-  const gfx::Rect work_area(wm::GetDisplayWorkAreaBounds(window_));
-  if (work_area != work_area_in_parent_) {
-    const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED);
-    AdjustAllWindowsBoundsForWorkAreaChange(&event);
-  }
-  if (backdrop_delegate_)
-    backdrop_delegate_->OnDisplayWorkAreaInsetsChanged();
-}
-
-//////////////////////////////////////////////////////////////////////////////
 // WorkspaceLayoutManager, aura::WindowObserver implementation:
 
 void WorkspaceLayoutManager::OnWindowTreeChanged(
@@ -282,6 +271,24 @@
 }
 
 //////////////////////////////////////////////////////////////////////////////
+// WorkspaceLayoutManager, display::DisplayObserver implementation:
+
+void WorkspaceLayoutManager::OnDisplayMetricsChanged(
+    const display::Display& display,
+    uint32_t changed_metrics) {
+  if (window_->GetDisplayNearestWindow().id() != display.id())
+    return;
+
+  const gfx::Rect work_area(wm::GetDisplayWorkAreaBounds(window_));
+  if (work_area != work_area_in_parent_) {
+    const wm::WMEvent event(wm::WM_EVENT_WORKAREA_BOUNDS_CHANGED);
+    AdjustAllWindowsBoundsForWorkAreaChange(&event);
+  }
+  if (backdrop_delegate_)
+    backdrop_delegate_->OnDisplayWorkAreaInsetsChanged();
+}
+
+//////////////////////////////////////////////////////////////////////////////
 // WorkspaceLayoutManager, ShellObserver implementation:
 
 void WorkspaceLayoutManager::OnFullscreenStateChanged(bool is_fullscreen,
diff --git a/ash/common/wm/workspace/workspace_layout_manager.h b/ash/common/wm/workspace/workspace_layout_manager.h
index e11a782..1a454c26 100644
--- a/ash/common/wm/workspace/workspace_layout_manager.h
+++ b/ash/common/wm/workspace/workspace_layout_manager.h
@@ -14,9 +14,9 @@
 #include "ash/common/wm/wm_types.h"
 #include "ash/common/wm_activation_observer.h"
 #include "ash/common/wm_layout_manager.h"
-#include "ash/common/wm_root_window_controller_observer.h"
 #include "ash/common/wm_window_observer.h"
 #include "base/macros.h"
+#include "ui/display/display_observer.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/keyboard/keyboard_controller_observer.h"
 
@@ -35,7 +35,7 @@
       public WmWindowObserver,
       public WmActivationObserver,
       public keyboard::KeyboardControllerObserver,
-      public WmRootWindowControllerObserver,
+      public display::DisplayObserver,
       public ShellObserver,
       public wm::WindowStateObserver {
  public:
@@ -58,9 +58,6 @@
   void SetChildBounds(WmWindow* child,
                       const gfx::Rect& requested_bounds) override;
 
-  // WmRootWindowControllerObserver overrides:
-  void OnWorkAreaChanged() override;
-
   // Overriden from WmWindowObserver:
   void OnWindowTreeChanged(
       WmWindow* window,
@@ -84,6 +81,10 @@
   void OnPostWindowStateTypeChange(wm::WindowState* window_state,
                                    wm::WindowStateType old_type) override;
 
+  // display::DisplayObserver overrides:
+  void OnDisplayMetricsChanged(const display::Display& display,
+                               uint32_t changed_metrics) override;
+
   // ShellObserver overrides:
   void OnFullscreenStateChanged(bool is_fullscreen,
                                 WmWindow* root_window) override;
diff --git a/ash/common/wm_root_window_controller.cc b/ash/common/wm_root_window_controller.cc
index da63605..f487592 100644
--- a/ash/common/wm_root_window_controller.cc
+++ b/ash/common/wm_root_window_controller.cc
@@ -38,16 +38,6 @@
                                : wm::WORKSPACE_WINDOW_STATE_DEFAULT;
 }
 
-void WmRootWindowController::AddObserver(
-    WmRootWindowControllerObserver* observer) {
-  observers_.AddObserver(observer);
-}
-
-void WmRootWindowController::RemoveObserver(
-    WmRootWindowControllerObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
 void WmRootWindowController::CreateContainers() {
   // These containers are just used by PowerButtonController to animate groups
   // of containers simultaneously without messing up the current transformations
diff --git a/ash/common/wm_root_window_controller.h b/ash/common/wm_root_window_controller.h
index c897fdd7..e190072 100644
--- a/ash/common/wm_root_window_controller.h
+++ b/ash/common/wm_root_window_controller.h
@@ -8,7 +8,6 @@
 #include "ash/ash_export.h"
 #include "ash/common/wm/workspace/workspace_types.h"
 #include "base/macros.h"
-#include "base/observer_list.h"
 #include "ui/views/widget/widget.h"
 
 namespace gfx {
@@ -20,7 +19,6 @@
 class AlwaysOnTopController;
 class WmShelf;
 class WmShell;
-class WmRootWindowControllerObserver;
 class WmWindow;
 class WorkspaceController;
 
@@ -44,9 +42,6 @@
 
   wm::WorkspaceWindowState GetWorkspaceWindowState();
 
-  void AddObserver(WmRootWindowControllerObserver* observer);
-  void RemoveObserver(WmRootWindowControllerObserver* observer);
-
   virtual bool HasShelf() = 0;
 
   virtual WmShell* GetShell() = 0;
@@ -85,10 +80,6 @@
 
   void DeleteWorkspaceController();
 
-  base::ObserverList<WmRootWindowControllerObserver>* observers() {
-    return &observers_;
-  }
-
  private:
   WmWindow* root_;
 
@@ -96,8 +87,6 @@
 
   std::unique_ptr<WorkspaceController> workspace_controller_;
 
-  base::ObserverList<WmRootWindowControllerObserver> observers_;
-
   DISALLOW_COPY_AND_ASSIGN(WmRootWindowController);
 };
 
diff --git a/ash/common/wm_root_window_controller_observer.h b/ash/common/wm_root_window_controller_observer.h
deleted file mode 100644
index dd959f1..0000000
--- a/ash/common/wm_root_window_controller_observer.h
+++ /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.
-
-#ifndef ASH_COMMON_WM_ROOT_WINDOW_CONTROLLER_OBSERVER_H_
-#define ASH_COMMON_WM_ROOT_WINDOW_CONTROLLER_OBSERVER_H_
-
-#include "ash/ash_export.h"
-
-namespace ash {
-
-class WmWindow;
-
-// TODO(sky): nuke and go back to ShellObserver.
-class ASH_EXPORT WmRootWindowControllerObserver {
- public:
-  virtual void OnWorkAreaChanged() {}
-  virtual void OnShelfAlignmentChanged() {}
-
- protected:
-  virtual ~WmRootWindowControllerObserver() {}
-};
-
-}  // namespace ash
-
-#endif  // ASH_COMMON_WM_ROOT_WINDOW_CONTROLLER_OBSERVER_H_
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
index a540a38..e99e656 100644
--- a/ash/display/display_manager.cc
+++ b/ash/display/display_manager.cc
@@ -15,10 +15,7 @@
 
 #include "ash/common/ash_switches.h"
 #include "ash/display/display_util.h"
-#include "ash/display/extended_mouse_warp_controller.h"
-#include "ash/display/null_mouse_warp_controller.h"
 #include "ash/display/screen_ash.h"
-#include "ash/display/unified_mouse_warp_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "base/auto_reset.h"
@@ -1071,17 +1068,6 @@
                             weak_ptr_factory_.GetWeakPtr()));
 }
 
-std::unique_ptr<MouseWarpController> DisplayManager::CreateMouseWarpController(
-    aura::Window* drag_source) const {
-  if (IsInUnifiedMode() && num_connected_displays() >= 2)
-    return base::MakeUnique<UnifiedMouseWarpController>();
-  // Extra check for |num_connected_displays()| is for SystemDisplayApiTest
-  // that injects MockScreen.
-  if (GetNumDisplays() < 2 || num_connected_displays() < 2)
-    return base::MakeUnique<NullMouseWarpController>();
-  return base::MakeUnique<ExtendedMouseWarpController>(drag_source);
-}
-
 void DisplayManager::CreateScreenForShutdown() const {
   delete screen_for_shutdown;
   screen_for_shutdown = screen_->CloneForShutdown();
diff --git a/ash/display/display_manager.h b/ash/display/display_manager.h
index 9730b3a2..f865ba9 100644
--- a/ash/display/display_manager.h
+++ b/ash/display/display_manager.h
@@ -45,7 +45,6 @@
 
 namespace ash {
 class AcceleratorControllerTest;
-class MouseWarpController;
 class ScreenAsh;
 
 using DisplayInfoList = std::vector<display::ManagedDisplayInfo>;
@@ -328,12 +327,6 @@
   // is enabled.
   void CreateMirrorWindowAsyncIfAny();
 
-  // Creates a MouseWarpController for the current display
-  // configuration. |drag_source| is the window where dragging
-  // started, or nullptr otherwise.
-  std::unique_ptr<MouseWarpController> CreateMouseWarpController(
-      aura::Window* drag_source) const;
-
   // Create a screen instance to be used during shutdown.
   void CreateScreenForShutdown() const;
 
diff --git a/ash/display/display_util.cc b/ash/display/display_util.cc
index e5b2544..6b12107 100644
--- a/ash/display/display_util.cc
+++ b/ash/display/display_util.cc
@@ -10,6 +10,11 @@
 #include "ash/common/system/system_notifier.h"
 #include "ash/common/wm_shell.h"
 #include "ash/display/display_manager.h"
+
+#include "ash/display/extended_mouse_warp_controller.h"
+#include "ash/display/null_mouse_warp_controller.h"
+#include "ash/display/unified_mouse_warp_controller.h"
+
 #include "ash/host/ash_window_tree_host.h"
 #include "ash/shell.h"
 #include "base/strings/string_number_conversions.h"
@@ -83,6 +88,18 @@
 
 }  // namespace
 
+std::unique_ptr<MouseWarpController> CreateMouseWarpController(
+    DisplayManager* manager,
+    aura::Window* drag_source) {
+  if (manager->IsInUnifiedMode() && manager->num_connected_displays() >= 2)
+    return base::MakeUnique<UnifiedMouseWarpController>();
+  // Extra check for |num_connected_displays()| is for SystemDisplayApiTest
+  // that injects MockScreen.
+  if (manager->GetNumDisplays() < 2 || manager->num_connected_displays() < 2)
+    return base::MakeUnique<NullMouseWarpController>();
+  return base::MakeUnique<ExtendedMouseWarpController>(drag_source);
+}
+
 bool SetDisplayUIScale(int64_t id, float ui_scale) {
   DisplayManager* display_manager = Shell::GetInstance()->display_manager();
   if (!display_manager->IsActiveDisplayId(id) ||
diff --git a/ash/display/display_util.h b/ash/display/display_util.h
index 343ebca..56180f9 100644
--- a/ash/display/display_util.h
+++ b/ash/display/display_util.h
@@ -5,16 +5,14 @@
 #ifndef ASH_DISPLAY_DISPLAY_UTIL_H_
 #define ASH_DISPLAY_DISPLAY_UTIL_H_
 
-#include <stdint.h>
-
-#include <set>
-#include <utility>
-#include <vector>
+#include <memory>
 
 #include "ash/ash_export.h"
-#include "base/memory/ref_counted.h"
-#include "ui/display/manager/display_layout.h"
-#include "ui/display/manager/managed_display_info.h"
+#include "base/strings/string16.h"
+
+namespace aura {
+class Window;
+}
 
 namespace display {
 class ManagedDisplayInfo;
@@ -23,13 +21,19 @@
 namespace gfx {
 class Point;
 class Rect;
-class Size;
 }
 
-namespace ui {}
-
 namespace ash {
 class AshWindowTreeHost;
+class DisplayManager;
+class MouseWarpController;
+
+// Creates a MouseWarpController for the current display
+// configuration. |drag_source| is the window where dragging
+// started, or nullptr otherwise.
+std::unique_ptr<MouseWarpController> CreateMouseWarpController(
+    DisplayManager* manager,
+    aura::Window* drag_source);
 
 // TODO(rjkroege): Move this into display_manager.h
 // Sets the UI scale for the |display_id|. Returns false if the
diff --git a/ash/display/mouse_cursor_event_filter.cc b/ash/display/mouse_cursor_event_filter.cc
index d3352888..7a45947 100644
--- a/ash/display/mouse_cursor_event_filter.cc
+++ b/ash/display/mouse_cursor_event_filter.cc
@@ -7,8 +7,10 @@
 #include <cmath>
 
 #include "ash/display/cursor_window_controller.h"
-#include "ash/display/display_manager.h"
+//#include "ash/display/display_manager.h"
+#include "ash/display/display_util.h"
 #include "ash/display/mouse_warp_controller.h"
+
 #include "ash/shell.h"
 #include "ui/events/event.h"
 
@@ -23,8 +25,8 @@
 }
 
 void MouseCursorEventFilter::ShowSharedEdgeIndicator(aura::Window* from) {
-  mouse_warp_controller_ =
-      Shell::GetInstance()->display_manager()->CreateMouseWarpController(from);
+  mouse_warp_controller_ = ash::CreateMouseWarpController(
+      Shell::GetInstance()->display_manager(), from);
 }
 
 void MouseCursorEventFilter::HideSharedEdgeIndicator() {
@@ -36,9 +38,8 @@
 }
 
 void MouseCursorEventFilter::OnDisplayConfigurationChanged() {
-  mouse_warp_controller_ =
-      Shell::GetInstance()->display_manager()->CreateMouseWarpController(
-          nullptr);
+  mouse_warp_controller_ = ash::CreateMouseWarpController(
+      Shell::GetInstance()->display_manager(), nullptr);
 }
 
 void MouseCursorEventFilter::OnMouseEvent(ui::MouseEvent* event) {
diff --git a/ash/display/mouse_cursor_event_filter.h b/ash/display/mouse_cursor_event_filter.h
index 9da9a41..049f9b9 100644
--- a/ash/display/mouse_cursor_event_filter.h
+++ b/ash/display/mouse_cursor_event_filter.h
@@ -22,6 +22,7 @@
 
 namespace ash {
 class DisplayEdgeController;
+class MouseWarpController;
 
 // An event filter that controls mouse location in extended desktop
 // environment.
diff --git a/ash/mus/accelerators/accelerator_controller_delegate_mus.cc b/ash/mus/accelerators/accelerator_controller_delegate_mus.cc
index 3990e69..6498af4b 100644
--- a/ash/mus/accelerators/accelerator_controller_delegate_mus.cc
+++ b/ash/mus/accelerators/accelerator_controller_delegate_mus.cc
@@ -33,7 +33,6 @@
     case SCALE_UI_DOWN:
     case SCALE_UI_RESET:
     case SCALE_UI_UP:
-    case SHOW_MESSAGE_CENTER_BUBBLE:
     case SHOW_SYSTEM_TRAY_BUBBLE:
     case TAKE_PARTIAL_SCREENSHOT:
     case TAKE_SCREENSHOT:
diff --git a/ash/mus/bridge/wm_root_window_controller_mus.cc b/ash/mus/bridge/wm_root_window_controller_mus.cc
index c9bbfa75..46531b5 100644
--- a/ash/mus/bridge/wm_root_window_controller_mus.cc
+++ b/ash/mus/bridge/wm_root_window_controller_mus.cc
@@ -4,7 +4,6 @@
 
 #include "ash/mus/bridge/wm_root_window_controller_mus.h"
 
-#include "ash/common/wm_root_window_controller_observer.h"
 #include "ash/mus/bridge/wm_shelf_mus.h"
 #include "ash/mus/bridge/wm_shell_mus.h"
 #include "ash/mus/bridge/wm_window_mus.h"
diff --git a/ash/mus/bridge/wm_root_window_controller_mus.h b/ash/mus/bridge/wm_root_window_controller_mus.h
index a154256..02a1482 100644
--- a/ash/mus/bridge/wm_root_window_controller_mus.h
+++ b/ash/mus/bridge/wm_root_window_controller_mus.h
@@ -66,7 +66,6 @@
 
   WmShellMus* shell_;
   RootWindowController* root_window_controller_;
-  base::ObserverList<WmRootWindowControllerObserver> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(WmRootWindowControllerMus);
 };
diff --git a/ash/mus/bridge/wm_shelf_mus.cc b/ash/mus/bridge/wm_shelf_mus.cc
index 0b03fcf..657ab36 100644
--- a/ash/mus/bridge/wm_shelf_mus.cc
+++ b/ash/mus/bridge/wm_shelf_mus.cc
@@ -5,7 +5,6 @@
 #include "ash/mus/bridge/wm_shelf_mus.h"
 
 #include "ash/common/shelf/shelf_widget.h"
-#include "ash/common/shell_window_ids.h"
 #include "ash/common/wm_root_window_controller.h"
 #include "ash/common/wm_shell.h"
 #include "ash/common/wm_window.h"
@@ -13,25 +12,22 @@
 namespace ash {
 namespace mus {
 
-WmShelfMus::WmShelfMus(WmRootWindowController* root_window_controller) {
-  DCHECK(root_window_controller);
+WmShelfMus::WmShelfMus(WmWindow* root_window) {
+  DCHECK(root_window);
   WmShell::Get()->CreateShelfDelegate();
-  WmWindow* root = root_window_controller->GetWindow();
-  shelf_widget_.reset(new ShelfWidget(
-      root->GetChildByShellWindowId(kShellWindowId_ShelfContainer),
-      root->GetChildByShellWindowId(kShellWindowId_StatusContainer), this));
+  CreateShelfWidget(root_window);
   InitializeShelf();
-  WmShell::Get()->NotifyShelfCreatedForRootWindow(root);
-  shelf_widget_->PostCreateShelf();
+  WmShell::Get()->NotifyShelfCreatedForRootWindow(root_window);
+  shelf_widget()->PostCreateShelf();
 }
 
 WmShelfMus::~WmShelfMus() {
-  shelf_widget_.reset();
+  DestroyShelfWidget();
   ShutdownShelf();
 }
 
 void WmShelfMus::WillDeleteShelfLayoutManager() {
-  shelf_widget_->Shutdown();
+  ShutdownShelfWidget();
   WmShelf::WillDeleteShelfLayoutManager();
 }
 
diff --git a/ash/mus/bridge/wm_shelf_mus.h b/ash/mus/bridge/wm_shelf_mus.h
index 84ec659..b6c1bd7 100644
--- a/ash/mus/bridge/wm_shelf_mus.h
+++ b/ash/mus/bridge/wm_shelf_mus.h
@@ -10,24 +10,20 @@
 
 namespace ash {
 
-class ShelfWidget;
-class WmRootWindowController;
+class WmWindow;
 
 namespace mus {
 
 // WmShelf implementation for mus.
 class WmShelfMus : public WmShelf {
  public:
-  WmShelfMus(WmRootWindowController* root_window_controller);
+  explicit WmShelfMus(WmWindow* root_window);
   ~WmShelfMus() override;
 
   // WmShelf:
   void WillDeleteShelfLayoutManager() override;
 
  private:
-  // The shelf widget for this shelf.
-  std::unique_ptr<ShelfWidget> shelf_widget_;
-
   DISALLOW_COPY_AND_ASSIGN(WmShelfMus);
 };
 
diff --git a/ash/mus/root_window_controller.cc b/ash/mus/root_window_controller.cc
index 46ceb10..f9584af 100644
--- a/ash/mus/root_window_controller.cc
+++ b/ash/mus/root_window_controller.cc
@@ -170,7 +170,7 @@
       new ScreenlockLayout(lock_screen_container->mus_window()));
 
   // Creating the shelf also creates the status area and both layout managers.
-  wm_shelf_.reset(new WmShelfMus(wm_root_window_controller_.get()));
+  wm_shelf_.reset(new WmShelfMus(wm_root_window_controller_->GetWindow()));
 
   WmWindowMus* default_container =
       GetWindowByShellWindowId(kShellWindowId_DefaultContainer);
diff --git a/ash/resources/OWNERS b/ash/resources/OWNERS
index 92f3fbb9..3064b12 100644
--- a/ash/resources/OWNERS
+++ b/ash/resources/OWNERS
@@ -1 +1,2 @@
 oshima@chromium.org
+tdanderson@chromium.org
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
new file mode 100644
index 0000000..5755f2c0
--- /dev/null
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -0,0 +1,47 @@
+# 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.
+
+action("aggregate_vector_icons") {
+  visibility = [ ":*" ]
+
+  script = "//ui/gfx/vector_icons/aggregate_vector_icons.py"
+
+  icons = [
+    "system_menu_keyboard.1x.icon",
+    "system_menu_keyboard.icon",
+  ]
+
+  output_cc = "$target_gen_dir/vector_icons.cc"
+  output_h = "$target_gen_dir/vector_icons.h"
+
+  inputs = icons
+  inputs += [
+    "vector_icons.cc.template",
+    "vector_icons.h.template",
+  ]
+  outputs = [
+    output_cc,
+    output_h,
+  ]
+
+  response_file_contents = rebase_path(icons, root_build_dir)
+
+  args = [
+    "--working_directory=" + rebase_path("./"),
+    "--file_list={{response_file_name}}",
+    "--output_cc=" + rebase_path(output_cc, root_build_dir),
+    "--output_h=" + rebase_path(output_h, root_build_dir),
+  ]
+}
+
+source_set("vector_icons") {
+  sources = get_target_outputs(":aggregate_vector_icons")
+  sources += [ "//ui/gfx/vector_icon_types.h" ]
+
+  deps = [
+    ":aggregate_vector_icons",
+    "//base",
+    "//skia",
+  ]
+}
diff --git a/ui/gfx/vector_icons/system_menu_keyboard.1x.icon b/ash/resources/vector_icons/system_menu_keyboard.1x.icon
similarity index 100%
rename from ui/gfx/vector_icons/system_menu_keyboard.1x.icon
rename to ash/resources/vector_icons/system_menu_keyboard.1x.icon
diff --git a/ui/gfx/vector_icons/system_menu_keyboard.icon b/ash/resources/vector_icons/system_menu_keyboard.icon
similarity index 100%
rename from ui/gfx/vector_icons/system_menu_keyboard.icon
rename to ash/resources/vector_icons/system_menu_keyboard.icon
diff --git a/ash/resources/vector_icons/vector_icons.cc.template b/ash/resources/vector_icons/vector_icons.cc.template
new file mode 100644
index 0000000..e6f5f90
--- /dev/null
+++ b/ash/resources/vector_icons/vector_icons.cc.template
@@ -0,0 +1,25 @@
+// 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.
+
+// vector_icons.cc.template is used to generate vector_icons.cc. Edit the former
+// rather than the latter.
+
+#include "ash/resources/vector_icons/vector_icons.h"
+
+#include "base/logging.h"
+#include "ui/gfx/vector_icon_types.h"
+
+#define PATH_ELEMENT_TEMPLATE(path_name, ...) \
+static gfx::PathElement path_name[] = {__VA_ARGS__};
+
+#define VECTOR_ICON_TEMPLATE(icon_name, path_name, path_name_1x) \
+const gfx::VectorIcon icon_name = { path_name , path_name_1x };
+
+namespace ash {
+
+using namespace gfx;
+
+TEMPLATE_PLACEHOLDER
+
+}  // namespace ash
diff --git a/ash/resources/vector_icons/vector_icons.h.template b/ash/resources/vector_icons/vector_icons.h.template
new file mode 100644
index 0000000..a8473475
--- /dev/null
+++ b/ash/resources/vector_icons/vector_icons.h.template
@@ -0,0 +1,24 @@
+// 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.
+
+// vector_icons.h.template is used to generate vector_icons.h. Edit the former
+// rather than the latter.
+
+#ifndef ASH_RESOURCES_VECTOR_ICONS_VECTOR_ICONS_H_
+#define ASH_RESOURCES_VECTOR_ICONS_VECTOR_ICONS_H_
+
+namespace gfx {
+struct VectorIcon;
+}
+
+#define VECTOR_ICON_TEMPLATE_H(icon_name) \
+extern const gfx::VectorIcon icon_name;
+
+namespace ash {
+
+TEMPLATE_PLACEHOLDER
+
+}  // namespace ash
+
+#endif  // ASH_RESOURCES_VECTOR_ICONS_VECTOR_ICONS_H_
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 2828c4e..2051fc1 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -466,8 +466,8 @@
   if (!wm_shelf_aura_->IsShelfInitialized())
     return;
   // TODO(jamescook): Move this into WmShelf.
-  shelf_widget_->SetShelfVisibility(true);
-  shelf_widget_->status_area_widget()->Show();
+  wm_shelf_aura_->shelf_widget()->SetShelfVisibility(true);
+  wm_shelf_aura_->shelf_widget()->status_area_widget()->Show();
 }
 
 void RootWindowController::CreateShelf() {
@@ -479,9 +479,10 @@
     panel_layout_manager_->SetShelf(wm_shelf_aura_.get());
   if (docked_layout_manager_) {
     docked_layout_manager_->SetShelf(wm_shelf_aura_.get());
-    if (shelf_widget_->shelf_layout_manager())
+    if (wm_shelf_aura_->shelf_layout_manager()) {
       docked_layout_manager_->AddObserver(
-          shelf_widget_->shelf_layout_manager());
+          wm_shelf_aura_->shelf_layout_manager());
+    }
   }
 
   // Notify shell observers that the shelf has been created.
@@ -490,14 +491,16 @@
   WmShell::Get()->NotifyShelfCreatedForRootWindow(
       WmWindowAura::Get(GetRootWindow()));
 
-  shelf_widget_->PostCreateShelf();
+  wm_shelf_aura_->shelf_widget()->PostCreateShelf();
 }
 
 void RootWindowController::UpdateAfterLoginStatusChange(LoginStatus status) {
   if (status != LoginStatus::NOT_LOGGED_IN)
     mouse_event_target_.reset();
-  if (shelf_widget_->status_area_widget())
-    shelf_widget_->status_area_widget()->UpdateAfterLoginStatusChange(status);
+  StatusAreaWidget* status_area_widget =
+      wm_shelf_aura_->shelf_widget()->status_area_widget();
+  if (status_area_widget)
+    status_area_widget->UpdateAfterLoginStatusChange(status);
 }
 
 void RootWindowController::HandleInitialWallpaperAnimationStarted() {
@@ -538,10 +541,10 @@
 
   // Remove observer as deactivating keyboard causes |docked_layout_manager_|
   // to fire notifications.
-  if (docked_layout_manager_ && shelf_widget_ &&
-      shelf_widget_->shelf_layout_manager())
+  if (docked_layout_manager_ && wm_shelf_aura_->shelf_layout_manager()) {
     docked_layout_manager_->RemoveObserver(
-        shelf_widget_->shelf_layout_manager());
+        wm_shelf_aura_->shelf_layout_manager());
+  }
 
   // Deactivate keyboard container before closing child windows and shutting
   // down associated layout managers.
@@ -560,8 +563,7 @@
   aura::Window* root_window = GetRootWindow();
   aura::client::SetDragDropClient(root_window, NULL);
 
-  if (shelf_widget_)
-    shelf_widget_->Shutdown();
+  wm_shelf_aura_->ShutdownShelfWidget();
 
   // Close wallpaper widget first as it depends on tooltip.
   wallpaper_widget_controller_.reset();
@@ -601,7 +603,8 @@
     }
   }
 
-  shelf_widget_.reset();
+  wm_shelf_aura_->DestroyShelfWidget();
+
   // CloseChildWindows may be called twice during the shutdown of ash unittests.
   // Avoid notifying WmShelf that the shelf has been destroyed twice.
   if (wm_shelf_aura_->IsShelfInitialized())
@@ -615,14 +618,19 @@
 }
 
 ShelfLayoutManager* RootWindowController::GetShelfLayoutManager() {
-  return shelf_widget_->shelf_layout_manager();
+  return wm_shelf_aura_->shelf_layout_manager();
+}
+
+StatusAreaWidget* RootWindowController::GetStatusAreaWidget() {
+  ShelfWidget* shelf_widget = wm_shelf_aura_->shelf_widget();
+  return shelf_widget ? shelf_widget->status_area_widget() : nullptr;
 }
 
 SystemTray* RootWindowController::GetSystemTray() {
   // We assume in throughout the code that this will not return NULL. If code
   // triggers this for valid reasons, it should test status_area_widget first.
-  CHECK(shelf_widget_->status_area_widget());
-  return shelf_widget_->status_area_widget()->system_tray();
+  CHECK(wm_shelf_aura_->shelf_widget()->status_area_widget());
+  return wm_shelf_aura_->shelf_widget()->status_area_widget()->system_tray();
 }
 
 void RootWindowController::ShowContextMenu(const gfx::Point& location_in_screen,
@@ -652,7 +660,7 @@
 }
 
 void RootWindowController::UpdateShelfVisibility() {
-  shelf_widget_->shelf_layout_manager()->UpdateVisibilityState();
+  wm_shelf_aura_->UpdateVisibilityState();
 }
 
 aura::Window* RootWindowController::GetWindowForFullscreenMode() {
@@ -667,7 +675,7 @@
     return;
   }
   DCHECK(keyboard_controller);
-  keyboard_controller->AddObserver(shelf_widget()->shelf_layout_manager());
+  keyboard_controller->AddObserver(wm_shelf_aura_->shelf_layout_manager());
   keyboard_controller->AddObserver(panel_layout_manager_);
   keyboard_controller->AddObserver(docked_layout_manager_);
   keyboard_controller->AddObserver(workspace_controller()->layout_manager());
@@ -696,7 +704,7 @@
     // Virtual keyboard may be deactivated while still showing, notify all
     // observers that keyboard bounds changed to 0 before remove them.
     keyboard_controller->NotifyKeyboardBoundsChanging(gfx::Rect());
-    keyboard_controller->RemoveObserver(shelf_widget()->shelf_layout_manager());
+    keyboard_controller->RemoveObserver(wm_shelf_aura_->shelf_layout_manager());
     keyboard_controller->RemoveObserver(panel_layout_manager_);
     keyboard_controller->RemoveObserver(docked_layout_manager_);
     keyboard_controller->RemoveObserver(
@@ -812,13 +820,13 @@
       new AlwaysOnTopController(always_on_top_container));
 
   // Create the shelf and status area widgets.
-  DCHECK(!shelf_widget_.get());
+  DCHECK(!wm_shelf_aura_->shelf_widget());
   aura::Window* shelf_container = GetContainer(kShellWindowId_ShelfContainer);
   aura::Window* status_container = GetContainer(kShellWindowId_StatusContainer);
   WmWindow* wm_shelf_container = WmWindowAura::Get(shelf_container);
   WmWindow* wm_status_container = WmWindowAura::Get(status_container);
-  shelf_widget_.reset(new ShelfWidget(wm_shelf_container, wm_status_container,
-                                      wm_shelf_aura_.get()));
+  wm_shelf_aura_->CreateShelfWidget(WmWindowAura::Get(root_window));
+
   // Make it easier to resize windows that partially overlap the shelf. Must
   // occur after the ShelfLayoutManager is constructed by ShelfWidget.
   shelf_container->SetEventTargeter(base::MakeUnique<ShelfWindowTargeter>(
@@ -919,7 +927,7 @@
 }
 
 void RootWindowController::OnLoginStateChanged(LoginStatus status) {
-  shelf_widget_->shelf_layout_manager()->UpdateVisibilityState();
+  wm_shelf_aura_->UpdateVisibilityState();
 }
 
 void RootWindowController::OnTouchHudProjectionToggled(bool enabled) {
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 7481d30..8a18f48 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -56,7 +56,6 @@
 enum class LoginStatus;
 class PanelLayoutManager;
 class ShelfLayoutManager;
-class ShelfWidget;
 class StackingController;
 class StatusAreaWidget;
 class SystemModalContainerLayoutManager;
@@ -118,11 +117,6 @@
 
   WmShelfAura* wm_shelf_aura() const { return wm_shelf_aura_.get(); }
 
-  // Access the shelf widget associated with this root window controller,
-  // NULL if no such shelf exists.
-  // DEPRECATED: Prefer GetShelf()->shelf_widget().
-  ShelfWidget* shelf_widget() { return shelf_widget_.get(); }
-
   // Get touch HUDs associated with this root window controller.
   TouchHudDebug* touch_hud_debug() const { return touch_hud_debug_; }
   TouchHudProjection* touch_hud_projection() const {
@@ -152,6 +146,9 @@
   // window controller, NULL if no such shelf exists.
   ShelfLayoutManager* GetShelfLayoutManager();
 
+  // May return null, for example for a secondary monitor at the login screen.
+  StatusAreaWidget* GetStatusAreaWidget();
+
   // Returns the system tray on this root window. Note that
   // calling this on the root window that doesn't have a shelf will
   // lead to a crash.
@@ -275,10 +272,6 @@
   // to it during construction of the shelf widget and status tray.
   std::unique_ptr<WmShelfAura> wm_shelf_aura_;
 
-  // The shelf widget for this root window.
-  // TODO(jamescook): Move ownership to WmShelf.
-  std::unique_ptr<ShelfWidget> shelf_widget_;
-
   // An invisible/empty window used as a event target for
   // |MouseCursorEventFilter| before a user logs in.
   // (crbug.com/266987)
diff --git a/ash/screen_util.cc b/ash/screen_util.cc
index f8e14d82..0a0460e 100644
--- a/ash/screen_util.cc
+++ b/ash/screen_util.cc
@@ -4,7 +4,7 @@
 
 #include "ash/screen_util.h"
 
-#include "ash/common/shelf/shelf_widget.h"
+#include "ash/aura/wm_shelf_aura.h"
 #include "ash/display/display_manager.h"
 #include "ash/root_window_controller.h"
 #include "ash/shell.h"
@@ -31,7 +31,8 @@
 
 // static
 gfx::Rect ScreenUtil::GetMaximizedWindowBoundsInParent(aura::Window* window) {
-  if (GetRootWindowController(window->GetRootWindow())->shelf_widget())
+  aura::Window* root_window = window->GetRootWindow();
+  if (GetRootWindowController(root_window)->wm_shelf_aura()->shelf_widget())
     return GetDisplayWorkAreaBoundsInParent(window);
   else
     return GetDisplayBoundsInParent(window);
diff --git a/ash/shell.cc b/ash/shell.cc
index d619775..c3c68f4 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -24,7 +24,7 @@
 #include "ash/common/shelf/shelf_delegate.h"
 #include "ash/common/shelf/shelf_item_delegate.h"
 #include "ash/common/shelf/shelf_model.h"
-#include "ash/common/shelf/shelf_widget.h"
+#include "ash/common/shelf/wm_shelf.h"
 #include "ash/common/shell_delegate.h"
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/locale/locale_notification_controller.h"
@@ -37,6 +37,7 @@
 #include "ash/common/wm/root_window_finder.h"
 #include "ash/common/wm/window_positioner.h"
 #include "ash/common/wm/workspace_controller.h"
+#include "ash/common/wm_root_window_controller.h"
 #include "ash/common/wm_shell.h"
 #include "ash/display/cursor_window_controller.h"
 #include "ash/display/display_configuration_controller.h"
@@ -405,15 +406,6 @@
     (*iter)->ShowShelf();
 }
 
-void Shell::ShutdownShelf() {
-  RootWindowControllerList controllers = GetAllRootWindowControllers();
-  for (RootWindowControllerList::iterator iter = controllers.begin();
-       iter != controllers.end(); ++iter) {
-    if ((*iter)->shelf_widget())
-      (*iter)->shelf_widget()->Shutdown();
-  }
-}
-
 #if defined(OS_CHROMEOS)
 bool Shell::ShouldSaveDisplaySettings() {
   return !(
@@ -423,11 +415,8 @@
 #endif
 
 void Shell::UpdateShelfVisibility() {
-  RootWindowControllerList controllers = GetAllRootWindowControllers();
-  for (RootWindowControllerList::iterator iter = controllers.begin();
-       iter != controllers.end(); ++iter)
-    if ((*iter)->shelf_widget())
-      (*iter)->UpdateShelfVisibility();
+  for (WmWindow* root : wm_shell_->GetAllRootWindows())
+    root->GetRootWindowController()->GetShelf()->UpdateVisibilityState();
 }
 
 void Shell::CreateModalBackground(aura::Window* window) {
@@ -455,14 +444,12 @@
 
 WebNotificationTray* Shell::GetWebNotificationTray() {
   return GetPrimaryRootWindowController()
-      ->shelf_widget()
-      ->status_area_widget()
+      ->GetStatusAreaWidget()
       ->web_notification_tray();
 }
 
 bool Shell::HasPrimaryStatusArea() {
-  ShelfWidget* shelf = GetPrimaryRootWindowController()->shelf_widget();
-  return shelf && shelf->status_area_widget();
+  return !!GetPrimaryRootWindowController()->GetStatusAreaWidget();
 }
 
 SystemTray* Shell::GetPrimarySystemTray() {
@@ -584,7 +571,8 @@
 
   // Destroy SystemTrayDelegate before destroying the status area(s). Make sure
   // to deinitialize the shelf first, as it is initialized after the delegate.
-  ShutdownShelf();
+  for (WmWindow* root : wm_shell_->GetAllRootWindows())
+    root->GetRootWindowController()->GetShelf()->ShutdownShelfWidget();
   wm_shell_->DeleteSystemTrayDelegate();
 
   locale_notification_controller_.reset();
diff --git a/ash/shell.h b/ash/shell.h
index 7e5fdb5..274936e 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -459,9 +459,6 @@
   // Initializes the root window so that it can host browser windows.
   void InitRootWindow(aura::Window* root_window);
 
-  // Prepares the shelf to be deleted.
-  void ShutdownShelf();
-
   // SystemModalContainerEventFilterDelegate:
   bool CanWindowReceiveEvents(aura::Window* window) override;
 
diff --git a/ash/shell/window_type_launcher.cc b/ash/shell/window_type_launcher.cc
index 648445e1..eeb70a78 100644
--- a/ash/shell/window_type_launcher.cc
+++ b/ash/shell/window_type_launcher.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "ash/common/session/session_state_delegate.h"
-#include "ash/common/shelf/shelf_widget.h"
 #include "ash/common/shell_window_ids.h"
 #include "ash/common/system/status_area_widget.h"
 #include "ash/common/system/web_notification/web_notification_tray.h"
@@ -318,8 +317,7 @@
         message_center::RichNotificationData(), NULL /* delegate */));
 
     Shell::GetPrimaryRootWindowController()
-        ->shelf_widget()
-        ->status_area_widget()
+        ->GetStatusAreaWidget()
         ->web_notification_tray()
         ->message_center()
         ->AddNotification(std::move(notification));
diff --git a/ash/test/status_area_widget_test_helper.cc b/ash/test/status_area_widget_test_helper.cc
index e5a6b87..c630646 100644
--- a/ash/test/status_area_widget_test_helper.cc
+++ b/ash/test/status_area_widget_test_helper.cc
@@ -4,7 +4,6 @@
 
 #include "ash/test/status_area_widget_test_helper.h"
 
-#include "ash/common/shelf/shelf_widget.h"
 #include "ash/common/system/status_area_widget.h"
 #include "ash/common/system/tray/system_tray_delegate.h"
 #include "ash/common/wm_shell.h"
@@ -18,9 +17,7 @@
 }
 
 StatusAreaWidget* StatusAreaWidgetTestHelper::GetStatusAreaWidget() {
-  return Shell::GetPrimaryRootWindowController()
-      ->shelf_widget()
-      ->status_area_widget();
+  return Shell::GetPrimaryRootWindowController()->GetStatusAreaWidget();
 }
 
 StatusAreaWidget* StatusAreaWidgetTestHelper::GetSecondaryStatusAreaWidget() {
@@ -30,10 +27,10 @@
       Shell::GetAllRootWindowControllers();
   for (size_t i = 0; i < controllers.size(); ++i) {
     if (controllers[i] != primary_controller)
-      return controllers[i]->shelf_widget()->status_area_widget();
+      return controllers[i]->GetStatusAreaWidget();
   }
 
-  return NULL;
+  return nullptr;
 }
 
 }  // namespace ash
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
index 442143cf7..02efd83 100644
--- a/ash/wm/overview/window_selector_unittest.cc
+++ b/ash/wm/overview/window_selector_unittest.cc
@@ -633,7 +633,7 @@
   EXPECT_FALSE(WindowsOverlapping(window1.get(), window2.get()));
 
   gfx::Rect container_bounds = docked1->parent()->bounds();
-  ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf_widget();
+  ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget();
   DockedWindowLayoutManager* manager =
       DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get()));
 
@@ -1174,7 +1174,7 @@
   std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
   wm::WindowState* window_state = wm::GetWindowState(window1.get());
   window_state->Maximize();
-  ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf_widget();
+  ShelfWidget* shelf = GetPrimaryShelf()->shelf_widget();
   EXPECT_TRUE(shelf->GetDimsShelf());
   ToggleOverview();
   EXPECT_FALSE(shelf->GetDimsShelf());
diff --git a/ash/wm/window_cycle_controller_unittest.cc b/ash/wm/window_cycle_controller_unittest.cc
index da655c9b..c8130f3 100644
--- a/ash/wm/window_cycle_controller_unittest.cc
+++ b/ash/wm/window_cycle_controller_unittest.cc
@@ -39,24 +39,32 @@
 
 namespace {
 
-class KeyEventCounter : public ui::EventHandler {
+class EventCounter : public ui::EventHandler {
  public:
-  KeyEventCounter() : key_events_(0) {}
-  ~KeyEventCounter() override {}
+  EventCounter() : key_events_(0), mouse_events_(0) {}
+  ~EventCounter() override {}
 
-  size_t GetCountAndReset() {
-    size_t count = key_events_;
+  int GetKeyEventCountAndReset() {
+    int count = key_events_;
     key_events_ = 0;
     return count;
   }
 
+  int GetMouseEventCountAndReset() {
+    int count = mouse_events_;
+    mouse_events_ = 0;
+    return count;
+  }
+
   // ui::EventHandler:
   void OnKeyEvent(ui::KeyEvent* event) override { key_events_++; }
+  void OnMouseEvent(ui::MouseEvent* event) override { mouse_events_++; }
 
  private:
-  size_t key_events_;
+  int key_events_;
+  int mouse_events_;
 
-  DISALLOW_COPY_AND_ASSIGN(KeyEventCounter);
+  DISALLOW_COPY_AND_ASSIGN(EventCounter);
 };
 
 bool IsWindowMinimized(aura::Window* window) {
@@ -557,20 +565,71 @@
 TEST_F(WindowCycleControllerTest, TabKeyNotLeaked) {
   std::unique_ptr<Window> w0(CreateTestWindowInShellWithId(0));
   std::unique_ptr<Window> w1(CreateTestWindowInShellWithId(1));
-  KeyEventCounter key_count;
-  w0->AddPreTargetHandler(&key_count);
-  w1->AddPreTargetHandler(&key_count);
+  EventCounter event_count;
+  w0->AddPreTargetHandler(&event_count);
+  w1->AddPreTargetHandler(&event_count);
   ui::test::EventGenerator& generator = GetEventGenerator();
   wm::GetWindowState(w0.get())->Activate();
   generator.PressKey(ui::VKEY_MENU, ui::EF_NONE);
-  EXPECT_EQ(1u, key_count.GetCountAndReset());
+  EXPECT_EQ(1, event_count.GetKeyEventCountAndReset());
   generator.PressKey(ui::VKEY_TAB, ui::EF_ALT_DOWN);
-  EXPECT_EQ(0u, key_count.GetCountAndReset());
+  EXPECT_EQ(0, event_count.GetKeyEventCountAndReset());
   generator.ReleaseKey(ui::VKEY_TAB, ui::EF_ALT_DOWN);
-  EXPECT_EQ(0u, key_count.GetCountAndReset());
+  EXPECT_EQ(0, event_count.GetKeyEventCountAndReset());
   generator.ReleaseKey(ui::VKEY_MENU, ui::EF_NONE);
   EXPECT_TRUE(wm::GetWindowState(w1.get())->IsActive());
-  EXPECT_EQ(0u, key_count.GetCountAndReset());
+  EXPECT_EQ(0, event_count.GetKeyEventCountAndReset());
+}
+
+// While the UI is active, mouse events are captured.
+TEST_F(WindowCycleControllerTest, MouseEventsCaptured) {
+  // This delegate allows the window to receive mouse events.
+  aura::test::TestWindowDelegate delegate;
+  std::unique_ptr<Window> w0(CreateTestWindowInShellWithDelegate(
+      &delegate, 0, gfx::Rect(0, 0, 100, 100)));
+  std::unique_ptr<Window> w1(CreateTestWindowInShellWithId(1));
+  EventCounter event_count;
+  w0->AddPreTargetHandler(&event_count);
+  w1->SetTargetHandler(&event_count);
+  ui::test::EventGenerator& generator = GetEventGenerator();
+  wm::ActivateWindow(w0.get());
+
+  // Events get through.
+  generator.MoveMouseToCenterOf(w0.get());
+  generator.ClickLeftButton();
+  EXPECT_LT(0, event_count.GetMouseEventCountAndReset());
+
+  // Start cycling.
+  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  controller->HandleCycleWindow(WindowCycleController::FORWARD);
+
+  // Events don't get through.
+  generator.ClickLeftButton();
+  EXPECT_EQ(0, event_count.GetMouseEventCountAndReset());
+
+  // Stop cycling: once again, events get through.
+  controller->StopCycling();
+  generator.ClickLeftButton();
+  EXPECT_LT(0, event_count.GetMouseEventCountAndReset());
+}
+
+// If mouse capture is lost, the UI closes.
+TEST_F(WindowCycleControllerTest, MouseCaptureLost) {
+  // This delegate allows the window to receive mouse events.
+  aura::test::TestWindowDelegate delegate;
+  std::unique_ptr<Window> w0(CreateTestWindowInShellWithDelegate(
+      &delegate, 0, gfx::Rect(0, 0, 100, 100)));
+  std::unique_ptr<Window> w1(CreateTestWindowInShellWithId(1));
+
+  // Start cycling.
+  WindowCycleController* controller = WmShell::Get()->window_cycle_controller();
+  controller->HandleCycleWindow(WindowCycleController::FORWARD);
+
+  // Some other widget grabs capture and this causes Alt+Tab to cease.
+  std::unique_ptr<views::Widget> widget = CreateTestWidget(
+      nullptr, kShellWindowId_DefaultContainer, gfx::Rect(1, 2, 3, 4));
+  widget->SetCapture(nullptr);
+  EXPECT_FALSE(controller->IsCycling());
 }
 
 // Tests that we can cycle past fullscreen windows: https://crbug.com/622396.
@@ -603,11 +662,11 @@
   // pass on the alt+tab to continue cycling). To make this test work with or
   // without the new alt+tab selector we check for the event on either
   // fullscreen window.
-  KeyEventCounter key_count;
-  w0->AddPreTargetHandler(&key_count);
-  w1->AddPreTargetHandler(&key_count);
+  EventCounter event_count;
+  w0->AddPreTargetHandler(&event_count);
+  w1->AddPreTargetHandler(&event_count);
   generator.PressKey(ui::VKEY_TAB, ui::EF_ALT_DOWN);
-  EXPECT_EQ(1u, key_count.GetCountAndReset());
+  EXPECT_EQ(1, event_count.GetKeyEventCountAndReset());
 }
 
 }  // namespace ash
diff --git a/ash/wm/workspace_controller_unittest.cc b/ash/wm/workspace_controller_unittest.cc
index 32dbaf7..0a1ec3a2 100644
--- a/ash/wm/workspace_controller_unittest.cc
+++ b/ash/wm/workspace_controller_unittest.cc
@@ -15,7 +15,6 @@
 #include "ash/common/wm/panels/panel_layout_manager.h"
 #include "ash/common/wm/window_state.h"
 #include "ash/common/wm/workspace/workspace_window_resizer.h"
-#include "ash/root_window_controller.h"
 #include "ash/screen_util.h"
 #include "ash/shell.h"
 #include "ash/test/ash_md_test_base.h"
@@ -142,12 +141,10 @@
         .bounds();
   }
 
-  ShelfWidget* shelf_widget() {
-    return Shell::GetPrimaryRootWindowController()->shelf_widget();
-  }
+  ShelfWidget* shelf_widget() { return GetPrimaryShelf()->shelf_widget(); }
 
   ShelfLayoutManager* shelf_layout_manager() {
-    return Shell::GetPrimaryRootWindowController()->GetShelfLayoutManager();
+    return GetPrimaryShelf()->shelf_layout_manager();
   }
 
   bool GetWindowOverlapsShelf() {
diff --git a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
index e552fe0..9680600 100644
--- a/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
+++ b/base/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -44,6 +44,17 @@
     }
 
     /**
+     * @see Long#compare(long, long)
+     */
+    public static int compareLong(long lhs, long rhs) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+            return Long.compare(lhs, rhs);
+        } else {
+            return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
+        }
+    }
+
+    /**
      * Returns true if view's layout direction is right-to-left.
      *
      * @param view the View whose layout is being considered
diff --git a/base/android/scoped_java_ref.h b/base/android/scoped_java_ref.h
index cf8edc9..c844c8d 100644
--- a/base/android/scoped_java_ref.h
+++ b/base/android/scoped_java_ref.h
@@ -148,6 +148,7 @@
 class ScopedJavaLocalRef : public JavaRef<T> {
  public:
   ScopedJavaLocalRef() : env_(nullptr) {}
+  ScopedJavaLocalRef(std::nullptr_t) : env_(nullptr) {}
 
   // Non-explicit copy constructor, to allow ScopedJavaLocalRef to be returned
   // by value as this is the normal usage pattern.
@@ -238,6 +239,7 @@
 class ScopedJavaGlobalRef : public JavaRef<T> {
  public:
   ScopedJavaGlobalRef() {}
+  ScopedJavaGlobalRef(std::nullptr_t) {}
 
   ScopedJavaGlobalRef(const ScopedJavaGlobalRef<T>& other) {
     this->Reset(other);
diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc
index 4a5d1f177..d7732aba 100644
--- a/base/trace_event/malloc_dump_provider.cc
+++ b/base/trace_event/malloc_dump_provider.cc
@@ -250,12 +250,12 @@
                         MemoryAllocatorDump::kUnitsBytes,
                         allocated_objects_size);
   if (allocated_objects_count != 0) {
-    inner_dump->AddScalar(MemoryAllocatorDump::kNameSize,
+    inner_dump->AddScalar(MemoryAllocatorDump::kNameObjectCount,
                           MemoryAllocatorDump::kUnitsObjects,
                           allocated_objects_count);
   }
 
-  if (resident_size - allocated_objects_size > 0) {
+  if (resident_size > allocated_objects_size) {
     // Explicitly specify why is extra memory resident. In tcmalloc it accounts
     // for free lists and caches. In mac and ios it accounts for the
     // fragmentation and metadata.
diff --git a/blimp/client/BUILD.gn b/blimp/client/BUILD.gn
index b14e565..b1b574ef 100644
--- a/blimp/client/BUILD.gn
+++ b/blimp/client/BUILD.gn
@@ -176,7 +176,7 @@
     sources = [
       "app/android/java/src/org/chromium/blimp/BlimpLibraryLoader.java",
       "app/android/java/src/org/chromium/blimp/BlimpView.java",
-      "app/android/java/src/org/chromium/blimp/input/WebInputBox.java",
+      "app/android/java/src/org/chromium/blimp/input/ImeHelperDialog.java",
       "app/android/java/src/org/chromium/blimp/session/BlimpClientSession.java",
       "app/android/java/src/org/chromium/blimp/session/TabControlFeature.java",
       "app/android/java/src/org/chromium/blimp/toolbar/Toolbar.java",
@@ -250,6 +250,7 @@
       "//blimp/client/core:core_java",
       "//blimp/client/public:public_headers_java",
       "//third_party/android_tools:android_support_annotations_java",
+      "//third_party/android_tools:android_support_v7_appcompat_java",
 
       # TODO(dtrainor): Remove the ui_java target once no more Android Toast
       # notifications are used.
@@ -266,7 +267,8 @@
       "app/android/java/src/org/chromium/blimp/BlimpRendererActivity.java",
       "app/android/java/src/org/chromium/blimp/BlimpView.java",
       "app/android/java/src/org/chromium/blimp/BrowserRestartActivity.java",
-      "app/android/java/src/org/chromium/blimp/input/WebInputBox.java",
+      "app/android/java/src/org/chromium/blimp/input/ImeEditText.java",
+      "app/android/java/src/org/chromium/blimp/input/ImeHelperDialog.java",
       "app/android/java/src/org/chromium/blimp/preferences/PreferencesUtil.java",
       "app/android/java/src/org/chromium/blimp/session/BlimpClientSession.java",
       "app/android/java/src/org/chromium/blimp/session/EngineInfo.java",
@@ -292,6 +294,7 @@
       "//blimp/client/public:public_headers_java",
       "//components/sync/android:sync_java",
       "//third_party/android_tools:android_support_v7_appcompat_java",
+      "//ui/android:ui_java",
       google_play_services_library,
     ]
 
@@ -338,12 +341,12 @@
       "app/android/blimp_library_loader.h",
       "app/android/blimp_view.cc",
       "app/android/blimp_view.h",
+      "app/android/ime_helper_dialog.cc",
+      "app/android/ime_helper_dialog.h",
       "app/android/tab_control_feature_android.cc",
       "app/android/tab_control_feature_android.h",
       "app/android/toolbar.cc",
       "app/android/toolbar.h",
-      "app/android/web_input_box.cc",
-      "app/android/web_input_box.h",
       "app/user_agent.cc",
       "app/user_agent.h",
     ]
diff --git a/blimp/client/app/android/blimp_app_jni_registrar.cc b/blimp/client/app/android/blimp_app_jni_registrar.cc
index af4ce127..2b9a036 100644
--- a/blimp/client/app/android/blimp_app_jni_registrar.cc
+++ b/blimp/client/app/android/blimp_app_jni_registrar.cc
@@ -8,9 +8,9 @@
 #include "blimp/client/app/android/blimp_client_session_android.h"
 #include "blimp/client/app/android/blimp_library_loader.h"
 #include "blimp/client/app/android/blimp_view.h"
+#include "blimp/client/app/android/ime_helper_dialog.h"
 #include "blimp/client/app/android/tab_control_feature_android.h"
 #include "blimp/client/app/android/toolbar.h"
-#include "blimp/client/app/android/web_input_box.h"
 #include "components/safe_json/android/component_jni_registrar.h"
 
 namespace blimp {
@@ -20,11 +20,11 @@
 base::android::RegistrationMethod kBlimpRegistrationMethods[] = {
     {"BlimpClientSessionAndroid", BlimpClientSessionAndroid::RegisterJni},
     {"BlimpLibraryLoader", RegisterBlimpLibraryLoaderJni},
-    {"BlimpView", BlimpView::RegisterJni},
+    {"BlimpView", app::BlimpView::RegisterJni},
+    {"ImeHelperDialog", ImeHelperDialog::RegisterJni},
     {"SafeJson", safe_json::android::RegisterSafeJsonJni},
     {"TabControlFeatureAndroid", TabControlFeatureAndroid::RegisterJni},
     {"Toolbar", Toolbar::RegisterJni},
-    {"WebInputBox", WebInputBox::RegisterJni},
 };
 
 }  // namespace
diff --git a/blimp/client/app/android/blimp_view.cc b/blimp/client/app/android/blimp_view.cc
index 26755a33..32ed533 100644
--- a/blimp/client/app/android/blimp_view.cc
+++ b/blimp/client/app/android/blimp_view.cc
@@ -11,6 +11,7 @@
 #include "blimp/client/app/compositor/browser_compositor.h"
 #include "blimp/client/core/compositor/blimp_compositor_dependencies.h"
 #include "blimp/client/core/compositor/blimp_compositor_manager.h"
+#include "blimp/client/core/render_widget/render_widget_feature.h"
 #include "blimp/client/support/compositor/compositor_dependencies_impl.h"
 #include "jni/BlimpView_jni.h"
 #include "ui/events/android/motion_event_android.h"
@@ -20,6 +21,7 @@
 
 namespace blimp {
 namespace client {
+namespace app {
 
 static jlong Init(JNIEnv* env,
                   const JavaParamRef<jobject>& jobj,
@@ -52,7 +54,7 @@
                      const gfx::Size& real_size,
                      const gfx::Size& size,
                      float dp_to_px,
-                     RenderWidgetFeature* render_widget_feature)
+                     blimp::client::RenderWidgetFeature* render_widget_feature)
     : device_scale_factor_(dp_to_px),
       current_surface_format_(0),
       window_(gfx::kNullAcceleratedWidget),
@@ -207,5 +209,6 @@
   Java_BlimpView_onSwapBuffersCompleted(env, java_obj_);
 }
 
+}  // namespace app
 }  // namespace client
 }  // namespace blimp
diff --git a/blimp/client/app/android/blimp_view.h b/blimp/client/app/android/blimp_view.h
index c40b2b4..f269250 100644
--- a/blimp/client/app/android/blimp_view.h
+++ b/blimp/client/app/android/blimp_view.h
@@ -23,6 +23,8 @@
 class BrowserCompositor;
 class RenderWidgetFeature;
 
+namespace app {
+
 // The native component of org.chromium.blimp.BlimpView.  This builds and
 // maintains a BlimpCompositorAndroid and handles notifying the compositor of
 // SurfaceView surface changes (size, creation, destruction, etc.).
@@ -40,7 +42,7 @@
             const gfx::Size& real_size,
             const gfx::Size& size,
             float dp_to_px,
-            RenderWidgetFeature* render_widget_feature);
+            blimp::client::RenderWidgetFeature* render_widget_feature);
 
   // Methods called from Java via JNI.
   void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj);
@@ -117,6 +119,7 @@
   DISALLOW_COPY_AND_ASSIGN(BlimpView);
 };
 
+}  // namespace app
 }  // namespace client
 }  // namespace blimp
 
diff --git a/blimp/client/app/android/web_input_box.cc b/blimp/client/app/android/ime_helper_dialog.cc
similarity index 60%
rename from blimp/client/app/android/web_input_box.cc
rename to blimp/client/app/android/ime_helper_dialog.cc
index 444cc5b4..69842478 100644
--- a/blimp/client/app/android/web_input_box.cc
+++ b/blimp/client/app/android/ime_helper_dialog.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "blimp/client/app/android/web_input_box.h"
+#include "blimp/client/app/android/ime_helper_dialog.h"
 
 #include "base/android/jni_string.h"
 #include "blimp/client/app/android/blimp_client_session_android.h"
 #include "blimp/client/core/contents/ime_feature.h"
-#include "jni/WebInputBox_jni.h"
+#include "jni/ImeHelperDialog_jni.h"
 #include "ui/base/ime/text_input_type.h"
 
 using base::android::JavaParamRef;
@@ -22,47 +22,48 @@
       BlimpClientSessionAndroid::FromJavaObject(env,
                                                 blimp_client_session.obj());
   return reinterpret_cast<intptr_t>(
-      new WebInputBox(env, jobj, client_session->GetImeFeature()));
+      new ImeHelperDialog(env, jobj, client_session->GetImeFeature()));
 }
 
 // static
-bool WebInputBox::RegisterJni(JNIEnv* env) {
+bool ImeHelperDialog::RegisterJni(JNIEnv* env) {
   return RegisterNativesImpl(env);
 }
 
-WebInputBox::WebInputBox(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& jobj,
-                         ImeFeature* ime_feature) {
+ImeHelperDialog::ImeHelperDialog(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jobj,
+    ImeFeature* ime_feature) {
   java_obj_.Reset(env, jobj);
   ime_feature_ = ime_feature;
   ime_feature_->set_delegate(this);
 }
 
-WebInputBox::~WebInputBox() {
+ImeHelperDialog::~ImeHelperDialog() {
   ime_feature_->set_delegate(nullptr);
 }
 
-void WebInputBox::Destroy(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
+void ImeHelperDialog::Destroy(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
   delete this;
 }
 
-void WebInputBox::OnShowImeRequested(ui::TextInputType input_type,
-                                     const std::string& text) {
+void ImeHelperDialog::OnShowImeRequested(ui::TextInputType input_type,
+                                         const std::string& text) {
   JNIEnv* env = base::android::AttachCurrentThread();
   DCHECK_NE(ui::TEXT_INPUT_TYPE_NONE, input_type);
-  Java_WebInputBox_onShowImeRequested(
+  Java_ImeHelperDialog_onShowImeRequested(
       env, java_obj_, input_type,
       base::android::ConvertUTF8ToJavaString(env, text));
 }
 
-void WebInputBox::OnHideImeRequested() {
+void ImeHelperDialog::OnHideImeRequested() {
   JNIEnv* env = base::android::AttachCurrentThread();
-  Java_WebInputBox_onHideImeRequested(env, java_obj_);
+  Java_ImeHelperDialog_onHideImeRequested(env, java_obj_);
 }
 
-void WebInputBox::OnImeTextEntered(JNIEnv* env,
-                                   const JavaParamRef<jobject>& jobj,
-                                   const JavaParamRef<jstring>& text) {
+void ImeHelperDialog::OnImeTextEntered(JNIEnv* env,
+                                       const JavaParamRef<jobject>& jobj,
+                                       const JavaParamRef<jstring>& text) {
   std::string textInput = base::android::ConvertJavaStringToUTF8(env, text);
   ime_feature_->OnImeTextEntered(textInput);
 }
diff --git a/blimp/client/app/android/web_input_box.h b/blimp/client/app/android/ime_helper_dialog.h
similarity index 67%
rename from blimp/client/app/android/web_input_box.h
rename to blimp/client/app/android/ime_helper_dialog.h
index 289af53a..ce419b9 100644
--- a/blimp/client/app/android/web_input_box.h
+++ b/blimp/client/app/android/ime_helper_dialog.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 BLIMP_CLIENT_APP_ANDROID_WEB_INPUT_BOX_H_
-#define BLIMP_CLIENT_APP_ANDROID_WEB_INPUT_BOX_H_
+#ifndef BLIMP_CLIENT_APP_ANDROID_IME_HELPER_DIALOG_H_
+#define BLIMP_CLIENT_APP_ANDROID_IME_HELPER_DIALOG_H_
 
 #include <string>
 
@@ -15,15 +15,15 @@
 namespace blimp {
 namespace client {
 
-// The native component of org.chromium.blimp.input.WebInputBox.
-class WebInputBox : public ImeFeature::Delegate {
+// The native component of org.chromium.blimp.input.ImeHelperDialog.
+class ImeHelperDialog : public ImeFeature::Delegate {
  public:
   static bool RegisterJni(JNIEnv* env);
 
-  // |ime_feature| is expected to outlive the WebInputBox.
-  WebInputBox(JNIEnv* env,
-              const base::android::JavaParamRef<jobject>& jobj,
-              ImeFeature* ime_feature);
+  // |ime_feature| is expected to outlive the ImeHelperDialog.
+  ImeHelperDialog(JNIEnv* env,
+                  const base::android::JavaParamRef<jobject>& jobj,
+                  ImeFeature* ime_feature);
 
   // Brings up IME for user to enter text.
   void OnShowImeRequested(ui::TextInputType input_type,
@@ -35,13 +35,13 @@
   // Methods called from Java via JNI.
   void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj);
 
-  // Sends the text entered from IME to the blimp engine
+  // Sends the text entered from IME to the blimp engine.
   void OnImeTextEntered(JNIEnv* env,
                         const base::android::JavaParamRef<jobject>& jobj,
                         const base::android::JavaParamRef<jstring>& text);
 
  private:
-  ~WebInputBox() override;
+  ~ImeHelperDialog() override;
 
   // Reference to the Java object which owns this class.
   base::android::ScopedJavaGlobalRef<jobject> java_obj_;
@@ -50,10 +50,10 @@
   // outgoing and incoming BlimpMessage::IME messages from the engine.
   ImeFeature* ime_feature_;
 
-  DISALLOW_COPY_AND_ASSIGN(WebInputBox);
+  DISALLOW_COPY_AND_ASSIGN(ImeHelperDialog);
 };
 
 }  // namespace client
 }  // namespace blimp
 
-#endif  // BLIMP_CLIENT_APP_ANDROID_WEB_INPUT_BOX_H_
+#endif  // BLIMP_CLIENT_APP_ANDROID_IME_HELPER_DIALOG_H_
diff --git a/blimp/client/app/android/java/res/layout/blimp_main.xml b/blimp/client/app/android/java/res/layout/blimp_main.xml
index 054d4ee..75190189 100644
--- a/blimp/client/app/android/java/res/layout/blimp_main.xml
+++ b/blimp/client/app/android/java/res/layout/blimp_main.xml
@@ -69,17 +69,5 @@
             android:layout_alignParentBottom="true"
             android:visibility="invisible" />
 
-        <org.chromium.blimp.input.WebInputBox
-            android:id="@+id/editText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:background="@drawable/web_input_background"
-            android:layout_alignParentBottom="true"
-            android:layout_marginTop="45dp"
-            android:padding="10dp"
-            android:paddingTop="16dp"
-            android:inputType="text|textWebEditText"
-            android:visibility="gone"/>
-
     </RelativeLayout>
 </merge>
\ No newline at end of file
diff --git a/blimp/client/app/android/java/res/layout/text_input_popup.xml b/blimp/client/app/android/java/res/layout/text_input_popup.xml
new file mode 100644
index 0000000..32a53f1f
--- /dev/null
+++ b/blimp/client/app/android/java/res/layout/text_input_popup.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="start">
+    <org.chromium.blimp.input.ImeEditText 
+        android:id="@+id/ime_edit_text"
+        android:inputType="text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:textSize="18sp"
+        android:singleLine="true"
+        android:layout_marginTop="10dp"/>
+</FrameLayout>
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpRendererActivity.java b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpRendererActivity.java
index 2b9b7f1..ae60b5e 100644
--- a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpRendererActivity.java
+++ b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpRendererActivity.java
@@ -20,7 +20,7 @@
 import org.chromium.blimp.auth.TokenSource;
 import org.chromium.blimp.auth.TokenSourceImpl;
 import org.chromium.blimp.core.BlimpClientSwitches;
-import org.chromium.blimp.input.WebInputBox;
+import org.chromium.blimp.input.ImeHelperDialog;
 import org.chromium.blimp.preferences.PreferencesUtil;
 import org.chromium.blimp.session.BlimpClientSession;
 import org.chromium.blimp.session.EngineInfo;
@@ -53,7 +53,7 @@
     private Toolbar mToolbar;
     private BlimpClientSession mBlimpClientSession;
     private TabControlFeature mTabControlFeature;
-    private WebInputBox mWebInputBox;
+    private ImeHelperDialog mImeHelperDialog;
 
     private Handler mHandler = new Handler();
 
@@ -102,9 +102,9 @@
             mToolbar = null;
         }
 
-        if (mWebInputBox != null) {
-            mWebInputBox.destroy();
-            mWebInputBox = null;
+        if (mImeHelperDialog != null) {
+            mImeHelperDialog.destroy();
+            mImeHelperDialog = null;
         }
 
         if (mTokenSource != null) {
@@ -167,8 +167,8 @@
         mToolbar = (Toolbar) findViewById(R.id.toolbar);
         mToolbar.initialize(mBlimpClientSession, this);
 
-        mWebInputBox = (WebInputBox) findViewById(R.id.editText);
-        mWebInputBox.initialize(mBlimpClientSession);
+        mImeHelperDialog = new ImeHelperDialog(this);
+        mImeHelperDialog.initialize(mBlimpClientSession);
 
         mTabControlFeature = new TabControlFeature(mBlimpClientSession, mBlimpView);
 
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java
index b694d38..aaa555b 100644
--- a/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java
+++ b/blimp/client/app/android/java/src/org/chromium/blimp/BlimpView.java
@@ -25,7 +25,7 @@
  * A {@link View} that will visually represent the Blimp rendered content.  This {@link View} starts
  * a native compositor.
  */
-@JNINamespace("blimp::client")
+@JNINamespace("blimp::client::app")
 public class BlimpView
         extends SurfaceView implements SurfaceHolder.Callback, View.OnLayoutChangeListener {
     private long mNativeBlimpViewPtr;
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeEditText.java b/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeEditText.java
new file mode 100644
index 0000000..3aeb14d
--- /dev/null
+++ b/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeEditText.java
@@ -0,0 +1,43 @@
+// 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.
+
+package org.chromium.blimp.input;
+
+import android.content.Context;
+import android.support.v7.app.AlertDialog;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.widget.EditText;
+
+/**
+ * A {@link EditText} contained in a dialog which allows users to enter text.
+ * The dialog is dismissed on pressing back button.
+ */
+public class ImeEditText extends EditText {
+    // The alert dialog that contains this text box.
+    private AlertDialog mParentDialog;
+
+    public ImeEditText(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    /**
+     * Sets the parent view for this view.
+     * @param dialog The dialog containing this view.
+     */
+    public void initialize(AlertDialog dialog) {
+        mParentDialog = dialog;
+    }
+
+    /**
+     * Dismiss the text input dialog as soon as back button is pressed.
+     */
+    @Override
+    public boolean dispatchKeyEventPreIme(KeyEvent event) {
+        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
+            mParentDialog.dismiss();
+        }
+        return super.dispatchKeyEventPreIme(event);
+    }
+}
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeHelperDialog.java b/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeHelperDialog.java
new file mode 100644
index 0000000..ec9e7752
--- /dev/null
+++ b/blimp/client/app/android/java/src/org/chromium/blimp/input/ImeHelperDialog.java
@@ -0,0 +1,196 @@
+// 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.
+
+package org.chromium.blimp.input;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.support.v7.app.AlertDialog;
+import android.text.InputType;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.blimp.R;
+import org.chromium.blimp.session.BlimpClientSession;
+import org.chromium.ui.base.ime.TextInputType;
+
+/**
+ * Helper class showing the UI that allows users to enter text into a web page.
+ * A pop up is created when user taps on a text area prompting user to start typing and closes as
+ * soon as user hits enter or presses back button.
+ */
+@JNINamespace("blimp::client")
+public class ImeHelperDialog {
+    private static final String TAG = "ImeHelperDialog";
+    private long mNativeImeHelperDialog;
+    private final Context mContext;
+    private AlertDialog mAlertDialog;
+
+    /**
+     * Builds a new ImeHelperDialog.
+     * @param context The {@link Context} of the activity.
+     */
+    public ImeHelperDialog(Context context) {
+        mContext = context;
+    }
+
+    /**
+     * To be called when the native library is loaded so that this class can initialize its native
+     * components.
+     * @param blimpClientSession The {@link BlimpClientSession} that contains the features
+     *                           required by the native components of the ImeHelperDialog.
+     */
+    public void initialize(BlimpClientSession blimpClientSession) {
+        assert mNativeImeHelperDialog == 0;
+
+        mNativeImeHelperDialog = nativeInit(blimpClientSession);
+    }
+
+    /**
+     * To be called when this class should be torn down.  This {@link View} should not be used after
+     * this.
+     */
+    public void destroy() {
+        if (mNativeImeHelperDialog == 0) return;
+
+        nativeDestroy(mNativeImeHelperDialog);
+        mNativeImeHelperDialog = 0;
+    }
+
+    /**
+     * Sends the text entered from IME to blimp engine.
+     * @param text The text the user entered.
+     */
+    private void onImeTextEntered(String text) {
+        if (mNativeImeHelperDialog == 0) return;
+
+        nativeOnImeTextEntered(mNativeImeHelperDialog, text);
+    }
+
+    @CalledByNative
+    private void onShowImeRequested(int inputType, String text) {
+        createTextInputPopup(inputType, text);
+    }
+
+    @CalledByNative
+    private void onHideImeRequested() {
+        if (mAlertDialog == null) return;
+
+        mAlertDialog.dismiss();
+    }
+
+    private void createTextInputPopup(int inputType, String existingText) {
+        final View viewPopup =
+                ((Activity) mContext).getLayoutInflater().inflate(R.layout.text_input_popup, null);
+        final ImeEditText editText = (ImeEditText) viewPopup.findViewById(R.id.ime_edit_text);
+        mAlertDialog = new AlertDialog.Builder(mContext)
+                               .setTitle(R.string.blimp_ime_dialog_title)
+                               .setPositiveButton(R.string.blimp_form_input_ok,
+                                       new DialogInterface.OnClickListener() {
+                                           @Override
+                                           public void onClick(DialogInterface dialog, int which) {
+                                               onImeTextEntered(editText.getText().toString());
+                                               dialog.dismiss();
+                                           }
+                                       })
+                               .setNegativeButton(R.string.blimp_form_input_cancel,
+                                       new DialogInterface.OnClickListener() {
+                                           @Override
+                                           public void onClick(DialogInterface dialog, int id) {
+                                               dialog.dismiss();
+                                           }
+                                       })
+                               .create();
+        editText.initialize(mAlertDialog);
+        mAlertDialog.setView(viewPopup);
+        mAlertDialog.getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+        mAlertDialog.setCanceledOnTouchOutside(true);
+
+        setEditorOptions(editText, inputType);
+        editText.setText(existingText);
+        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) {
+                switch (actionId) {
+                    case EditorInfo.IME_ACTION_NEXT:
+                    case EditorInfo.IME_ACTION_DONE:
+                    case EditorInfo.IME_ACTION_SEARCH:
+                    case EditorInfo.IME_ACTION_GO:
+                        onImeTextEntered(tv.getText().toString());
+                        mAlertDialog.dismiss();
+                        return true;
+                    default:
+                        return false;
+                }
+            }
+        });
+
+        editText.requestFocus();
+
+        mAlertDialog.show();
+    }
+
+    /**
+     * Set the IME options and input type for editor based on the type received from engine.
+     * @param editText The edit text for which the IME options are being determined.
+     * @param inputTypeEngine Input type received from engine, defined in {@link TextInputType}.
+     */
+    private static void setEditorOptions(EditText editText, int inputTypeEngine) {
+        int inputType = InputType.TYPE_CLASS_TEXT;
+        int imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI;
+
+        switch (inputTypeEngine) {
+            case TextInputType.TEXT:
+                inputType = InputType.TYPE_CLASS_TEXT;
+                imeOptions = EditorInfo.IME_ACTION_GO;
+                break;
+            case TextInputType.PASSWORD:
+                inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
+                imeOptions = EditorInfo.IME_ACTION_GO;
+                break;
+            case TextInputType.SEARCH:
+                imeOptions = EditorInfo.IME_ACTION_SEARCH;
+                break;
+            case TextInputType.EMAIL:
+                inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+                imeOptions = EditorInfo.IME_ACTION_GO;
+                break;
+            case TextInputType.NUMBER:
+                inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL
+                        | InputType.TYPE_NUMBER_FLAG_DECIMAL;
+                imeOptions = EditorInfo.IME_ACTION_NEXT;
+                break;
+            case TextInputType.TELEPHONE:
+                inputType = InputType.TYPE_CLASS_PHONE;
+                imeOptions = EditorInfo.IME_ACTION_NEXT;
+                break;
+            case TextInputType.URL:
+                inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI;
+                imeOptions = EditorInfo.IME_ACTION_GO;
+                break;
+            case TextInputType.TEXT_AREA:
+            case TextInputType.CONTENT_EDITABLE:
+                inputType = InputType.TYPE_TEXT_FLAG_MULTI_LINE;
+                imeOptions = EditorInfo.IME_ACTION_NONE;
+                break;
+            default:
+                inputType = InputType.TYPE_CLASS_TEXT;
+        }
+
+        editText.setInputType(inputType);
+        editText.setImeOptions(imeOptions);
+    }
+
+    private native long nativeInit(BlimpClientSession blimpClientSession);
+    private native void nativeDestroy(long nativeImeHelperDialog);
+    private native void nativeOnImeTextEntered(long nativeImeHelperDialog, String text);
+}
diff --git a/blimp/client/app/android/java/src/org/chromium/blimp/input/WebInputBox.java b/blimp/client/app/android/java/src/org/chromium/blimp/input/WebInputBox.java
deleted file mode 100644
index 84aff14..0000000
--- a/blimp/client/app/android/java/src/org/chromium/blimp/input/WebInputBox.java
+++ /dev/null
@@ -1,186 +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.
-
-package org.chromium.blimp.input;
-
-import android.app.Activity;
-import android.content.Context;
-import android.text.InputType;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.blimp.session.BlimpClientSession;
-import org.chromium.ui.UiUtils;
-import org.chromium.ui.base.ime.TextInputType;
-
-/**
- * A {@link View} that allows users to enter text into a web page.
- * This is a floating text box which closes when the user hits enter or presses back button.
- */
-@JNINamespace("blimp::client")
-public class WebInputBox extends EditText {
-    private static final String TAG = "WebInputBox";
-    private long mNativeWebInputBoxPtr;
-    private Context mContext;
-
-    public WebInputBox(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mContext = context;
-        setOnEditorActionListener(new TextView.OnEditorActionListener() {
-            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-                switch (actionId) {
-                    case EditorInfo.IME_ACTION_NEXT:
-                    case EditorInfo.IME_ACTION_DONE:
-                    case EditorInfo.IME_ACTION_SEARCH:
-                    case EditorInfo.IME_ACTION_GO:
-                        onImeTextEntered(v.getText().toString());
-                        hideIme();
-                        return true;
-                    default:
-                        return false;
-                }
-            }
-        });
-    }
-
-    /**
-     * To be called when the native library is loaded so that this class can initialize its native
-     * components.
-     * @param blimpClientSession The {@link BlimpClientSession} that contains the features
-     *                           required by the native components of the WebInputBox.
-     */
-    public void initialize(BlimpClientSession blimpClientSession) {
-        assert mNativeWebInputBoxPtr == 0;
-
-        mNativeWebInputBoxPtr = nativeInit(blimpClientSession);
-    }
-
-    /**
-     * To be called when this class should be torn down.  This {@link View} should not be used after
-     * this.
-     */
-    public void destroy() {
-        if (mNativeWebInputBoxPtr == 0) return;
-
-        nativeDestroy(mNativeWebInputBoxPtr);
-        mNativeWebInputBoxPtr = 0;
-    }
-
-    @Override
-    public boolean dispatchKeyEventPreIme(KeyEvent event) {
-        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
-            ((Activity) mContext)
-                    .getWindow()
-                    .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
-            setVisibility(View.GONE);
-        }
-        return super.dispatchKeyEventPreIme(event);
-    }
-
-    /**
-     *  Brings up the IME along with the edit text above it.
-     */
-    private void showIme() {
-        // TODO(shaktisahu): Find a better way to prevent resize (crbug/596653).
-        ((Activity) mContext)
-                .getWindow()
-                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
-        setVisibility(View.VISIBLE);
-        requestFocus();
-        UiUtils.showKeyboard(this);
-    }
-
-    /**
-     * Hides the edit text along with the IME.
-     */
-    private void hideIme() {
-        ((Activity) mContext)
-                .getWindow()
-                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
-        setText("");
-        setVisibility(View.GONE);
-        UiUtils.hideKeyboard(this);
-    }
-
-    /**
-     * Sends the text entered from IME to blimp engine.
-     * @param text The text the user entered.
-     */
-    private void onImeTextEntered(String text) {
-        if (mNativeWebInputBoxPtr == 0) return;
-
-        nativeOnImeTextEntered(mNativeWebInputBoxPtr, text);
-    }
-
-    @CalledByNative
-    private void onShowImeRequested(int inputType, String text) {
-        setEditorOptions(inputType);
-        setText(text);
-        // Set the cursor at the end.
-        setSelection(getText().length());
-        showIme();
-    }
-
-    @CalledByNative
-    private void onHideImeRequested() {
-        hideIme();
-    }
-
-    /**
-     * Set the IME options and input type based on the input type received from engine.
-     * @param inputType text input type.
-     */
-    private void setEditorOptions(int inputType) {
-        setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
-        switch (inputType) {
-            case TextInputType.TEXT:
-                setInputType(InputType.TYPE_CLASS_TEXT);
-                setImeOptions(EditorInfo.IME_ACTION_GO);
-                break;
-            case TextInputType.PASSWORD:
-                setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
-                setImeOptions(EditorInfo.IME_ACTION_GO);
-                break;
-            case TextInputType.SEARCH:
-                setImeOptions(EditorInfo.IME_ACTION_SEARCH);
-                break;
-            case TextInputType.EMAIL:
-                setInputType(
-                        InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
-                setImeOptions(EditorInfo.IME_ACTION_GO);
-                break;
-            case TextInputType.NUMBER:
-                setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL
-                        | InputType.TYPE_NUMBER_FLAG_DECIMAL);
-                setImeOptions(EditorInfo.IME_ACTION_NEXT);
-                break;
-            case TextInputType.TELEPHONE:
-                setInputType(InputType.TYPE_CLASS_PHONE);
-                setImeOptions(EditorInfo.IME_ACTION_NEXT);
-                break;
-            case TextInputType.URL:
-                setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);
-                setImeOptions(EditorInfo.IME_ACTION_GO);
-                break;
-            case TextInputType.TEXT_AREA:
-            case TextInputType.CONTENT_EDITABLE:
-                setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
-                setImeOptions(EditorInfo.IME_ACTION_NONE);
-                break;
-            default:
-                setInputType(InputType.TYPE_CLASS_TEXT);
-        }
-    }
-
-    private native long nativeInit(BlimpClientSession blimpClientSession);
-    private native void nativeDestroy(long nativeWebInputBox);
-    private native void nativeOnImeTextEntered(long nativeWebInputBox, String text);
-}
diff --git a/blimp/client/app/android/java/strings/android_blimp_strings.grd b/blimp/client/app/android/java/strings/android_blimp_strings.grd
index 65ac9c45..59d92d88 100644
--- a/blimp/client/app/android/java/strings/android_blimp_strings.grd
+++ b/blimp/client/app/android/java/strings/android_blimp_strings.grd
@@ -214,6 +214,15 @@
       <message name="IDS_BLIMP_RESTART_NOW" desc="Restart now message">
         Restart Now
       </message>
+      <message name="IDS_BLIMP_IME_DIALOG_TITLE" desc="Label for the title text for IME dialog.">
+        Enter Text
+      </message>
+      <message name="IDS_BLIMP_FORM_INPUT_OK" desc="Label for a confirm button. Used in multiple contexts. [CHAR-LIMIT=20]">
+        OK
+      </message>
+      <message name="IDS_BLIMP_FORM_INPUT_CANCEL" desc="Label for a cancel button. Used in multiple contexts. [CHAR-LIMIT=20]">
+        Cancel
+      </message>
       <message name="IDS_BLIMP_SIGN_IN_TITLE" desc="Sign in.">
         Please sign in
       </message>
diff --git a/blimp/client/app/android/javatests/src/org/chromium/blimp/core/MockBlimpClientContext.java b/blimp/client/app/android/javatests/src/org/chromium/blimp/core/MockBlimpClientContext.java
index d8f5e9b..744a9d4d 100644
--- a/blimp/client/app/android/javatests/src/org/chromium/blimp/core/MockBlimpClientContext.java
+++ b/blimp/client/app/android/javatests/src/org/chromium/blimp/core/MockBlimpClientContext.java
@@ -11,6 +11,7 @@
 import org.chromium.blimp_public.BlimpClientContext;
 import org.chromium.blimp_public.BlimpClientContextDelegate;
 import org.chromium.blimp_public.contents.BlimpContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * Mock {@link BlimpClientContext}.
@@ -37,7 +38,7 @@
     }
 
     @Override
-    public BlimpContents createBlimpContents() {
+    public BlimpContents createBlimpContents(WindowAndroid window) {
         return null;
     }
 
diff --git a/blimp/client/core/BUILD.gn b/blimp/client/core/BUILD.gn
index 2761312..df933ea7 100644
--- a/blimp/client/core/BUILD.gn
+++ b/blimp/client/core/BUILD.gn
@@ -120,6 +120,7 @@
     deps += [
       ":context_jni_headers",
       "//blimp/client/core/settings",
+      "//ui/android",
     ]
   }
 }
@@ -177,6 +178,7 @@
     deps = [
       "//base:base_java",
       "//blimp/client/public:public_headers_java",
+      "//ui/android:ui_java",
     ]
   }
 
@@ -192,6 +194,7 @@
       "//blimp/client/core/contents:contents_java",
       "//blimp/client/core/settings:settings_java",
       "//blimp/client/public:public_headers_java",
+      "//ui/android:ui_java",
     ]
   }
 
diff --git a/blimp/client/core/DEPS b/blimp/client/core/DEPS
new file mode 100644
index 0000000..d21e072
--- /dev/null
+++ b/blimp/client/core/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/android",
+]
diff --git a/blimp/client/core/android/blimp_client_context_impl_android.cc b/blimp/client/core/android/blimp_client_context_impl_android.cc
index 6ef38658..2a48894f 100644
--- a/blimp/client/core/android/blimp_client_context_impl_android.cc
+++ b/blimp/client/core/android/blimp_client_context_impl_android.cc
@@ -12,6 +12,7 @@
 #include "blimp/client/public/blimp_client_context.h"
 #include "blimp/client/public/compositor/compositor_dependencies.h"
 #include "jni/BlimpClientContextImpl_jni.h"
+#include "ui/android/window_android.h"
 
 namespace blimp {
 namespace client {
@@ -66,10 +67,15 @@
 }
 
 base::android::ScopedJavaLocalRef<jobject>
-BlimpClientContextImplAndroid::CreateBlimpContentsJava(JNIEnv* env,
-                                                       jobject jobj) {
+BlimpClientContextImplAndroid::CreateBlimpContentsJava(
+    JNIEnv* env,
+    jobject jobj,
+    jlong window_android_ptr) {
+  ui::WindowAndroid* window_android =
+      reinterpret_cast<ui::WindowAndroid*>(window_android_ptr);
   std::unique_ptr<BlimpContents> blimp_contents =
-      BlimpClientContextImpl::CreateBlimpContents();
+      CreateBlimpContents(window_android);
+
   // This intentionally releases the ownership and gives it to Java.
   BlimpContentsImpl* blimp_contents_impl =
       static_cast<BlimpContentsImpl*>(blimp_contents.release());
diff --git a/blimp/client/core/android/blimp_client_context_impl_android.h b/blimp/client/core/android/blimp_client_context_impl_android.h
index b8c3e1e..c0e6653 100644
--- a/blimp/client/core/android/blimp_client_context_impl_android.h
+++ b/blimp/client/core/android/blimp_client_context_impl_android.h
@@ -33,9 +33,8 @@
 
   base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
 
-  base::android::ScopedJavaLocalRef<jobject> CreateBlimpContentsJava(
-      JNIEnv* env,
-      jobject jobj);
+  base::android::ScopedJavaLocalRef<jobject>
+  CreateBlimpContentsJava(JNIEnv* env, jobject jobj, jlong window_android_ptr);
 
   // Start authentication flow from Java.
   void ConnectFromJava(JNIEnv* env, jobject jobj);
diff --git a/blimp/client/core/android/java/src/org/chromium/blimp/core/BlimpClientContextImpl.java b/blimp/client/core/android/java/src/org/chromium/blimp/core/BlimpClientContextImpl.java
index c34cf66a..9281288 100644
--- a/blimp/client/core/android/java/src/org/chromium/blimp/core/BlimpClientContextImpl.java
+++ b/blimp/client/core/android/java/src/org/chromium/blimp/core/BlimpClientContextImpl.java
@@ -15,6 +15,7 @@
 import org.chromium.blimp_public.BlimpClientContext;
 import org.chromium.blimp_public.BlimpClientContextDelegate;
 import org.chromium.blimp_public.contents.BlimpContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * BlimpClientContextImpl is a Java wrapper to allow communicating with the native
@@ -57,9 +58,10 @@
     }
 
     @Override
-    public BlimpContents createBlimpContents() {
+    public BlimpContents createBlimpContents(WindowAndroid windowAndroid) {
         assert mNativeBlimpClientContextImplAndroid != 0;
-        return nativeCreateBlimpContentsJava(mNativeBlimpClientContextImplAndroid);
+        return nativeCreateBlimpContentsJava(
+                mNativeBlimpClientContextImplAndroid, windowAndroid.getNativePointer());
     }
 
     @Override
@@ -106,7 +108,7 @@
     }
 
     private native BlimpContents nativeCreateBlimpContentsJava(
-            long nativeBlimpClientContextImplAndroid);
+            long nativeBlimpClientContextImplAndroid, long windowAndroidPtr);
 
     private native void nativeConnectFromJava(long nativeBlimpClientContextImplAndroid);
     private native void nativeInitSettingsPage(
diff --git a/blimp/client/core/android/java/src/org/chromium/blimp/core/DummyBlimpClientContext.java b/blimp/client/core/android/java/src/org/chromium/blimp/core/DummyBlimpClientContext.java
index cff5df6..c49dd70 100644
--- a/blimp/client/core/android/java/src/org/chromium/blimp/core/DummyBlimpClientContext.java
+++ b/blimp/client/core/android/java/src/org/chromium/blimp/core/DummyBlimpClientContext.java
@@ -11,6 +11,7 @@
 import org.chromium.blimp_public.BlimpClientContext;
 import org.chromium.blimp_public.BlimpClientContextDelegate;
 import org.chromium.blimp_public.contents.BlimpContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * A dummy implementation of the {@link BlimpClientContext}.
@@ -32,7 +33,7 @@
     }
 
     @Override
-    public BlimpContents createBlimpContents() {
+    public BlimpContents createBlimpContents(WindowAndroid windowAndroid) {
         return null;
     }
 
diff --git a/blimp/client/core/blimp_client_context_impl.cc b/blimp/client/core/blimp_client_context_impl.cc
index 25e5360..75ab73c 100644
--- a/blimp/client/core/blimp_client_context_impl.cc
+++ b/blimp/client/core/blimp_client_context_impl.cc
@@ -21,6 +21,7 @@
 #include "blimp/client/core/settings/settings_feature.h"
 #include "blimp/client/public/blimp_client_context_delegate.h"
 #include "blimp/client/public/compositor/compositor_dependencies.h"
+#include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_ANDROID)
 #include "blimp/client/core/android/blimp_client_context_impl_android.h"
@@ -103,9 +104,10 @@
   delegate_ = delegate;
 }
 
-std::unique_ptr<BlimpContents> BlimpClientContextImpl::CreateBlimpContents() {
+std::unique_ptr<BlimpContents> BlimpClientContextImpl::CreateBlimpContents(
+    gfx::NativeWindow window) {
   std::unique_ptr<BlimpContents> blimp_contents =
-      blimp_contents_manager_->CreateBlimpContents();
+      blimp_contents_manager_->CreateBlimpContents(window);
   if (blimp_contents)
     delegate_->AttachBlimpContentsHelpers(blimp_contents.get());
   return blimp_contents;
diff --git a/blimp/client/core/blimp_client_context_impl.h b/blimp/client/core/blimp_client_context_impl.h
index 14c6677..355ddde 100644
--- a/blimp/client/core/blimp_client_context_impl.h
+++ b/blimp/client/core/blimp_client_context_impl.h
@@ -52,7 +52,8 @@
 
   // BlimpClientContext implementation.
   void SetDelegate(BlimpClientContextDelegate* delegate) override;
-  std::unique_ptr<BlimpContents> CreateBlimpContents() override;
+  std::unique_ptr<BlimpContents> CreateBlimpContents(
+      gfx::NativeWindow window) override;
   void Connect() override;
 
   // NetworkEventObserver implementation.
diff --git a/blimp/client/core/blimp_client_context_impl_unittest.cc b/blimp/client/core/blimp_client_context_impl_unittest.cc
index ba896b2..e536fa6a 100644
--- a/blimp/client/core/blimp_client_context_impl_unittest.cc
+++ b/blimp/client/core/blimp_client_context_impl_unittest.cc
@@ -17,6 +17,11 @@
 #include "blimp/client/test/test_blimp_client_context_delegate.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/native_widget_types.h"
+
+#if defined(OS_ANDROID)
+#include "ui/android/window_android.h"
+#endif  // defined(OS_ANDROID)
 
 namespace blimp {
 namespace client {
@@ -31,15 +36,22 @@
     base::Thread::Options options;
     options.message_loop_type = base::MessageLoop::TYPE_IO;
     io_thread_.StartWithOptions(options);
+#if defined(OS_ANDROID)
+    window_ = ui::WindowAndroid::CreateForTesting();
+#endif  // defined(OS_ANDROID)
   }
 
   void TearDown() override {
     io_thread_.Stop();
     base::RunLoop().RunUntilIdle();
+#if defined(OS_ANDROID)
+    window_->DestroyForTesting();
+#endif  // defined(OS_ANDROID)
   }
 
  protected:
   base::Thread io_thread_;
+  gfx::NativeWindow window_ = nullptr;
 
  private:
   base::MessageLoop message_loop_;
@@ -62,7 +74,7 @@
       .RetiresOnSaturation();
 
   std::unique_ptr<BlimpContents> blimp_contents =
-      blimp_client_context.CreateBlimpContents();
+      blimp_client_context.CreateBlimpContents(window_);
   DCHECK(blimp_contents);
   DCHECK_EQ(blimp_contents.get(), attached_blimp_contents);
 }
diff --git a/blimp/client/core/contents/BUILD.gn b/blimp/client/core/contents/BUILD.gn
index 4e153d8..874243f2 100644
--- a/blimp/client/core/contents/BUILD.gn
+++ b/blimp/client/core/contents/BUILD.gn
@@ -34,6 +34,7 @@
     "//blimp/net",
     "//net:net",
     "//ui/base/ime:text_input_types",
+    "//ui/gfx:native_widget_types",
     "//ui/gfx/geometry:geometry",
     "//url",
   ]
@@ -55,14 +56,19 @@
       "android/blimp_contents_observer_proxy.h",
       "android/blimp_navigation_controller_impl_android.cc",
       "android/blimp_navigation_controller_impl_android.h",
+      "android/blimp_view.cc",
+      "android/blimp_view.h",
       "blimp_contents_view_android.cc",
       "blimp_contents_view_android.h",
     ]
 
+    public_deps += [ "//ui/android" ]
+
     deps += [
       ":jni_headers",
       "//cc",
       "//ui/android",
+      "//ui/events:events",
     ]
   } else {
     sources += [
@@ -121,10 +127,15 @@
     "//net",
     "//net:test_support",
     "//testing/gtest",
+    "//ui/gfx:native_widget_types",
     "//ui/gfx:test_support",
     "//ui/gfx/geometry:geometry",
     "//url",
   ]
+
+  if (is_android) {
+    deps += [ "//ui/android" ]
+  }
 }
 
 if (is_android) {
@@ -135,11 +146,13 @@
       "android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java",
       "android/java/src/org/chromium/blimp/core/contents/BlimpContentsObserverProxy.java",
       "android/java/src/org/chromium/blimp/core/contents/BlimpNavigationControllerImpl.java",
+      "android/java/src/org/chromium/blimp/core/contents/BlimpView.java",
     ]
 
     deps = [
       "//base:base_java",
       "//blimp/client/public:public_headers_java",
+      "//ui/android:ui_java",
     ]
   }
 
@@ -150,6 +163,7 @@
       "android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java",
       "android/java/src/org/chromium/blimp/core/contents/BlimpContentsObserverProxy.java",
       "android/java/src/org/chromium/blimp/core/contents/BlimpNavigationControllerImpl.java",
+      "android/java/src/org/chromium/blimp/core/contents/BlimpView.java",
     ]
 
     jni_package = "blimp/client/core/contents"
diff --git a/blimp/client/core/contents/android/blimp_contents_impl_android.cc b/blimp/client/core/contents/android/blimp_contents_impl_android.cc
index e0053921..92552836 100644
--- a/blimp/client/core/contents/android/blimp_contents_impl_android.cc
+++ b/blimp/client/core/contents/android/blimp_contents_impl_android.cc
@@ -6,7 +6,10 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/memory/ptr_util.h"
 #include "blimp/client/core/contents/android/blimp_navigation_controller_impl_android.h"
+#include "blimp/client/core/contents/android/blimp_view.h"
+#include "blimp/client/core/contents/blimp_contents_view_android.h"
 #include "jni/BlimpContentsImpl_jni.h"
 
 namespace blimp {
@@ -36,12 +39,16 @@
       blimp_navigation_controller_impl_android_(
           static_cast<BlimpNavigationControllerImpl*>(
               &(blimp_contents_impl->GetNavigationController()))) {
-  JNIEnv* env = base::android::AttachCurrentThread();
+  BlimpView* blimp_view = static_cast<BlimpContentsViewAndroid*>(
+                              blimp_contents_impl_->GetBlimpContentsView())
+                              ->GetBlimpView();
 
+  JNIEnv* env = base::android::AttachCurrentThread();
   java_obj_.Reset(env,
                   Java_BlimpContentsImpl_create(
                       env, reinterpret_cast<intptr_t>(this),
-                      blimp_navigation_controller_impl_android_.GetJavaObject())
+                      blimp_navigation_controller_impl_android_.GetJavaObject(),
+                      blimp_view->GetJavaObject())
                       .obj());
 }
 
diff --git a/blimp/client/core/contents/android/blimp_contents_jni_registrar.cc b/blimp/client/core/contents/android/blimp_contents_jni_registrar.cc
index bc5bcfc..2db60753 100644
--- a/blimp/client/core/contents/android/blimp_contents_jni_registrar.cc
+++ b/blimp/client/core/contents/android/blimp_contents_jni_registrar.cc
@@ -8,6 +8,7 @@
 #include "blimp/client/core/contents/android/blimp_contents_impl_android.h"
 #include "blimp/client/core/contents/android/blimp_contents_observer_proxy.h"
 #include "blimp/client/core/contents/android/blimp_navigation_controller_impl_android.h"
+#include "blimp/client/core/contents/android/blimp_view.h"
 
 namespace blimp {
 namespace client {
@@ -18,6 +19,7 @@
     {"BlimpContentsObserverProxy", BlimpContentsObserverProxy::RegisterJni},
     {"BlimpNavigationControllerImplAndroid",
      BlimpNavigationControllerImplAndroid::RegisterJni},
+    {"BlimpView", BlimpView::RegisterJni},
 };
 
 }  // namespace
diff --git a/blimp/client/core/contents/android/blimp_view.cc b/blimp/client/core/contents/android/blimp_view.cc
new file mode 100644
index 0000000..3183dda7
--- /dev/null
+++ b/blimp/client/core/contents/android/blimp_view.cc
@@ -0,0 +1,101 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "blimp/client/core/contents/android/blimp_view.h"
+
+#include "blimp/client/core/compositor/blimp_compositor_manager.h"
+#include "blimp/client/core/contents/blimp_contents_impl.h"
+#include "jni/BlimpView_jni.h"
+#include "ui/android/window_android.h"
+#include "ui/events/android/motion_event_android.h"
+
+namespace blimp {
+namespace client {
+
+// static
+bool BlimpView::RegisterJni(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+BlimpView::BlimpView(BlimpContentsImpl* blimp_contents_impl)
+    : blimp_contents_impl_(blimp_contents_impl) {
+  ui::WindowAndroid* window = blimp_contents_impl_->GetNativeWindow();
+
+  JNIEnv* env = base::android::AttachCurrentThread();
+  java_obj_.Reset(env,
+                  Java_BlimpView_create(env, reinterpret_cast<intptr_t>(this),
+                                        window->GetJavaObject())
+                      .obj());
+}
+
+BlimpView::~BlimpView() {
+  Java_BlimpView_clearNativePtr(base::android::AttachCurrentThread(),
+                                java_obj_);
+}
+
+base::android::ScopedJavaLocalRef<jobject> BlimpView::GetJavaObject() {
+  return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
+}
+
+base::android::ScopedJavaLocalRef<jobject>
+BlimpView::CreateViewAndroidDelegate() {
+  return Java_BlimpView_createViewAndroidDelegate(
+      base::android::AttachCurrentThread(), java_obj_);
+}
+
+void BlimpView::OnSizeChanged(JNIEnv* env,
+                              const base::android::JavaParamRef<jobject>& jobj,
+                              jint width,
+                              jint height,
+                              jfloat device_scale_factor_dp_to_px) {
+  blimp_contents_impl_->SetSizeAndScale(gfx::Size(width, height),
+                                        device_scale_factor_dp_to_px);
+}
+
+jboolean BlimpView::OnTouchEvent(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& obj,
+    const base::android::JavaParamRef<jobject>& motion_event,
+    jlong time_ms,
+    jint android_action,
+    jint pointer_count,
+    jint history_size,
+    jint action_index,
+    jfloat pos_x_0,
+    jfloat pos_y_0,
+    jfloat pos_x_1,
+    jfloat pos_y_1,
+    jint pointer_id_0,
+    jint pointer_id_1,
+    jfloat touch_major_0,
+    jfloat touch_major_1,
+    jfloat touch_minor_0,
+    jfloat touch_minor_1,
+    jfloat orientation_0,
+    jfloat orientation_1,
+    jfloat tilt_0,
+    jfloat tilt_1,
+    jfloat raw_pos_x,
+    jfloat raw_pos_y,
+    jint android_tool_type_0,
+    jint android_tool_type_1,
+    jint android_button_state,
+    jint android_meta_state,
+    jfloat device_scale_factor_dp_to_px) {
+  ui::MotionEventAndroid::Pointer pointer0(
+      pointer_id_0, pos_x_0, pos_y_0, touch_major_0, touch_minor_0,
+      orientation_0, tilt_0, android_tool_type_0);
+  ui::MotionEventAndroid::Pointer pointer1(
+      pointer_id_1, pos_x_1, pos_y_1, touch_major_1, touch_minor_1,
+      orientation_1, tilt_1, android_tool_type_1);
+  ui::MotionEventAndroid event(
+      1.f / device_scale_factor_dp_to_px, env, motion_event, time_ms,
+      android_action, pointer_count, history_size, action_index,
+      android_button_state, android_meta_state, raw_pos_x - pos_x_0,
+      raw_pos_y - pos_y_0, pointer0, pointer1);
+  return blimp_contents_impl_->compositor_manager()->OnTouchEvent(event);
+}
+
+}  // namespace client
+}  // namespace blimp
diff --git a/blimp/client/core/contents/android/blimp_view.h b/blimp/client/core/contents/android/blimp_view.h
new file mode 100644
index 0000000..7df8be4
--- /dev/null
+++ b/blimp/client/core/contents/android/blimp_view.h
@@ -0,0 +1,86 @@
+// 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 BLIMP_CLIENT_CORE_CONTENTS_ANDROID_BLIMP_VIEW_H_
+#define BLIMP_CLIENT_CORE_CONTENTS_ANDROID_BLIMP_VIEW_H_
+
+#include <jni.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/scoped_java_ref.h"
+
+namespace blimp {
+namespace client {
+
+class BlimpContentsImpl;
+
+// The JNI bridge for the Java BlimpView that will provide hooks to the Android
+// framework to interact with the content. The Java object is created by
+// constructed and owned by the native class.
+class BlimpView {
+ public:
+  static bool RegisterJni(JNIEnv* env);
+
+  // |blimp_contents_impl| must be the BlimpContentsImpl that this BlimpView is
+  // used for.
+  explicit BlimpView(BlimpContentsImpl* blimp_contents_impl);
+  ~BlimpView();
+
+  base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
+
+  // Creates a new ViewAndroidDelegate for this view.
+  base::android::ScopedJavaLocalRef<jobject> CreateViewAndroidDelegate();
+
+  void OnSizeChanged(JNIEnv* env,
+                     const base::android::JavaParamRef<jobject>& jobj,
+                     jint width,
+                     jint height,
+                     jfloat device_scale_factor_dp_to_px);
+
+  jboolean OnTouchEvent(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::JavaParamRef<jobject>& motion_event,
+      jlong time_ms,
+      jint android_action,
+      jint pointer_count,
+      jint history_size,
+      jint action_index,
+      jfloat pos_x_0,
+      jfloat pos_y_0,
+      jfloat pos_x_1,
+      jfloat pos_y_1,
+      jint pointer_id_0,
+      jint pointer_id_1,
+      jfloat touch_major_0,
+      jfloat touch_major_1,
+      jfloat touch_minor_0,
+      jfloat touch_minor_1,
+      jfloat orientation_0,
+      jfloat orientation_1,
+      jfloat tilt_0,
+      jfloat tilt_1,
+      jfloat raw_pos_x,
+      jfloat raw_pos_y,
+      jint android_tool_type_0,
+      jint android_tool_type_1,
+      jint android_button_state,
+      jint android_meta_state,
+      jfloat device_scale_factor_dp_to_px);
+
+ private:
+  // The BlimpContentsImpl that this BlimpView is used for.
+  // TODO(nyquist): Use a delegate instead of the BlimpContentsImpl.
+  BlimpContentsImpl* blimp_contents_impl_;
+
+  // The Java object for this BlimpView.
+  base::android::ScopedJavaGlobalRef<jobject> java_obj_;
+
+  DISALLOW_COPY_AND_ASSIGN(BlimpView);
+};
+
+}  // namespace client
+}  // namespace blimp
+
+#endif  // BLIMP_CLIENT_CORE_CONTENTS_ANDROID_BLIMP_VIEW_H_
diff --git a/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java b/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java
index 849a3c9e..a90a803 100644
--- a/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java
+++ b/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpContentsImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.blimp.core.contents;
 
+import android.view.ViewGroup;
+
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.blimp_public.contents.BlimpContents;
@@ -17,9 +19,10 @@
 @JNINamespace("blimp::client")
 public class BlimpContentsImpl implements BlimpContents {
     @CalledByNative
-    private static BlimpContentsImpl create(
-            long nativeBlimpContentsImplAndroid, BlimpNavigationController navigationController) {
-        return new BlimpContentsImpl(nativeBlimpContentsImplAndroid, navigationController);
+    private static BlimpContentsImpl create(long nativeBlimpContentsImplAndroid,
+            BlimpNavigationController navigationController, BlimpView blimpView) {
+        return new BlimpContentsImpl(
+                nativeBlimpContentsImplAndroid, navigationController, blimpView);
     }
 
     private long mNativeBlimpContentsImplAndroid;
@@ -33,10 +36,14 @@
     // single JNI hop for each call to observers.
     private BlimpContentsObserverProxy mObserverProxy;
 
-    private BlimpContentsImpl(
-            long nativeBlimpContentsImplAndroid, BlimpNavigationController navigationController) {
+    // The Android View for this BlimpContents.
+    private BlimpView mBlimpView;
+
+    private BlimpContentsImpl(long nativeBlimpContentsImplAndroid,
+            BlimpNavigationController navigationController, BlimpView blimpView) {
         mNativeBlimpContentsImplAndroid = nativeBlimpContentsImplAndroid;
         mBlimpNavigationController = navigationController;
+        mBlimpView = blimpView;
     }
 
     @CalledByNative
@@ -56,6 +63,11 @@
     }
 
     @Override
+    public ViewGroup getView() {
+        return mBlimpView;
+    }
+
+    @Override
     public BlimpNavigationController getNavigationController() {
         return mBlimpNavigationController;
     }
diff --git a/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpView.java b/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpView.java
new file mode 100644
index 0000000..c459d81
--- /dev/null
+++ b/blimp/client/core/contents/android/java/src/org/chromium/blimp/core/contents/BlimpView.java
@@ -0,0 +1,127 @@
+// 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.
+
+package org.chromium.blimp.core.contents;
+
+import android.content.Context;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.FrameLayout;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.ui.base.ViewAndroidDelegate;
+import org.chromium.ui.base.WindowAndroid;
+
+/**
+ * A {@link View} that will visually represent the Blimp rendered content.
+ */
+@JNINamespace("blimp::client")
+public class BlimpView extends FrameLayout {
+    @CalledByNative
+    private static BlimpView create(long nativeBlimpView, WindowAndroid window) {
+        Context context = window.getContext().get();
+        if (context == null) throw new AssertionError("WindowAndroid must have a valid context.");
+        return new BlimpView(nativeBlimpView, context);
+    }
+
+    /**
+     * Pointer to the native JNI bridge.
+     */
+    private long mNativeBlimpViewPtr;
+
+    /**
+     * Builds a new {@link BlimpView}.
+     * @param nativeBlimpView the pointer to the native BlimpView.
+     * @param context A {@link Context} instance.
+     */
+    private BlimpView(long nativeBlimpView, Context context) {
+        super(context);
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+        mNativeBlimpViewPtr = nativeBlimpView;
+    }
+
+    // View overrides.
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        if (mNativeBlimpViewPtr == 0) return;
+        nativeOnSizeChanged(
+                mNativeBlimpViewPtr, w, h, getContext().getResources().getDisplayMetrics().density);
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (mNativeBlimpViewPtr == 0) return false;
+
+        if (!hasValidTouchEventActionForNative(event)) return false;
+
+        int pointerCount = event.getPointerCount();
+
+        float[] touchMajor = {event.getTouchMajor(), pointerCount > 1 ? event.getTouchMajor(1) : 0};
+        float[] touchMinor = {event.getTouchMinor(), pointerCount > 1 ? event.getTouchMinor(1) : 0};
+
+        for (int i = 0; i < 2; i++) {
+            if (touchMajor[i] < touchMinor[i]) {
+                float tmp = touchMajor[i];
+                touchMajor[i] = touchMinor[i];
+                touchMinor[i] = tmp;
+            }
+        }
+
+        // Native returns whether the event was consumed.
+        return nativeOnTouchEvent(mNativeBlimpViewPtr, event, event.getEventTime(),
+                event.getActionMasked(), pointerCount, event.getHistorySize(),
+                event.getActionIndex(), event.getX(), event.getY(),
+                pointerCount > 1 ? event.getX(1) : 0, pointerCount > 1 ? event.getY(1) : 0,
+                event.getPointerId(0), pointerCount > 1 ? event.getPointerId(1) : -1, touchMajor[0],
+                touchMajor[1], touchMinor[0], touchMinor[1], event.getOrientation(),
+                pointerCount > 1 ? event.getOrientation(1) : 0,
+                event.getAxisValue(MotionEvent.AXIS_TILT),
+                pointerCount > 1 ? event.getAxisValue(MotionEvent.AXIS_TILT, 1) : 0,
+                event.getRawX(), event.getRawY(), event.getToolType(0),
+                pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_TYPE_UNKNOWN,
+                event.getButtonState(), event.getMetaState(),
+                getContext().getResources().getDisplayMetrics().density);
+    }
+
+    @CalledByNative
+    public void clearNativePtr() {
+        mNativeBlimpViewPtr = 0;
+    }
+
+    @CalledByNative
+    private ViewAndroidDelegate createViewAndroidDelegate() {
+        return ViewAndroidDelegate.createBasicDelegate(this);
+    }
+
+    /**
+     * This method inspects the event action of a TouchEvent and returns whether it should be
+     * passed along to native or not.
+     *
+     * Only some actions have any effect on gesture detection, and other actions again have no
+     * corresponding WebTouchEvent type and may confuse the touch pipeline, so they are ignored
+     * completely.
+     *
+     * @return whether this |eventAction| is a valid touch event action for native code.
+     */
+    private static boolean hasValidTouchEventActionForNative(MotionEvent event) {
+        int eventAction = event.getActionMasked();
+        return eventAction == MotionEvent.ACTION_DOWN || eventAction == MotionEvent.ACTION_UP
+                || eventAction == MotionEvent.ACTION_CANCEL
+                || eventAction == MotionEvent.ACTION_MOVE
+                || eventAction == MotionEvent.ACTION_POINTER_DOWN
+                || eventAction == MotionEvent.ACTION_POINTER_UP;
+    }
+
+    private native void nativeOnSizeChanged(
+            long nativeBlimpView, int width, int height, float deviceScaleFactorDpToPx);
+    private native boolean nativeOnTouchEvent(long nativeBlimpView, MotionEvent event, long timeMs,
+            int action, int pointerCount, int historySize, int actionIndex, float x0, float y0,
+            float x1, float y1, int pointerId0, int pointerId1, float touchMajor0,
+            float touchMajor1, float touchMinor0, float touchMinor1, float orientation0,
+            float orientation1, float tilt0, float tilt1, float rawX, float rawY,
+            int androidToolType0, int androidToolType1, int androidButtonState,
+            int androidMetaState, float deviceScaleFactorDpToPx);
+}
diff --git a/blimp/client/core/contents/blimp_contents_impl.cc b/blimp/client/core/contents/blimp_contents_impl.cc
index 2790c6a5..c9c30cd0 100644
--- a/blimp/client/core/contents/blimp_contents_impl.cc
+++ b/blimp/client/core/contents/blimp_contents_impl.cc
@@ -9,6 +9,7 @@
 #include "blimp/client/core/contents/blimp_contents_view.h"
 #include "blimp/client/core/contents/tab_control_feature.h"
 #include "blimp/client/public/contents/blimp_contents_observer.h"
+#include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_ANDROID)
 #include "blimp/client/core/contents/android/blimp_contents_impl_android.h"
@@ -26,6 +27,7 @@
 
 BlimpContentsImpl::BlimpContentsImpl(
     int id,
+    gfx::NativeWindow window,
     BlimpCompositorDependencies* compositor_deps,
     ImeFeature* ime_feature,
     NavigationFeature* navigation_feature,
@@ -34,6 +36,7 @@
     : navigation_controller_(this, navigation_feature),
       compositor_manager_(render_widget_feature, compositor_deps),
       id_(id),
+      window_(window),
       tab_control_feature_(tab_control_feature) {
   blimp_contents_view_ =
       BlimpContentsView::Create(this, compositor_manager_.layer());
@@ -66,6 +69,10 @@
   return navigation_controller_;
 }
 
+gfx::NativeWindow BlimpContentsImpl::GetNativeWindow() {
+  return window_;
+}
+
 void BlimpContentsImpl::AddObserver(BlimpContentsObserver* observer) {
   observers_.AddObserver(observer);
 }
@@ -100,5 +107,9 @@
   tab_control_feature_->SetSizeAndScale(size, device_pixel_ratio);
 }
 
+BlimpContentsView* BlimpContentsImpl::GetBlimpContentsView() {
+  return blimp_contents_view_.get();
+}
+
 }  // namespace client
 }  // namespace blimp
diff --git a/blimp/client/core/contents/blimp_contents_impl.h b/blimp/client/core/contents/blimp_contents_impl.h
index 76b96dea..cee07bb 100644
--- a/blimp/client/core/contents/blimp_contents_impl.h
+++ b/blimp/client/core/contents/blimp_contents_impl.h
@@ -12,6 +12,7 @@
 #include "blimp/client/core/contents/blimp_navigation_controller_impl.h"
 #include "blimp/client/public/contents/blimp_contents.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/gfx/native_widget_types.h"
 #include "url/gurl.h"
 
 #if defined(OS_ANDROID)
@@ -38,7 +39,9 @@
                           public BlimpNavigationControllerDelegate {
  public:
   // Ownership of the features remains with the caller.
+  // |window| must be the platform specific window that this will be shown in.
   explicit BlimpContentsImpl(int id,
+                             gfx::NativeWindow window,
                              BlimpCompositorDependencies* compositor_deps,
                              ImeFeature* ime_feature,
                              NavigationFeature* navigation_feature,
@@ -59,6 +62,9 @@
   void Show() override;
   void Hide() override;
 
+  // Returns the platform specific window that this BlimpContents is showed in.
+  gfx::NativeWindow GetNativeWindow();
+
   // Check if some observer is in the observer list.
   bool HasObserver(BlimpContentsObserver* observer);
 
@@ -71,6 +77,12 @@
 
   int id() { return id_; }
 
+  // Returns the BlimpContentsView for this BlimpContentsImpl.
+  BlimpContentsView* GetBlimpContentsView();
+
+  // TODO(nyquist): Remove this once the Android BlimpView uses a delegate.
+  BlimpCompositorManager* compositor_manager() { return &compositor_manager_; }
+
  private:
   // Handles the back/forward list and loading URLs.
   BlimpNavigationControllerImpl navigation_controller_;
@@ -87,6 +99,9 @@
   // BlimpContentsManager to control the life time of the its observer.
   int id_;
 
+  // The platform specific window that this BlimpContents is showed in.
+  gfx::NativeWindow window_;
+
   // The tab control feature through which the BlimpContentsImpl is able to
   // set size and scale.
   // TODO(mlliu): in the long term, we want to put size and scale in a different
diff --git a/blimp/client/core/contents/blimp_contents_impl_unittest.cc b/blimp/client/core/contents/blimp_contents_impl_unittest.cc
index 6be333bb..360a7df 100644
--- a/blimp/client/core/contents/blimp_contents_impl_unittest.cc
+++ b/blimp/client/core/contents/blimp_contents_impl_unittest.cc
@@ -14,6 +14,11 @@
 #include "blimp/client/support/compositor/mock_compositor_dependencies.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/native_widget_types.h"
+
+#if defined(OS_ANDROID)
+#include "ui/android/window_android.h"
+#endif  // defined(OS_ANDROID)
 
 namespace blimp {
 namespace client {
@@ -45,15 +50,32 @@
   DISALLOW_COPY_AND_ASSIGN(MockTabControlFeature);
 };
 
-TEST(BlimpContentsImplTest, LoadURLAndNotifyObservers) {
+class BlimpContentsImplTest : public testing::Test {
+ public:
+  BlimpContentsImplTest() = default;
+
+#if defined(OS_ANDROID)
+  void SetUp() override { window_ = ui::WindowAndroid::CreateForTesting(); }
+
+  void TearDown() override { window_->DestroyForTesting(); }
+#endif  // defined(OS_ANDROID)
+
+ protected:
+  gfx::NativeWindow window_ = nullptr;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BlimpContentsImplTest);
+};
+
+TEST_F(BlimpContentsImplTest, LoadURLAndNotifyObservers) {
   base::MessageLoop loop;
   FakeNavigationFeature navigation_feature;
   RenderWidgetFeature render_widget_feature;
   BlimpCompositorDependencies compositor_deps(
       base::MakeUnique<MockCompositorDependencies>());
-  BlimpContentsImpl blimp_contents(kDummyTabId, &compositor_deps, nullptr,
-                                   &navigation_feature, &render_widget_feature,
-                                   nullptr);
+  BlimpContentsImpl blimp_contents(kDummyTabId, window_, &compositor_deps,
+                                   nullptr, &navigation_feature,
+                                   &render_widget_feature, nullptr);
 
   BlimpNavigationControllerImpl& navigation_controller =
       blimp_contents.GetNavigationController();
@@ -78,7 +100,7 @@
   EXPECT_EQ(kOtherExampleURL, navigation_controller.GetURL().spec());
 }
 
-TEST(BlimpContentsImplTest, SetSizeAndScaleThroughTabControlFeature) {
+TEST_F(BlimpContentsImplTest, SetSizeAndScaleThroughTabControlFeature) {
   int width = 10;
   int height = 15;
   float dp_to_px = 1.23f;
@@ -88,8 +110,8 @@
   base::MessageLoop loop;
   BlimpCompositorDependencies compositor_deps(
       base::MakeUnique<MockCompositorDependencies>());
-  BlimpContentsImpl blimp_contents(kDummyTabId, &compositor_deps, nullptr,
-                                   nullptr, &render_widget_feature,
+  BlimpContentsImpl blimp_contents(kDummyTabId, window_, &compositor_deps,
+                                   nullptr, nullptr, &render_widget_feature,
                                    &tab_control_feature);
 
   EXPECT_CALL(tab_control_feature,
diff --git a/blimp/client/core/contents/blimp_contents_manager.cc b/blimp/client/core/contents/blimp_contents_manager.cc
index 6778bb1..52214d4e 100644
--- a/blimp/client/core/contents/blimp_contents_manager.cc
+++ b/blimp/client/core/contents/blimp_contents_manager.cc
@@ -63,7 +63,8 @@
 
 BlimpContentsManager::~BlimpContentsManager() {}
 
-std::unique_ptr<BlimpContentsImpl> BlimpContentsManager::CreateBlimpContents() {
+std::unique_ptr<BlimpContentsImpl> BlimpContentsManager::CreateBlimpContents(
+    gfx::NativeWindow window) {
   if (tab_exists_) return nullptr;
   tab_exists_ = true;
 
@@ -71,8 +72,8 @@
 
   std::unique_ptr<BlimpContentsImpl> new_contents =
       base::MakeUnique<BlimpContentsImpl>(
-          id, blimp_compositor_dependencies_, ime_feature_, navigation_feature_,
-          render_widget_feature_, tab_control_feature_);
+          id, window, blimp_compositor_dependencies_, ime_feature_,
+          navigation_feature_, render_widget_feature_, tab_control_feature_);
 
   // Create an observer entry for the contents.
   std::unique_ptr<BlimpContentsDeletionObserver> observer =
diff --git a/blimp/client/core/contents/blimp_contents_manager.h b/blimp/client/core/contents/blimp_contents_manager.h
index fcbadc5..31e8bf6 100644
--- a/blimp/client/core/contents/blimp_contents_manager.h
+++ b/blimp/client/core/contents/blimp_contents_manager.h
@@ -8,6 +8,8 @@
 #include <map>
 
 #include "base/memory/weak_ptr.h"
+#include "blimp/client/core/contents/blimp_contents_impl.h"
+#include "ui/gfx/native_widget_types.h"
 
 namespace blimp {
 namespace client {
@@ -36,7 +38,8 @@
   // Builds a BlimpContentsImpl and notifies the engine.
   // TODO(mlliu): Currently we want to have a single BlimpContents. If there is
   // an existing contents, return nullptr (http://crbug.com/642558).
-  std::unique_ptr<BlimpContentsImpl> CreateBlimpContents();
+  std::unique_ptr<BlimpContentsImpl> CreateBlimpContents(
+      gfx::NativeWindow window);
 
   // The caller can query the contents through its id.
   BlimpContentsImpl* GetBlimpContents(int id);
diff --git a/blimp/client/core/contents/blimp_contents_manager_unittest.cc b/blimp/client/core/contents/blimp_contents_manager_unittest.cc
index 0037055..8baa89a8 100644
--- a/blimp/client/core/contents/blimp_contents_manager_unittest.cc
+++ b/blimp/client/core/contents/blimp_contents_manager_unittest.cc
@@ -13,6 +13,11 @@
 #include "blimp/client/support/compositor/mock_compositor_dependencies.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/native_widget_types.h"
+
+#if defined(OS_ANDROID)
+#include "ui/android/window_android.h"
+#endif  // defined(OS_ANDROID)
 
 using testing::_;
 
@@ -24,6 +29,23 @@
 namespace client {
 namespace {
 
+class BlimpContentsManagerTest : public testing::Test {
+ public:
+  BlimpContentsManagerTest() = default;
+
+#if defined(OS_ANDROID)
+  void SetUp() override { window_ = ui::WindowAndroid::CreateForTesting(); }
+
+  void TearDown() override { window_->DestroyForTesting(); }
+#endif  // defined(OS_ANDROID)
+
+ protected:
+  gfx::NativeWindow window_ = nullptr;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BlimpContentsManagerTest);
+};
+
 class MockTabControlFeature : public TabControlFeature {
  public:
   MockTabControlFeature() {}
@@ -36,7 +58,7 @@
   DISALLOW_COPY_AND_ASSIGN(MockTabControlFeature);
 };
 
-TEST(BlimpContentsManagerUnittest, GetExistingBlimpContents) {
+TEST_F(BlimpContentsManagerTest, GetExistingBlimpContents) {
   base::MessageLoop loop;
   RenderWidgetFeature render_widget_feature;
   MockTabControlFeature tab_control_feature;
@@ -49,14 +71,14 @@
 
   EXPECT_CALL(tab_control_feature, CreateTab(_)).Times(1);
   std::unique_ptr<BlimpContentsImpl> blimp_contents =
-      blimp_contents_manager.CreateBlimpContents();
+      blimp_contents_manager.CreateBlimpContents(window_);
   int id = blimp_contents->id();
   BlimpContentsImpl* existing_contents =
       blimp_contents_manager.GetBlimpContents(id);
   EXPECT_EQ(blimp_contents.get(), existing_contents);
 }
 
-TEST(BlimpContentsManagerUnittest, GetNonExistingBlimpContents) {
+TEST_F(BlimpContentsManagerTest, GetNonExistingBlimpContents) {
   RenderWidgetFeature render_widget_feature;
   MockTabControlFeature tab_control_feature;
 
@@ -71,7 +93,7 @@
   EXPECT_EQ(nullptr, existing_contents);
 }
 
-TEST(BlimpContentsManagerUnittest, GetDestroyedBlimpContents) {
+TEST_F(BlimpContentsManagerTest, GetDestroyedBlimpContents) {
   base::MessageLoop loop;
   RenderWidgetFeature render_widget_feature;
   MockTabControlFeature tab_control_feature;
@@ -84,7 +106,7 @@
 
   EXPECT_CALL(tab_control_feature, CreateTab(_)).Times(1);
   std::unique_ptr<BlimpContentsImpl> blimp_contents =
-      blimp_contents_manager.CreateBlimpContents();
+      blimp_contents_manager.CreateBlimpContents(window_);
   id = blimp_contents.get()->id();
   BlimpContentsImpl* existing_contents =
       blimp_contents_manager.GetBlimpContents(id);
@@ -98,7 +120,7 @@
 }
 
 // TODO(mlliu): remove this test case (http://crbug.com/642558)
-TEST(BlimpContentsManagerUnittest, CreateTwoBlimpContentsDestroyAndCreate) {
+TEST_F(BlimpContentsManagerTest, CreateTwoBlimpContentsDestroyAndCreate) {
   base::MessageLoop loop;
   RenderWidgetFeature render_widget_feature;
   MockTabControlFeature tab_control_feature;
@@ -110,16 +132,16 @@
 
   EXPECT_CALL(tab_control_feature, CreateTab(_)).Times(2);
   std::unique_ptr<BlimpContentsImpl> blimp_contents =
-      blimp_contents_manager.CreateBlimpContents();
+      blimp_contents_manager.CreateBlimpContents(window_);
   EXPECT_NE(blimp_contents, nullptr);
 
   std::unique_ptr<BlimpContentsImpl> second_blimp_contents =
-      blimp_contents_manager.CreateBlimpContents();
+      blimp_contents_manager.CreateBlimpContents(window_);
   EXPECT_EQ(second_blimp_contents, nullptr);
 
   blimp_contents.reset();
   std::unique_ptr<BlimpContentsImpl> third_blimp_contents =
-      blimp_contents_manager.CreateBlimpContents();
+      blimp_contents_manager.CreateBlimpContents(window_);
   EXPECT_NE(third_blimp_contents, nullptr);
 }
 
diff --git a/blimp/client/core/contents/blimp_contents_observer_unittest.cc b/blimp/client/core/contents/blimp_contents_observer_unittest.cc
index cea0d026..527ffb2 100644
--- a/blimp/client/core/contents/blimp_contents_observer_unittest.cc
+++ b/blimp/client/core/contents/blimp_contents_observer_unittest.cc
@@ -11,6 +11,11 @@
 #include "blimp/client/support/compositor/mock_compositor_dependencies.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/native_widget_types.h"
+
+#if defined(OS_ANDROID)
+#include "ui/android/window_android.h"
+#endif  // defined(OS_ANDROID)
 
 namespace {
 const int kDummyTabId = 0;
@@ -21,26 +26,43 @@
 
 namespace {
 
-class BlimpContentsObserverTest : public BlimpContentsObserver {
+class TestBlimpContentsObserver : public BlimpContentsObserver {
  public:
-  explicit BlimpContentsObserverTest(BlimpContents* blimp_contents)
+  explicit TestBlimpContentsObserver(BlimpContents* blimp_contents)
       : BlimpContentsObserver(blimp_contents) {}
 
   MOCK_METHOD0(OnContentsDestroyed, void());
 
  private:
+  DISALLOW_COPY_AND_ASSIGN(TestBlimpContentsObserver);
+};
+
+class BlimpContentsObserverTest : public testing::Test {
+ public:
+  BlimpContentsObserverTest() = default;
+
+#if defined(OS_ANDROID)
+  void SetUp() override { window_ = ui::WindowAndroid::CreateForTesting(); }
+
+  void TearDown() override { window_->DestroyForTesting(); }
+#endif  // defined(OS_ANDROID)
+
+ protected:
+  gfx::NativeWindow window_ = nullptr;
+
+ private:
   DISALLOW_COPY_AND_ASSIGN(BlimpContentsObserverTest);
 };
 
-TEST(BlimpContentsObserverUnittests, ObserverDies) {
+TEST_F(BlimpContentsObserverTest, ObserverDies) {
   RenderWidgetFeature render_widget_feature;
   BlimpCompositorDependencies compositor_deps(
       base::MakeUnique<MockCompositorDependencies>());
-  BlimpContentsImpl contents(kDummyTabId, &compositor_deps, nullptr, nullptr,
-                             &render_widget_feature, nullptr);
+  BlimpContentsImpl contents(kDummyTabId, window_, &compositor_deps, nullptr,
+                             nullptr, &render_widget_feature, nullptr);
 
   std::unique_ptr<BlimpContentsObserver> observer =
-      base::MakeUnique<BlimpContentsObserverTest>(&contents);
+      base::MakeUnique<TestBlimpContentsObserver>(&contents);
   BlimpContentsObserver* observer_ptr = observer.get();
   EXPECT_TRUE(contents.HasObserver(observer_ptr));
   observer.reset();
@@ -48,16 +70,16 @@
   EXPECT_FALSE(contents.HasObserver(observer_ptr));
 }
 
-TEST(BlimpContentsObserverUnittests, ContentsDies) {
-  std::unique_ptr<BlimpContentsObserverTest> observer;
+TEST_F(BlimpContentsObserverTest, ContentsDies) {
+  std::unique_ptr<TestBlimpContentsObserver> observer;
   RenderWidgetFeature render_widget_feature;
   BlimpCompositorDependencies compositor_deps(
       base::MakeUnique<MockCompositorDependencies>());
   std::unique_ptr<BlimpContentsImpl> contents =
-      base::MakeUnique<BlimpContentsImpl>(kDummyTabId, &compositor_deps,
-                                          nullptr, nullptr,
+      base::MakeUnique<BlimpContentsImpl>(kDummyTabId, window_,
+                                          &compositor_deps, nullptr, nullptr,
                                           &render_widget_feature, nullptr);
-  observer.reset(new BlimpContentsObserverTest(contents.get()));
+  observer.reset(new TestBlimpContentsObserver(contents.get()));
   EXPECT_CALL(*observer, OnContentsDestroyed()).Times(1);
   EXPECT_EQ(observer->blimp_contents(), contents.get());
   contents.reset();
diff --git a/blimp/client/core/contents/blimp_contents_view_android.cc b/blimp/client/core/contents/blimp_contents_view_android.cc
index 2ade9c3..031023f 100644
--- a/blimp/client/core/contents/blimp_contents_view_android.cc
+++ b/blimp/client/core/contents/blimp_contents_view_android.cc
@@ -6,7 +6,9 @@
 
 #include "base/memory/ptr_util.h"
 #include "blimp/client/core/contents/android/blimp_contents_impl_android.h"
+#include "blimp/client/core/contents/android/blimp_view.h"
 #include "cc/layers/layer.h"
+#include "ui/android/window_android.h"
 
 namespace blimp {
 namespace client {
@@ -15,21 +17,28 @@
 std::unique_ptr<BlimpContentsView> BlimpContentsView::Create(
     BlimpContentsImpl* blimp_contents,
     scoped_refptr<cc::Layer> contents_layer) {
-  return base::MakeUnique<BlimpContentsViewAndroid>(
-      blimp_contents->GetBlimpContentsImplAndroid(), contents_layer);
+  return base::MakeUnique<BlimpContentsViewAndroid>(blimp_contents,
+                                                    contents_layer);
 }
 
 BlimpContentsViewAndroid::BlimpContentsViewAndroid(
-    BlimpContentsImplAndroid* blimp_contents,
+    BlimpContentsImpl* blimp_contents,
     scoped_refptr<cc::Layer> contents_layer) {
-  // TODO(khushalsagar): Get the ViewAndroidDelegate from java after it has a
-  // BlimpView. Also get the WindowAndroid so this view can add itself as a
-  // child to it.
-  view_.SetLayer(contents_layer);
+  blimp_view_ = base::MakeUnique<BlimpView>(blimp_contents);
+  view_ = base::MakeUnique<ui::ViewAndroid>(
+      blimp_view_->CreateViewAndroidDelegate());
+  view_->SetLayer(contents_layer);
+  blimp_contents->GetNativeWindow()->AddChild(view_.get());
 }
 
+BlimpContentsViewAndroid::~BlimpContentsViewAndroid() = default;
+
 gfx::NativeView BlimpContentsViewAndroid::GetNativeView() {
-  return &view_;
+  return view_.get();
+}
+
+BlimpView* BlimpContentsViewAndroid::GetBlimpView() {
+  return blimp_view_.get();
 }
 
 }  // namespace client
diff --git a/blimp/client/core/contents/blimp_contents_view_android.h b/blimp/client/core/contents/blimp_contents_view_android.h
index 9f087249..08b9af2 100644
--- a/blimp/client/core/contents/blimp_contents_view_android.h
+++ b/blimp/client/core/contents/blimp_contents_view_android.h
@@ -11,18 +11,26 @@
 
 namespace blimp {
 namespace client {
-class BlimpContentsImplAndroid;
+class BlimpContentsImpl;
+class BlimpView;
 
 class BlimpContentsViewAndroid : public BlimpContentsView {
  public:
-  explicit BlimpContentsViewAndroid(BlimpContentsImplAndroid* blimp_contents,
-                                    scoped_refptr<cc::Layer> contents_layer);
+  BlimpContentsViewAndroid(BlimpContentsImpl* blimp_contents,
+                           scoped_refptr<cc::Layer> contents_layer);
+  ~BlimpContentsViewAndroid() override;
 
   // BlimpContentsView implementation.
   gfx::NativeView GetNativeView() override;
 
+  // Returns the JNI-bridge for the Android View for this BlimpContentsView.
+  BlimpView* GetBlimpView();
+
  private:
-  ui::ViewAndroid view_;
+  std::unique_ptr<ui::ViewAndroid> view_;
+
+  // The JNI-bridge for the Android View for this BlimpContentsView.
+  std::unique_ptr<BlimpView> blimp_view_;
 
   DISALLOW_COPY_AND_ASSIGN(BlimpContentsViewAndroid);
 };
diff --git a/blimp/client/core/dummy_blimp_client_context.cc b/blimp/client/core/dummy_blimp_client_context.cc
index 97e5ada..5ebc115 100644
--- a/blimp/client/core/dummy_blimp_client_context.cc
+++ b/blimp/client/core/dummy_blimp_client_context.cc
@@ -39,7 +39,8 @@
 void DummyBlimpClientContext::SetDelegate(
     BlimpClientContextDelegate* delegate) {}
 
-std::unique_ptr<BlimpContents> DummyBlimpClientContext::CreateBlimpContents() {
+std::unique_ptr<BlimpContents> DummyBlimpClientContext::CreateBlimpContents(
+    gfx::NativeWindow window) {
   return nullptr;
 }
 
diff --git a/blimp/client/core/dummy_blimp_client_context.h b/blimp/client/core/dummy_blimp_client_context.h
index 381e8f9..f6015e65 100644
--- a/blimp/client/core/dummy_blimp_client_context.h
+++ b/blimp/client/core/dummy_blimp_client_context.h
@@ -23,7 +23,8 @@
 
   // BlimpClientContext implementation.
   void SetDelegate(BlimpClientContextDelegate* delegate) override;
-  std::unique_ptr<BlimpContents> CreateBlimpContents() override;
+  std::unique_ptr<BlimpContents> CreateBlimpContents(
+      gfx::NativeWindow window) override;
   void Connect() override;
 
  private:
diff --git a/blimp/client/public/BUILD.gn b/blimp/client/public/BUILD.gn
index 0977f6e3..7ca2d7f 100644
--- a/blimp/client/public/BUILD.gn
+++ b/blimp/client/public/BUILD.gn
@@ -86,6 +86,7 @@
 
     deps = [
       "//third_party/android_tools:android_support_annotations_java",
+      "//ui/android:ui_java",
     ]
 
     # The enums are added here for convenience for embedders, so they can still
diff --git a/blimp/client/public/android/java/src/org/chromium/blimp_public/BlimpClientContext.java b/blimp/client/public/android/java/src/org/chromium/blimp_public/BlimpClientContext.java
index 21ef6729..cab3cd5 100644
--- a/blimp/client/public/android/java/src/org/chromium/blimp_public/BlimpClientContext.java
+++ b/blimp/client/public/android/java/src/org/chromium/blimp_public/BlimpClientContext.java
@@ -7,6 +7,7 @@
 import android.preference.PreferenceFragment;
 
 import org.chromium.blimp_public.contents.BlimpContents;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * BlimpClientContext is the Java representation of a native BlimpClientContext object.
@@ -19,8 +20,9 @@
     /**
      * Creates a {@link BlimpContents} and takes ownership of it. The caller must call
      * {@link BlimpContents#destroy()} for destruction of the BlimpContents.
+     * @param windowAndroid the window this BlimpContents will be displayed in.
      */
-    BlimpContents createBlimpContents();
+    BlimpContents createBlimpContents(WindowAndroid windowAndroid);
 
     /**
      * @return If Blimp is supported with this build.
diff --git a/blimp/client/public/android/java/src/org/chromium/blimp_public/contents/BlimpContents.java b/blimp/client/public/android/java/src/org/chromium/blimp_public/contents/BlimpContents.java
index 9ef1358..e961b46 100644
--- a/blimp/client/public/android/java/src/org/chromium/blimp_public/contents/BlimpContents.java
+++ b/blimp/client/public/android/java/src/org/chromium/blimp_public/contents/BlimpContents.java
@@ -4,6 +4,8 @@
 
 package org.chromium.blimp_public.contents;
 
+import android.view.ViewGroup;
+
 /**
  * BlimpContents is the Java representation of a native BlimpContents object.
  *
@@ -29,6 +31,11 @@
     void removeObserver(BlimpContentsObserver observer);
 
     /**
+     * Returns a view that represents the content for this BlimpContents.
+     */
+    ViewGroup getView();
+
+    /**
      * For BlimpContents that are owned by Java, this must be called before this BlimpContents is
      * garbage collected.
      */
diff --git a/blimp/client/public/blimp_client_context.h b/blimp/client/public/blimp_client_context.h
index 908aaca6..bc4424c 100644
--- a/blimp/client/public/blimp_client_context.h
+++ b/blimp/client/public/blimp_client_context.h
@@ -13,6 +13,7 @@
 #include "blimp/client/public/blimp_client_context_delegate.h"
 #include "blimp/client/public/contents/blimp_contents.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "ui/gfx/native_widget_types.h"
 
 #if defined(OS_ANDROID)
 #include "base/android/jni_android.h"
@@ -56,10 +57,11 @@
   // The delegate provides all the required functionality from the embedder.
   virtual void SetDelegate(BlimpClientContextDelegate* delegate) = 0;
 
-  // Creates a new BlimpContents.
+  // Creates a new BlimpContents that will be shown in |window|.
   // TODO(mlliu): Currently we want to have a single BlimpContents. If there is
   // an existing contents, return nullptr (http://crbug.com/642558).
-  virtual std::unique_ptr<BlimpContents> CreateBlimpContents() = 0;
+  virtual std::unique_ptr<BlimpContents> CreateBlimpContents(
+      gfx::NativeWindow window) = 0;
 
   // Start authentication flow and connection to engine.
   virtual void Connect() = 0;
diff --git a/blimp/engine/app/switches.cc b/blimp/engine/app/switches.cc
index 0cfe19d..aabcc06 100644
--- a/blimp/engine/app/switches.cc
+++ b/blimp/engine/app/switches.cc
@@ -8,6 +8,7 @@
 namespace engine {
 
 const char kEnginePort[] = "engine-port";
+const char kAllowNonLocalhost[] = "allow-non-localhost";
 
 }  // namespace engine
 }  // namespace blimp
diff --git a/blimp/engine/app/switches.h b/blimp/engine/app/switches.h
index b7c807f..6fb4930d 100644
--- a/blimp/engine/app/switches.h
+++ b/blimp/engine/app/switches.h
@@ -11,6 +11,9 @@
 // The port to listen to for incoming TCP connections.
 extern const char kEnginePort[];
 
+// Flag enabling access by clients from non-localhost IP addresses.
+extern const char kAllowNonLocalhost[];
+
 }  // namespace engine
 }  // namespace blimp
 
diff --git a/blimp/engine/session/blimp_engine_session.cc b/blimp/engine/session/blimp_engine_session.cc
index 9029e8d..cbb338e 100644
--- a/blimp/engine/session/blimp_engine_session.cc
+++ b/blimp/engine/session/blimp_engine_session.cc
@@ -87,10 +87,6 @@
   DISALLOW_COPY_AND_ASSIGN(FocusRulesImpl);
 };
 
-net::IPAddress GetIPv4AnyAddress() {
-  return net::IPAddress(0, 0, 0, 0);
-}
-
 // Proxies calls to TaskRunner::PostTask while stripping the return value,
 // which provides a suitable function prototype for binding a base::Closure.
 void PostTask(const scoped_refptr<base::TaskRunner>& task_runner,
@@ -104,6 +100,13 @@
                     base::MessageLoop::QuitWhenIdleClosure());
 }
 
+net::IPAddress GetListeningAddress() {
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(kAllowNonLocalhost)) {
+    return net::IPAddress::IPv4AllZeros();
+  }
+  return net::IPAddress::IPv4Localhost();
+}
+
 uint16_t GetListeningPort() {
   unsigned port_parsed = 0;
   if (!base::StringToUint(
@@ -194,7 +197,7 @@
       base::MakeUnique<BlobChannelService>(blob_channel_sender, ui_task_runner);
 
   // Adds BlimpTransports to connection_manager_.
-  net::IPEndPoint address(GetIPv4AnyAddress(), GetListeningPort());
+  net::IPEndPoint address(GetListeningAddress(), GetListeningPort());
   TCPEngineTransport* transport = new TCPEngineTransport(address, net_log_);
   connection_manager_->AddTransport(base::WrapUnique(transport));
 
@@ -515,7 +518,7 @@
     content::WebContents* source,
     const content::OpenURLParams& params) {
   // CURRENT_TAB is the only one we implement for now.
-  if (params.disposition != CURRENT_TAB) {
+  if (params.disposition != WindowOpenDisposition::CURRENT_TAB) {
     NOTIMPLEMENTED();
     return nullptr;
   }
diff --git a/blimp/test/BUILD.gn b/blimp/test/BUILD.gn
index f0f643868..20a39cc 100644
--- a/blimp/test/BUILD.gn
+++ b/blimp/test/BUILD.gn
@@ -17,6 +17,10 @@
     "//mojo/edk/system",
     "//ui/gfx:gfx",
   ]
+
+  if (is_android) {
+    deps += [ "//ui/android" ]
+  }
 }
 
 source_set("support") {
diff --git a/blimp/test/DEPS b/blimp/test/DEPS
index 05af7c9c..18932c7 100644
--- a/blimp/test/DEPS
+++ b/blimp/test/DEPS
@@ -5,5 +5,6 @@
   "+content/public",
   "+mojo/edk/embedder",
   "+net",
+  "+ui/android",
   "+ui/gfx",
 ]
diff --git a/blimp/test/run_all_unittests.cc b/blimp/test/run_all_unittests.cc
index 7d52f1693..3364010 100644
--- a/blimp/test/run_all_unittests.cc
+++ b/blimp/test/run_all_unittests.cc
@@ -13,6 +13,7 @@
 #include "base/android/jni_android.h"
 #include "blimp/client/public/android/blimp_jni_registrar.h"
 #include "net/android/net_jni_registrar.h"
+#include "ui/android/ui_android_jni_registrar.h"
 #include "ui/gfx/android/gfx_jni_registrar.h"
 #endif
 
@@ -48,6 +49,10 @@
       return false;
     }
 
+    if (!ui::RegisterUIAndroidJni(env)) {
+      return false;
+    }
+
     if (!blimp::client::RegisterBlimpJni(env)) {
       return false;
     }
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index 473dbfb..851a957 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -252,6 +252,7 @@
     <ignore regexp="android_ui_strings.xml" />
     <ignore regexp="android_webview/tools/automated_ui_tests/java/res/" />
     <ignore regexp="blimp/client/app/android/java/res/layout/blimp_main.xml" />
+    <ignore regexp="blimp/client/app/android/java/res/layout/text_input_popup.xml" />
     <ignore regexp="blimp/client/app/android/java/res/layout/toolbar_popup_item.xml" />
     <ignore regexp="blimp/client/app/android/java/res/values/dimens.xml" />
     <ignore regexp="blimp/client/app/android/java/res/xml/about_blimp_preferences.xml" />
diff --git a/build/android/method_count.py b/build/android/method_count.py
index fdbdaf5..1d9720c9 100755
--- a/build/android/method_count.py
+++ b/build/android/method_count.py
@@ -48,10 +48,10 @@
 # https://source.android.com/devices/tech/dalvik/dex-format.html
 
 
-_CONTRIBUTORS_TO_DEX_CACHE = {'type_ids_size': 'types',
-                              'string_ids_size': 'strings',
-                              'method_ids_size': 'methods',
-                              'field_ids_size': 'fields'}
+CONTRIBUTORS_TO_DEX_CACHE = {'type_ids_size': 'types',
+                             'string_ids_size': 'strings',
+                             'method_ids_size': 'methods',
+                             'field_ids_size': 'fields'}
 
 
 def _ExtractSizesFromDexFile(dex_path):
@@ -61,7 +61,7 @@
       # Each method, type, field, and string contributes 4 bytes (1 reference)
       # to our DexCache size.
       counts['dex_cache_size'] = (
-          sum(counts[x] for x in _CONTRIBUTORS_TO_DEX_CACHE)) * 4
+          sum(counts[x] for x in CONTRIBUTORS_TO_DEX_CACHE)) * 4
       return counts
     m = re.match(r'([a-z_]+_size) *: (\d+)', line)
     if m:
@@ -69,7 +69,7 @@
   raise Exception('Unexpected end of output.')
 
 
-def _ExtractSizesFromZip(path):
+def ExtractSizesFromZip(path):
   tmpdir = tempfile.mkdtemp(suffix='_dex_extract')
   try:
     counts = collections.defaultdict(int)
@@ -109,7 +109,7 @@
           'and --apk-name was not provided.' % args.dexfile)
 
   if os.path.splitext(args.dexfile)[1] in ('.zip', '.apk', '.jar'):
-    sizes = _ExtractSizesFromZip(args.dexfile)
+    sizes = ExtractSizesFromZip(args.dexfile)
   else:
     sizes = _ExtractSizesFromDexFile(args.dexfile)
 
@@ -118,7 +118,7 @@
         '%s_%s' % (args.apk_name, name), 'total', [sizes[value_key]],
         description or name)
 
-  for dex_header_name, readable_name in _CONTRIBUTORS_TO_DEX_CACHE.iteritems():
+  for dex_header_name, readable_name in CONTRIBUTORS_TO_DEX_CACHE.iteritems():
     print_result(readable_name, dex_header_name)
   print_result(
       'DexCache_size', 'dex_cache_size', 'bytes of permanent dirty memory')
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py
index b38d647..57cd0c0 100755
--- a/build/android/resource_sizes.py
+++ b/build/android/resource_sizes.py
@@ -24,6 +24,7 @@
 
 import devil_chromium
 from devil.utils import cmd_helper
+import method_count
 from pylib import constants
 from pylib.constants import host_paths
 
@@ -37,6 +38,7 @@
 with host_paths.SysPath(host_paths.BUILD_COMMON_PATH):
   import perf_tests_results_helper # pylint: disable=import-error
 
+
 # Python had a bug in zipinfo parsing that triggers on ChromeModern.apk
 # https://bugs.python.org/issue14315
 def _PatchedDecodeExtra(self):
@@ -354,29 +356,53 @@
   return id_name_map
 
 
-def PrintStaticInitializersCount(so_with_symbols_path, chartjson=None):
-  """Emits the performance result for static initializers found in the provided
-     shared library. Additionally, files for which static initializers were
-     found are printed on the standard output.
+def _PrintStaticInitializersCountFromApk(apk_filename, chartjson=None):
+  print 'Finding static initializers (can take a minute)'
+  with zipfile.ZipFile(apk_filename) as z:
+    infolist = z.infolist()
+  out_dir = constants.GetOutDirectory()
+  si_count = 0
+  for zip_info in infolist:
+    # Check file size to account for placeholder libraries.
+    if zip_info.filename.endswith('.so') and zip_info.file_size > 0:
+      unstripped_path = os.path.join(out_dir, 'lib.unstripped',
+                                     os.path.basename(zip_info.filename))
+      if os.path.exists(unstripped_path):
+        si_count += _PrintStaticInitializersCount(unstripped_path)
+      else:
+        raise Exception('Unstripped .so not found. Looked here: %s',
+                        unstripped_path)
+  ReportPerfResult(chartjson, 'StaticInitializersCount', 'count', si_count,
+                   'count')
+
+
+def _PrintStaticInitializersCount(so_with_symbols_path):
+  """Counts the number of static initializers in the given shared library.
+     Additionally, files for which static initializers were found are printed
+     on the standard output.
 
      Args:
        so_with_symbols_path: Path to the unstripped libchrome.so file.
+
+     Returns:
+       The number of static initializers found.
   """
   # GetStaticInitializers uses get-static-initializers.py to get a list of all
   # static initializers. This does not work on all archs (particularly arm).
   # TODO(rnephew): Get rid of warning when crbug.com/585588 is fixed.
   si_count = CountStaticInitializers(so_with_symbols_path)
   static_initializers = GetStaticInitializers(so_with_symbols_path)
-  if si_count != len(static_initializers):
+  static_initializers_count = len(static_initializers) - 1  # Minus summary.
+  if si_count != static_initializers_count:
     print ('There are %d files with static initializers, but '
            'dump-static-initializers found %d:' %
-           (si_count, len(static_initializers)))
+           (si_count, static_initializers_count))
   else:
-    print 'Found %d files with static initializers:' % si_count
+    print '%s - Found %d files with static initializers:' % (
+        os.path.basename(so_with_symbols_path), si_count)
   print '\n'.join(static_initializers)
 
-  ReportPerfResult(chartjson, 'StaticInitializersCount', 'count',
-                   si_count, 'count')
+  return si_count
 
 def _FormatBytes(byts):
   """Pretty-print a number of bytes."""
@@ -400,20 +426,34 @@
   return total_size
 
 
+def _PrintDexAnalysis(apk_filename, chartjson=None):
+  sizes = method_count.ExtractSizesFromZip(apk_filename)
+
+  graph_title = os.path.basename(apk_filename) + '_Dex'
+  dex_metrics = method_count.CONTRIBUTORS_TO_DEX_CACHE
+  for key, label in dex_metrics.iteritems():
+    ReportPerfResult(chartjson, graph_title, label, sizes[key], 'entries')
+
+  graph_title = '%sCache' % graph_title
+  ReportPerfResult(chartjson, graph_title, 'DexCache', sizes['dex_cache_size'],
+                   'bytes')
+
+
 def main(argv):
   usage = """Usage: %prog [options] file1 file2 ...
 
 Pass any number of files to graph their sizes. Any files with the extension
 '.apk' will be broken down into their components on a separate graph."""
   option_parser = optparse.OptionParser(usage=usage)
-  option_parser.add_option('--so-path', help='Path to libchrome.so.')
+  option_parser.add_option('--so-path',
+                           help='Obsolete. Pass .so as positional arg instead.')
   option_parser.add_option('--so-with-symbols-path',
-                           help='Path to libchrome.so with symbols.')
+                           help='Mostly obsolete. Use .so within .apk instead.')
   option_parser.add_option('--min-pak-resource-size', type='int',
                            default=20*1024,
                            help='Minimum byte size of displayed pak resources.')
   option_parser.add_option('--build_type', dest='build_type', default='Debug',
-                           help='Sets the build type, default is Debug.')
+                           help='Obsoleted by --chromium-output-directory.')
   option_parser.add_option('--chromium-output-directory',
                            help='Location of the build artifacts. '
                                 'Takes precidence over --build_type.')
@@ -444,8 +484,9 @@
   devil_chromium.Initialize()
 
   if options.so_with_symbols_path:
-    PrintStaticInitializersCount(
-        options.so_with_symbols_path, chartjson=chartjson)
+    si_count = _PrintStaticInitializersCount(options.so_with_symbols_path)
+    ReportPerfResult(chartjson, 'StaticInitializersCount', 'count', si_count,
+                     'count')
 
   PrintResourceSizes(files, chartjson=chartjson)
 
@@ -453,6 +494,9 @@
     if f.endswith('.apk'):
       PrintApkAnalysis(f, chartjson=chartjson)
       PrintPakAnalysis(f, options.min_pak_resource_size)
+      _PrintDexAnalysis(f, chartjson=chartjson)
+      if not options.so_with_symbols_path:
+        _PrintStaticInitializersCountFromApk(f, chartjson=chartjson)
 
   if chartjson:
     results_path = os.path.join(options.output_dir, 'results-chart.json')
diff --git a/build/config/android/config.gni b/build/config/android/config.gni
index b658069..be23314 100644
--- a/build/config/android/config.gni
+++ b/build/config/android/config.gni
@@ -25,27 +25,25 @@
   }
 
   if (!defined(default_android_ndk_root)) {
-    default_android_ndk_major_version = "10"
     default_android_ndk_root = "//third_party/android_tools/ndk"
     default_android_ndk_version = "r10e"
+    default_android_ndk_major_version = "10"
   } else {
     assert(defined(default_android_ndk_version))
+    assert(defined(default_android_ndk_major_version))
   }
 
-  # The same version of lint should be used for building all targets,
-  # and these args ensure that the upstream version of lint is used for
-  # both upstream and downstream targets.
-  lint_android_sdk_root = "//third_party/android_tools/sdk"
-  lint_android_sdk_version = "23"
-
   if (!defined(default_android_sdk_root)) {
-    # Reuse the lint variables to ensure that the lint version gets updated
-    # when the upstream SDK version is updated.
-    default_android_sdk_root = lint_android_sdk_root
-    default_android_sdk_version = lint_android_sdk_version
+    default_android_sdk_root = "//third_party/android_tools/sdk"
+    default_android_sdk_version = "23"
     default_android_sdk_build_tools_version = "23.0.1"
   }
 
+  if (!defined(default_lint_android_sdk_root)) {
+    default_lint_android_sdk_root = default_android_sdk_root
+    default_lint_android_sdk_version = default_android_sdk_version
+  }
+
   if (!defined(default_android_keystore_path)) {
     default_android_keystore_path =
         "//build/android/ant/chromium-debug.keystore"
@@ -70,14 +68,17 @@
   }
 
   declare_args() {
-    android_ndk_major_version = default_android_ndk_major_version
     android_ndk_root = default_android_ndk_root
     android_ndk_version = default_android_ndk_version
+    android_ndk_major_version = default_android_ndk_major_version
 
     android_sdk_root = default_android_sdk_root
     android_sdk_version = default_android_sdk_version
     android_sdk_build_tools_version = default_android_sdk_build_tools_version
 
+    lint_android_sdk_root = default_lint_android_sdk_root
+    lint_android_sdk_version = default_lint_android_sdk_version
+
     # Libc++ library directory. Override to use a custom libc++ binary.
     android_libcpp_lib_dir = ""
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 3d8912ff..57ea8fd 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2759,7 +2759,6 @@
   ScrollStateData scroll_state_data;
   scroll_state_data.position_x = viewport_point.x();
   scroll_state_data.position_y = viewport_point.y();
-  scroll_state_data.is_in_inertial_phase = true;
   ScrollState scroll_state(scroll_state_data);
 
   // ScrollAnimated is used for animated wheel scrolls. We find the first layer
@@ -2772,7 +2771,11 @@
     ScrollStateData scroll_state_end_data;
     scroll_state_end_data.is_ending = true;
     ScrollState scroll_state_end(scroll_state_end_data);
+    // TODO(Sahel): Once the touchpad scroll latching for Non-mac devices is
+    // implemented, the current scrolling layer should not get cleared after
+    // each animation (crbug.com/526463).
     ScrollEnd(&scroll_state_end);
+    ClearCurrentlyScrollingLayer();
   }
   return scroll_status;
 }
@@ -2857,7 +2860,6 @@
   ScrollStateData scroll_state_data;
   scroll_state_data.position_x = viewport_point.x();
   scroll_state_data.position_y = viewport_point.y();
-  scroll_state_data.is_in_inertial_phase = false;
   ScrollState scroll_state(scroll_state_data);
 
   // ScrollAnimated is used for animated wheel scrolls. We find the first layer
@@ -2896,7 +2898,7 @@
   }
   scroll_state.set_is_ending(true);
   // TODO(Sahel): Once the touchpad scroll latching for Non-mac devices is
-  // impelemented, the current scrolling layer should not get cleared after
+  // implemented, the current scrolling layer should not get cleared after
   // each animation (crbug.com/526463).
   ScrollEnd(&scroll_state);
   ClearCurrentlyScrollingLayer();
@@ -4137,7 +4139,7 @@
   ScrollStateData scroll_state_data;
   ScrollState scroll_state(scroll_state_data);
   // TODO(Sahel): Once the touchpad scroll latching for Non-mac devices is
-  // impelemented, the current scrolling layer should not get cleared after
+  // implemented, the current scrolling layer should not get cleared after
   // each animation (crbug.com/526463).
   ScrollEnd(&scroll_state);
   ClearCurrentlyScrollingLayer();
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 49aa906..ebc2201 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -10004,6 +10004,19 @@
   host_impl_->DidFinishImplFrame();
 }
 
+TEST_F(LayerTreeHostImplTest, SecondScrollAnimatedBeginNotIgnored) {
+  const gfx::Size content_size(1000, 1000);
+  const gfx::Size viewport_size(50, 100);
+  CreateBasicVirtualViewportLayers(viewport_size, content_size);
+
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_->ScrollAnimatedBegin(gfx::Point()).thread);
+
+  // The second ScrollAnimatedBegin should not get ignored.
+  EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD,
+            host_impl_->ScrollAnimatedBegin(gfx::Point()).thread);
+}
+
 // Verfify that a smooth scroll animation doesn't jump when UpdateTarget gets
 // called before the animation is started.
 TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) {
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 248d766..39e7a51 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -576,27 +576,38 @@
  public:
   void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl,
                                   const BeginFrameArgs& args) override {
+    // This code is run once, to trigger recreation of our OutputSurface.
+    if (has_recreated_)
+      return;
+
     // Ensure that our initialization expectations have completed.
     Mock::VerifyAndClearExpectations(mock_main_context_support_);
     Mock::VerifyAndClearExpectations(mock_worker_context_support_);
 
-    if (has_recreated_) {
-      // Destruction exptectations.
-      EXPECT_CALL(*mock_worker_context_support_,
-                  SetAggressivelyFreeResources(true));
-      EXPECT_CALL(*mock_main_context_support_,
-                  SetAggressivelyFreeResources(true));
-      EndTest();
-      return;
-    }
-    has_recreated_ = true;
-
     // Output surface lost expectations.
     EXPECT_CALL(*mock_worker_context_support_,
                 SetAggressivelyFreeResources(true));
     EXPECT_CALL(*mock_main_context_support_,
                 SetAggressivelyFreeResources(true));
     host_impl->DidLoseOutputSurface();
+    has_recreated_ = true;
+  }
+
+  void DidInitializeOutputSurface() override {
+    // This is run after we have recreated our OutputSurface.
+    if (!has_recreated_)
+      return;
+
+    // Ensure that our initialization expectations have completed.
+    Mock::VerifyAndClearExpectations(mock_main_context_support_);
+    Mock::VerifyAndClearExpectations(mock_worker_context_support_);
+
+    // Destruction exptectations.
+    EXPECT_CALL(*mock_worker_context_support_,
+                SetAggressivelyFreeResources(true));
+    EXPECT_CALL(*mock_main_context_support_,
+                SetAggressivelyFreeResources(true));
+    EndTest();
   }
 
  private:
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 1268872..0534fd0 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -173,7 +173,6 @@
         "//components/browser_watcher:browser_watcher_client",
         "//components/crash/content/app:run_as_crashpad_handler",
         "//components/flags_ui:switches",
-        "//components/startup_metric_utils/common",
         "//content:sandbox_helper_win",
         "//content/public/common:static_switches",
         "//crypto",
@@ -853,8 +852,8 @@
     # corresponding Widevine targets based on branding.
     bundle_data("widevine_cdm_library_binaries") {
       sources = [
-        "$root_out_dir/libwidevinecdm.dylib",
         "$root_out_dir/$widevine_cdm_path/widevinecdmadapter.plugin",
+        "$root_out_dir/libwidevinecdm.dylib",
       ]
       outputs = [
         "{{bundle_root_dir}}/Libraries/$widevine_cdm_path/{{source_file_part}}",
@@ -1261,7 +1260,6 @@
     ]
     deps = [
       "//base",
-      "//components/startup_metric_utils/common",
     ]
   }
 }
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index a374a2ca2..840ff97 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -540,15 +540,6 @@
             android:excludeFromRecents="true">
         </activity>
 
-        <!-- This activity is started along with IncognitoDocumentActivity, so it also must
-             disable hardware acceleration. Besides, it doesn't have any UI. -->
-        <activity android:name="org.chromium.chrome.browser.document.CipherKeyActivity"
-            android:launchMode="singleInstance"
-            android:theme="@android:style/Theme.Translucent.NoTitleBar"
-            android:excludeFromRecents="true"
-            android:hardwareAccelerated="false">
-        </activity>
-
         <!-- This activity is used to restart the main Chrome process.  Should never be exported. -->
         <activity android:name="org.chromium.chrome.browser.BrowserRestartActivity"
             android:launchMode="singleInstance"
diff --git a/chrome/android/java/res/layout/download_item_view.xml b/chrome/android/java/res/layout/download_item_view.xml
index 4926b7c..7c42c2d 100644
--- a/chrome/android/java/res/layout/download_item_view.xml
+++ b/chrome/android/java/res/layout/download_item_view.xml
@@ -20,14 +20,14 @@
 
         <ImageView
                 android:id="@+id/icon_view"
-                android:layout_width="48dp"
-                android:layout_height="48dp"
+                android:layout_width="@dimen/downloads_item_icon_size"
+                android:layout_height="@dimen/downloads_item_icon_size"
                 android:layout_alignParentStart="true"
                 android:layout_alignParentTop="true"
                 android:layout_alignParentBottom="true"
                 android:layout_marginEnd="16dp"
                 android:contentDescription="@null"
-                android:scaleType="centerInside"
+                android:scaleType="center"
                 android:background="@color/light_active_color" />
 
         <TextView
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 38a4b175..1bfb784 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -365,4 +365,7 @@
     <!-- Dialog dimensions.
          https://www.google.com/design/spec/components/dialogs.html#dialogs-simple-dialogs -->
     <dimen name="dialog_width_unit">56dp</dimen>  <!-- MD dialog widths are multiples of this. -->
+    
+    <!-- Downloads dimensions. -->
+    <dimen name="downloads_item_icon_size">48dp</dimen>
 </resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
index bff2727..c902e47 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -110,7 +110,10 @@
                 MenuItem offlineMenuItem = menu.findItem(R.id.offline_page_id);
                 if (offlineMenuItem != null) {
                     if (ChromeFeatureList.isEnabled("DownloadsUi")) {
-                        offlineMenuItem.setEnabled(!isChromeScheme && !isIncognito);
+                        boolean isValidTab = !currentTab.isOfflinePage()
+                                && !currentTab.isShowingErrorPage()
+                                && !currentTab.isShowingInterstitialPage();
+                        offlineMenuItem.setEnabled(!isChromeScheme && !isIncognito && isValidTab);
                         Drawable drawable = offlineMenuItem.getIcon();
                         if (drawable != null) {
                             int iconTint = ApiCompatibilityUtils.getColor(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java
index 9e16457..142c1f3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java
@@ -155,7 +155,6 @@
      *
      * This class must be used only on the UI thread.
      */
-    @UiThread
     private static class BookmarkLoader {
         private BookmarkLoaderCallback mCallback;
         private BookmarkFolder mFolder;
@@ -167,7 +166,8 @@
         private int mCornerRadius;
         private int mRemainingTaskCount;
 
-        BookmarkLoader(Context context, final BookmarkId folderId,
+        @UiThread
+        public void initialize(Context context, final BookmarkId folderId,
                 BookmarkLoaderCallback callback) {
             mCallback = callback;
 
@@ -193,6 +193,7 @@
             });
         }
 
+        @UiThread
         private void loadBookmarks(BookmarkId folderId) {
             mFolder = new BookmarkFolder();
 
@@ -229,6 +230,7 @@
             taskFinished();
         }
 
+        @UiThread
         private void loadFavicon(final Bookmark bookmark) {
             if (bookmark.isFolder) return;
 
@@ -250,6 +252,7 @@
             mLargeIconBridge.getLargeIconForUrl(bookmark.url, mMinIconSizeDp, callback);
         }
 
+        @UiThread
         private void taskFinished() {
             mRemainingTaskCount--;
             if (mRemainingTaskCount == 0) {
@@ -258,6 +261,7 @@
             }
         }
 
+        @UiThread
         private void destroy() {
             mBookmarkModel.destroy();
             mLargeIconBridge.destroy();
@@ -377,10 +381,13 @@
         @BinderThread
         private BookmarkFolder loadBookmarks(final BookmarkId folderId) {
             final LinkedBlockingQueue<BookmarkFolder> resultQueue = new LinkedBlockingQueue<>(1);
+            //A reference of BookmarkLoader is needed in binder thread to
+            //prevent it from being garbage collected.
+            final BookmarkLoader bookmarkLoader = new BookmarkLoader();
             ThreadUtils.runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
-                    new BookmarkLoader(mContext, folderId, new BookmarkLoaderCallback() {
+                    bookmarkLoader.initialize(mContext, folderId, new BookmarkLoaderCallback() {
                         @Override
                         public void onBookmarksLoaded(BookmarkFolder folder) {
                             resultQueue.add(folder);
@@ -423,7 +430,20 @@
         @BinderThread
         @Override
         public int getCount() {
-            if (mCurrentFolder == null) return 0;
+            //On some Sony devices, getCount() could be called before onDatasetChanged()
+            //returns. If it happens, refresh widget until the bookmarks are all loaded.
+            if (mCurrentFolder == null || !mPreferences.getString(PREF_CURRENT_FOLDER, "")
+                    .equals(mCurrentFolder.folder.id.toString())) {
+                ThreadUtils.runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        refreshWidget();
+                    }
+                });
+            }
+            if (mCurrentFolder == null) {
+                return 0;
+            }
             return mCurrentFolder.children.size() + (mCurrentFolder.parent != null ? 1 : 0);
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/CrashFileManager.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/CrashFileManager.java
index beb9c71..922ec5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/CrashFileManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/CrashFileManager.java
@@ -12,6 +12,10 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -28,7 +32,7 @@
 
     // This should mirror the C++ CrashUploadList::kReporterLogFilename variable.
     @VisibleForTesting
-    static final String CRASH_DUMP_LOGFILE = CRASH_DUMP_DIR + "/uploads.log";
+    static final String CRASH_DUMP_LOGFILE = "uploads.log";
 
     private static final Pattern MINIDUMP_FIRST_TRY_PATTERN =
             Pattern.compile("\\.dmp([0-9]*)$\\z");
@@ -52,6 +56,17 @@
 
     private static final Pattern TMP_PATTERN = Pattern.compile("\\.tmp\\z");
 
+    // The maximum number of non-uploaded crashes that may be kept in the crash reports directory.
+    // Chosen to attempt to balance between keeping a generous number of crashes, and not using up
+    // too much filesystem storage space for obsolete crash reports.
+    @VisibleForTesting
+    protected static final int MAX_CRASH_REPORTS_TO_KEEP = 10;
+
+    // The maximum age, in days, considered acceptable for a crash report. Reports older than this
+    // age will be removed. The constant is chosen to be quite conservative, while still allowing
+    // users to eventually reclaim filesystem storage space from obsolete crash reports.
+    private static final int MAX_CRASH_REPORT_AGE_IN_DAYS = 30;
+
     /**
      * Comparator used for sorting files by modification
      * Note that the behavior is undecided if the files are created at the same time
@@ -188,6 +203,18 @@
         return minidumps;
     }
 
+    @VisibleForTesting
+    protected File[] getAllFilesSorted() {
+        File crashDir = getCrashDirectoryIfExists();
+        if (crashDir == null) {
+            return new File[] {};
+        }
+
+        File[] files = crashDir.listFiles();
+        Arrays.sort(files, sFileComparator);
+        return files;
+    }
+
     public void cleanOutAllNonFreshMinidumpFiles() {
         for (File f : getAllUploadedFiles()) {
             deleteFile(f);
@@ -195,20 +222,42 @@
         for (File f : getAllTempFiles()) {
             deleteFile(f);
         }
+
+        Set<String> recentCrashes = new HashSet<String>();
+        for (File f : getAllFilesSorted()) {
+            // The uploads.log file should always be preserved, as it stores the metadata that
+            // powers the chrome://crashes UI.
+            if (f.getName().equals(CRASH_DUMP_LOGFILE)) {
+                continue;
+            }
+
+            // Delete any crash reports that are especially old.
+            long ageInMillis = new Date().getTime() - f.lastModified();
+            long ageInDays = TimeUnit.DAYS.convert(ageInMillis, TimeUnit.MILLISECONDS);
+            if (ageInDays > MAX_CRASH_REPORT_AGE_IN_DAYS) {
+                deleteFile(f);
+                continue;
+            }
+
+            // Delete the oldest crash reports that exceed the cap on the number of allowed reports.
+            // Each crash typically has two files associated with it: a .dmp file and a .logcat
+            // file. These have the same filename other than the file extension.
+            String fileNameSansExtension = f.getName().split("\\.")[0];
+            if (recentCrashes.size() < MAX_CRASH_REPORTS_TO_KEEP) {
+                recentCrashes.add(fileNameSansExtension);
+            } else if (!recentCrashes.contains(fileNameSansExtension)) {
+                deleteFile(f);
+            }
+        }
     }
 
     @VisibleForTesting
     File[] getMatchingFiles(final Pattern pattern) {
-        // Get dump dir and get all files with specified suffix.. The path
+        // Get dump dir and get all files with specified suffix. The path
         // constructed here must match chrome_paths.cc (see case
         // chrome::DIR_CRASH_DUMPS).
-        File crashDir = getCrashDirectory();
-        if (!crashDir.exists()) {
-            Log.w(TAG, crashDir.getAbsolutePath() + " does not exist!");
-            return new File[] {};
-        }
-        if (!crashDir.isDirectory()) {
-            Log.w(TAG, crashDir.getAbsolutePath() + " is not a directory!");
+        File crashDir = getCrashDirectoryIfExists();
+        if (crashDir == null) {
             return new File[] {};
         }
         File[] minidumps = crashDir.listFiles(new FilenameFilter() {
@@ -232,6 +281,20 @@
         return new File(mCacheDir, CRASH_DUMP_DIR);
     }
 
+    @VisibleForTesting
+    File getCrashDirectoryIfExists() {
+        File crashDirectory = getCrashDirectory();
+        if (!crashDirectory.exists()) {
+            Log.w(TAG, crashDirectory.getAbsolutePath() + " does not exist!");
+            return null;
+        }
+        if (!crashDirectory.isDirectory()) {
+            Log.w(TAG, crashDirectory.getAbsolutePath() + " is not a directory!");
+            return null;
+        }
+        return crashDirectory;
+    }
+
     public File createNewTempFile(String name) throws IOException {
         File f = new File(getCrashDirectory(), name);
         if (f.exists()) {
@@ -250,7 +313,7 @@
     }
 
     File getCrashUploadLogFile() {
-        return new File(mCacheDir, CRASH_DUMP_LOGFILE);
+        return new File(getCrashDirectory(), CRASH_DUMP_LOGFILE);
     }
 
     private File[] getAllTempFiles() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpDirectoryObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpDirectoryObserver.java
index fae73c0..6706a3d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpDirectoryObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpDirectoryObserver.java
@@ -24,8 +24,6 @@
     private static final String TAG = "MinidumpDirObserver";
     private static Context sContext = ContextUtils.getApplicationContext();
 
-    public static final String MINIDUMP_EXPERIMENT_NAME = "MinidumpDirectoryObserver";
-
     public MinidumpDirectoryObserver() {
         // The file observer detects MOVED_TO for child processes.
         super(new File(PathUtils.getCacheDirectory(sContext),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index 6544d5d..379023e4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -58,7 +58,6 @@
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
 import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
-import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
 import org.chromium.chrome.browser.toolbar.ToolbarControlContainer;
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.browser.util.FeatureUtilities;
@@ -264,11 +263,8 @@
     @Override
     public void postInflationStartup() {
         super.postInflationStartup();
-        // TODO(tedchoc): Replace with an actual CCT implementation for the persistence policy.
-        //                Currently, this relies on checks for CUSTOM_TABS_SELECTOR_INDEX in the
-        //                main TabPersitentStore that ignores certain actions.
-        TabPersistencePolicy persistencePolicy = new TabbedModeTabPersistencePolicy(
-                this, TabModelSelectorImpl.CUSTOM_TABS_SELECTOR_INDEX);
+        TabPersistencePolicy persistencePolicy = new CustomTabTabPersistencePolicy(
+                getTaskId(), getSavedInstanceState() != null);
         setTabModelSelector(new TabModelSelectorImpl(
                 this, persistencePolicy, getWindowAndroid(), false));
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java
new file mode 100644
index 0000000..f3ea43ad
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java
@@ -0,0 +1,387 @@
+// 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.
+
+package org.chromium.chrome.browser.customtabs;
+
+import android.app.Activity;
+import android.os.AsyncTask;
+import android.os.StrictMode;
+import android.util.Pair;
+import android.util.SparseBooleanArray;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.Callback;
+import org.chromium.base.Log;
+import org.chromium.base.StreamUtil;
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.TabState;
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.tabmodel.TabModel;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+
+import javax.annotation.Nullable;
+
+/**
+ * Handles the Custom Tab specific behaviors of tab persistence.
+ */
+public class CustomTabTabPersistencePolicy implements TabPersistencePolicy {
+
+    static final String SAVED_STATE_DIRECTORY = "custom_tabs";
+
+    /** Threshold where old state files should be deleted (30 days). */
+    protected static final long STATE_EXPIRY_THRESHOLD = 30L * 24 * 60 * 60 * 1000;
+
+    /** Maximum number of state files before we should start deleting old ones. */
+    protected static final int MAXIMUM_STATE_FILES = 30;
+
+    private static final String TAG = "tabmodel";
+
+    /** Prevents two state directories from getting created simultaneously. */
+    private static final Object DIR_CREATION_LOCK = new Object();
+
+    /**
+     * Prevents two clean up tasks from getting created simultaneously. Also protects against
+     * incorrectly interleaving create/run/cancel on the task.
+     */
+    private static final Object CLEAN_UP_TASK_LOCK = new Object();
+
+    private static File sStateDirectory;
+    private static AsyncTask<Void, Void, Void> sCleanupTask;
+
+    /**
+     * The folder where the state should be saved to.
+     * @return A file representing the directory that contains TabModelSelector states.
+     */
+    public static File getOrCreateCustomTabModeStateDirectory() {
+        synchronized (DIR_CREATION_LOCK) {
+            if (sStateDirectory == null) {
+                sStateDirectory = new File(
+                        TabPersistentStore.getOrCreateBaseStateDirectory(), SAVED_STATE_DIRECTORY);
+                StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
+                StrictMode.allowThreadDiskWrites();
+                try {
+                    if (!sStateDirectory.exists() && !sStateDirectory.mkdirs()) {
+                        Log.e(TAG, "Failed to create state folder: " + sStateDirectory);
+                    }
+                } finally {
+                    StrictMode.setThreadPolicy(oldPolicy);
+                }
+            }
+        }
+        return sStateDirectory;
+    }
+
+    private final int mTaskId;
+    private final boolean mShouldRestore;
+
+    private AsyncTask<Void, Void, Void> mInitializationTask;
+    private boolean mDestroyed;
+
+    /**
+     * Constructs a persistence policy for a given Custom Tab.
+     *
+     * @param taskId The task ID that the owning Custom Tab is in.
+     * @param shouldRestore Whether an attempt to restore tab state information should be done on
+     *                      startup.
+     */
+    public CustomTabTabPersistencePolicy(int taskId, boolean shouldRestore) {
+        mTaskId = taskId;
+        mShouldRestore = shouldRestore;
+    }
+
+    @Override
+    public File getOrCreateStateDirectory() {
+        return getOrCreateCustomTabModeStateDirectory();
+    }
+
+    @Override
+    public String getStateFileName() {
+        return TabPersistentStore.getStateFileName(Integer.toString(mTaskId));
+    }
+
+    @Override
+    @Nullable
+    public String getStateToBeMergedFileName() {
+        return null;
+    }
+
+    @Override
+    public boolean performInitialization(Executor executor) {
+        mInitializationTask = new AsyncTask<Void, Void, Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                File stateDir = getOrCreateStateDirectory();
+                File metadataFile = new File(stateDir, getStateFileName());
+                if (metadataFile.exists()) {
+                    if (mShouldRestore) {
+                        if (!metadataFile.setLastModified(System.currentTimeMillis())) {
+                            Log.e(TAG, "Unable to update last modified time: " + metadataFile);
+                        }
+                    } else {
+                        if (!metadataFile.delete()) {
+                            Log.e(TAG, "Failed to delete file: " + metadataFile);
+                        }
+                    }
+                }
+                return null;
+            }
+        }.executeOnExecutor(executor);
+
+        return true;
+    }
+
+    @Override
+    public void waitForInitializationToFinish() {
+        if (mInitializationTask == null) return;
+        try {
+            mInitializationTask.get();
+        } catch (InterruptedException | ExecutionException e) {
+            // Ignore and proceed.
+        }
+    }
+
+    @Override
+    public boolean isMergeInProgress() {
+        return false;
+    }
+
+    @Override
+    public void setMergeInProgress(boolean isStarted) {
+        assert false : "Merge not supported in Custom Tabs";
+    }
+
+    @Override
+    public void cancelCleanupInProgress() {
+        synchronized (CLEAN_UP_TASK_LOCK) {
+            if (sCleanupTask != null) sCleanupTask.cancel(true);
+        }
+    }
+
+    @Override
+    public void cleanupUnusedFiles(Callback<List<String>> filesToDelete) {
+        synchronized (CLEAN_UP_TASK_LOCK) {
+            if (sCleanupTask != null) sCleanupTask.cancel(true);
+            sCleanupTask = new CleanUpTabStateDataTask(filesToDelete);
+            sCleanupTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        }
+    }
+
+    @Override
+    public void setTabContentManager(TabContentManager cache) {
+    }
+
+    @Override
+    public void destroy() {
+        mDestroyed = true;
+    }
+
+    /**
+     * Given a list of metadata files, determine which are applicable for deletion based on the
+     * deletion strategy of Custom Tabs.
+     *
+     * @param currentTimeMillis The current time in milliseconds
+     *                          ({@link System#currentTimeMillis()}.
+     * @param allMetadataFiles The complete list of all metadata files to check.
+     * @return The list of metadata files that are applicable for deletion.
+     */
+    protected static List<File> getMetadataFilesForDeletion(
+            long currentTimeMillis, List<File> allMetadataFiles) {
+        Collections.sort(allMetadataFiles, new Comparator<File>() {
+            @Override
+            public int compare(File lhs, File rhs) {
+                long lhsModifiedTime = lhs.lastModified();
+                long rhsModifiedTime = rhs.lastModified();
+
+                // Sort such that older files (those with an lower timestamp number) are at the
+                // end of the sorted listed.
+                return ApiCompatibilityUtils.compareLong(rhsModifiedTime, lhsModifiedTime);
+            }
+        });
+
+        List<File> stateFilesApplicableForDeletion = new ArrayList<File>();
+        for (int i = 0; i < allMetadataFiles.size(); i++) {
+            File file = allMetadataFiles.get(i);
+            long fileAge = currentTimeMillis - file.lastModified();
+            if (i >= MAXIMUM_STATE_FILES || fileAge >= STATE_EXPIRY_THRESHOLD) {
+                stateFilesApplicableForDeletion.add(file);
+            }
+        }
+        return stateFilesApplicableForDeletion;
+    }
+
+    /**
+     * Get all current Tab IDs used by the specified activity.
+     *
+     * @param activity The activity whose tab IDs are to be collected from.
+     * @param tabIds Where the tab IDs should be added to.
+     */
+    private static void getAllTabIdsForActivity(CustomTabActivity activity, Set<Integer> tabIds) {
+        if (activity == null) return;
+        TabModelSelector selector = activity.getTabModelSelector();
+        if (selector == null) return;
+        List<TabModel> models = selector.getModels();
+        for (int i = 0; i < models.size(); i++) {
+            TabModel model = models.get(i);
+            for (int j = 0; j < model.getCount(); j++) {
+                tabIds.add(model.getTabAt(j).getId());
+            }
+        }
+    }
+
+    /**
+     * Gathers all of the tab IDs and task IDs for all currently live Custom Tabs.
+     *
+     * @param liveTabIds Where tab IDs will be added.
+     * @param liveTaskIds Where task IDs will be added.
+     */
+    protected static void getAllLiveTabAndTaskIds(
+            Set<Integer> liveTabIds, Set<Integer> liveTaskIds) {
+        ThreadUtils.assertOnUiThread();
+
+        List<WeakReference<Activity>> activities = ApplicationStatus.getRunningActivities();
+        for (int i = 0; i < activities.size(); i++) {
+            Activity activity = activities.get(i).get();
+            if (activity == null) continue;
+            if (!(activity instanceof CustomTabActivity)) continue;
+            getAllTabIdsForActivity((CustomTabActivity) activity, liveTabIds);
+            liveTaskIds.add(activity.getTaskId());
+        }
+    }
+
+    private class CleanUpTabStateDataTask extends AsyncTask<Void, Void, Void> {
+        private final Callback<List<String>> mFilesToDeleteCallback;
+
+        private Set<Integer> mUnreferencedTabIds;
+        private List<File> mDeletableMetadataFiles;
+        private Map<File, SparseBooleanArray> mTabIdsByMetadataFile;
+
+        CleanUpTabStateDataTask(Callback<List<String>> filesToDelete) {
+            mFilesToDeleteCallback = filesToDelete;
+        }
+
+        @Override
+        protected Void doInBackground(Void... voids) {
+            if (mDestroyed) return null;
+
+            mTabIdsByMetadataFile = new HashMap<>();
+            mUnreferencedTabIds = new HashSet<>();
+
+            File[] stateFiles = getOrCreateStateDirectory().listFiles();
+            if (stateFiles == null) return null;
+
+            Set<Integer> allTabIds = new HashSet<>();
+            Set<Integer> allReferencedTabIds = new HashSet<>();
+            List<File> metadataFiles = new ArrayList<>();
+            for (File file : stateFiles) {
+                if (TabPersistentStore.isStateFile(file.getName())) {
+                    metadataFiles.add(file);
+
+                    SparseBooleanArray tabIds = new SparseBooleanArray();
+                    mTabIdsByMetadataFile.put(file, tabIds);
+                    getTabsFromStateFile(tabIds, file);
+                    for (int i = 0; i < tabIds.size(); i++) {
+                        allReferencedTabIds.add(tabIds.keyAt(i));
+                    }
+                    continue;
+                }
+
+                Pair<Integer, Boolean> tabInfo = TabState.parseInfoFromFilename(file.getName());
+                if (tabInfo == null) continue;
+                allTabIds.add(tabInfo.first);
+            }
+
+            mUnreferencedTabIds.addAll(allTabIds);
+            mUnreferencedTabIds.removeAll(allReferencedTabIds);
+
+            mDeletableMetadataFiles = getMetadataFilesForDeletion(
+                    System.currentTimeMillis(), metadataFiles);
+            return null;
+        }
+
+        @Override
+        protected void onPostExecute(Void unused) {
+            List<String> filesToDelete = new ArrayList<>();
+            if (mDestroyed) {
+                mFilesToDeleteCallback.onResult(filesToDelete);
+                return;
+            }
+
+            if (mUnreferencedTabIds.isEmpty() && mDeletableMetadataFiles.isEmpty()) {
+                mFilesToDeleteCallback.onResult(filesToDelete);
+                return;
+            }
+
+            Set<Integer> liveTabIds = new HashSet<>();
+            Set<Integer> liveTaskIds = new HashSet<>();
+            getAllLiveTabAndTaskIds(liveTabIds, liveTaskIds);
+
+            for (Integer unreferencedTabId : mUnreferencedTabIds) {
+                // Ignore tabs that are referenced by live activities as they might not have been
+                // able to write out their state yet.
+                if (liveTabIds.contains(unreferencedTabId)) continue;
+
+                // The tab state is not referenced by any current activities or any metadata files,
+                // so mark it for deletion.
+                filesToDelete.add(TabState.getTabStateFilename(unreferencedTabId, false));
+            }
+
+            for (int i = 0; i < mDeletableMetadataFiles.size(); i++) {
+                File metadataFile = mDeletableMetadataFiles.get(i);
+                String id = TabPersistentStore.getStateFileUniqueId(metadataFile.getName());
+                try {
+                    int taskId = Integer.parseInt(id);
+
+                    // Ignore the metadata file if it belongs to a currently live CustomTabActivity.
+                    if (liveTaskIds.contains(taskId)) continue;
+
+                    filesToDelete.add(metadataFile.getName());
+
+                    SparseBooleanArray unusedTabIds = mTabIdsByMetadataFile.get(metadataFile);
+                    if (unusedTabIds == null) continue;
+                    for (int j = 0; j < unusedTabIds.size(); j++) {
+                        filesToDelete.add(TabState.getTabStateFilename(
+                                unusedTabIds.keyAt(j), false));
+                    }
+                } catch (NumberFormatException ex) {
+                    assert false : "Unexpected tab metadata file found: " + metadataFile.getName();
+                    continue;
+                }
+            }
+
+            mFilesToDeleteCallback.onResult(filesToDelete);
+        }
+
+        private void getTabsFromStateFile(SparseBooleanArray tabIds, File metadataFile) {
+            DataInputStream stream = null;
+            try {
+                stream = new DataInputStream(
+                        new BufferedInputStream(new FileInputStream(metadataFile)));
+                TabPersistentStore.readSavedStateFile(stream, null, tabIds, false);
+            } catch (Exception e) {
+                Log.e(TAG, "Unable to read state for " + metadataFile.getName() + ": " + e);
+            } finally {
+                StreamUtil.closeQuietly(stream);
+            }
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/document/CipherKeyActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/document/CipherKeyActivity.java
deleted file mode 100644
index 0302290..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/document/CipherKeyActivity.java
+++ /dev/null
@@ -1,74 +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.
-
-package org.chromium.chrome.browser.document;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-
-import org.chromium.content.browser.crypto.CipherFactory;
-
-/**
- * An activity responsible for retaining the incognito cipher key for the duration of an incognito
- * session. The activity gets brought forward for two reasons: to restore the cipher key before a
- * new incognito window is launched or to save the current cipher key. If brought forward to
- * restore, the activity is passed an intent and options to call after the restore process is
- * complete. Otherwise the activity just puts itself in background causing onSaveInstanceState to
- * get called and save the cipher keys to the activity's bundle.
- */
-public class CipherKeyActivity extends Activity {
-
-    /**
-     * An intent name for specifying the next intent to invoke.
-     */
-    public static final String FORWARD_INTENT = "forward_intent";
-
-    /**
-     * An options Bundle to use with intent specified by "forward_intent".
-     */
-    public static final String FORWARD_OPTIONS = "forward_options";
-
-    /**
-     * Generates an intent to {@link CipherKeyActivity} to restore cipher keys from the bundle
-     * if possible.
-     * @param context The context to use.
-     * @param forwardIntent The intent cipher key activity will call when it's done.
-     * @param options The options to pass into startActivity call of the forward intent.
-     * @return The intent.
-     */
-    public static Intent createIntent(Context context, Intent forwardIntent, Bundle options) {
-        Intent intent = new Intent(context, CipherKeyActivity.class);
-        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        if (forwardIntent != null) intent.putExtra(FORWARD_INTENT, forwardIntent);
-        if (options != null) intent.putExtra(FORWARD_OPTIONS, options);
-        return intent;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (savedInstanceState != null) {
-            CipherFactory.getInstance().restoreFromBundle(savedInstanceState);
-        }
-        Intent nextIntent = (Intent) getIntent().getParcelableExtra(FORWARD_INTENT);
-        if (nextIntent != null) {
-            startActivity(nextIntent, (Bundle) getIntent().getParcelableExtra(FORWARD_OPTIONS));
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        moveTaskToBack(true);
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        CipherFactory.getInstance().saveToBundle(outState);
-    }
-
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java
index 360eacd..0616ab6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/BackendProvider.java
@@ -7,6 +7,7 @@
 import android.content.ComponentName;
 import android.support.annotation.Nullable;
 
+import org.chromium.chrome.browser.download.DownloadManagerService;
 import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
 import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadItem;
 import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
@@ -63,6 +64,12 @@
     /** Returns the {@link OfflinePageDelegate} that works with the Offline Pages backend. */
     OfflinePageDelegate getOfflinePageBridge();
 
+    /** Returns the {@link ThumbnailProvider} that gets thumbnails for files. */
+    ThumbnailProvider getThumbnailProvider();
+
     /** Returns the {@link SelectionDelegate} that tracks selected items. */
     SelectionDelegate<DownloadHistoryItemWrapper> getSelectionDelegate();
+
+    /** Destroys the BackendProvider. */
+    void destroy();
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
index 0c75739..d70eb81 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadHistoryAdapter.java
@@ -6,6 +6,8 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.text.TextUtils;
@@ -16,6 +18,8 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
@@ -41,12 +45,14 @@
 public class DownloadHistoryAdapter extends DateDividedAdapter implements DownloadUiObserver {
 
     /** Holds onto a View that displays information about a downloaded file. */
-    public static class ItemViewHolder extends RecyclerView.ViewHolder {
+    public static class ItemViewHolder
+            extends RecyclerView.ViewHolder implements ThumbnailProvider.ThumbnailRequest {
         public DownloadItemView mItemView;
         public ImageView mIconView;
         public TextView mFilenameView;
         public TextView mHostnameView;
         public TextView mFilesizeView;
+        public DownloadHistoryItemWrapper mItem;
 
         public ItemViewHolder(View itemView) {
             super(itemView);
@@ -59,6 +65,20 @@
             mHostnameView = (TextView) itemView.findViewById(R.id.hostname_view);
             mFilesizeView = (TextView) itemView.findViewById(R.id.filesize_view);
         }
+
+        @Override
+        public String getFilePath() {
+            return mItem == null ? null : mItem.getFilePath();
+        }
+
+        @Override
+        public void onThumbnailRetrieved(String filePath, Bitmap thumbnail) {
+            if (TextUtils.equals(getFilePath(), filePath) && thumbnail != null
+                    && thumbnail.getWidth() != 0 && thumbnail.getHeight() != 0) {
+                mIconView.setBackground(null);
+                mIconView.setImageBitmap(thumbnail);
+            }
+        }
     }
 
     /** See {@link #findItemIndex}. */
@@ -89,6 +109,7 @@
     private final boolean mShowOffTheRecord;
     private final LoadingStateDelegate mLoadingDelegate;
 
+    private int mIconBackgroundColor;
     private BackendProvider mBackendProvider;
     private OfflinePageDownloadBridge.Observer mOfflinePageObserver;
     private int mFilter = DownloadFilter.FILTER_ALL;
@@ -96,8 +117,14 @@
     DownloadHistoryAdapter(boolean showOffTheRecord, ComponentName parentComponent) {
         mShowOffTheRecord = showOffTheRecord;
         mParentComponent = parentComponent;
-        setHasStableIds(true);
         mLoadingDelegate = new LoadingStateDelegate(mShowOffTheRecord);
+
+        Resources resources = ContextUtils.getApplicationContext().getResources();
+        mIconBackgroundColor =
+                ApiCompatibilityUtils.getColor(resources, R.color.light_active_color);
+
+        // Using stable IDs allows the RecyclerView to animate changes.
+        setHasStableIds(true);
     }
 
     public void initialize(BackendProvider provider) {
@@ -164,13 +191,9 @@
     public long getTotalDownloadSize() {
         long totalSize = 0;
         for (DownloadHistoryItemWrapper wrapper : mDownloadItems) {
-            assert wrapper instanceof DownloadItemWrapper;
-            DownloadItemWrapper downloadWrapper = (DownloadItemWrapper) wrapper;
             totalSize += wrapper.getFileSize();
         }
         for (DownloadHistoryItemWrapper wrapper : mDownloadOffTheRecordItems) {
-            assert wrapper instanceof DownloadItemWrapper;
-            DownloadItemWrapper downloadWrapper = (DownloadItemWrapper) wrapper;
             totalSize += wrapper.getFileSize();
         }
         for (DownloadHistoryItemWrapper wrapper : mOfflinePageItems) {
@@ -194,9 +217,14 @@
 
     @Override
     public void bindViewHolderForTimedItem(ViewHolder current, TimedItem timedItem) {
+        ThumbnailProvider thumbnailProvider = mBackendProvider.getThumbnailProvider();
         final DownloadHistoryItemWrapper item = (DownloadHistoryItemWrapper) timedItem;
 
         ItemViewHolder holder = (ItemViewHolder) current;
+
+        // Cancel any previous request for a thumbnail that was to be displayed in this holder.
+        thumbnailProvider.cancelRetrieval(holder);
+
         Context context = holder.mFilesizeView.getContext();
         holder.mFilenameView.setText(item.getDisplayFileName());
         holder.mHostnameView.setText(
@@ -204,9 +232,17 @@
         holder.mFilesizeView.setText(
                 Formatter.formatFileSize(context, item.getFileSize()));
         holder.mItemView.initialize(item);
+        holder.mItem = item;
+
+        // Asynchronously grab a thumbnail for the file if it might have one.
+        int fileType = item.getFilterType();
+        if (fileType == DownloadFilter.FILTER_IMAGE) {
+            thumbnailProvider.getThumbnail(holder);
+        } else {
+            // TODO(dfalcantara): Get thumbnails for audio and video files when possible.
+        }
 
         // Pick what icon to display for the item.
-        int fileType = item.getFilterType();
         int iconResource = R.drawable.ic_drive_file_white_24dp;
         switch (fileType) {
             case DownloadFilter.FILTER_PAGE:
@@ -226,7 +262,7 @@
                 break;
             default:
         }
-
+        holder.mIconView.setBackgroundColor(mIconBackgroundColor);
         holder.mIconView.setImageResource(iconResource);
     }
 
@@ -438,6 +474,7 @@
     private Map<String, Boolean> getExternallyDeletedItemsMap(boolean isOffTheRecord) {
         return isOffTheRecord ? sExternallyDeletedOffTheRecordItems : sExternallyDeletedItems;
     }
+
     /**
      * Determines when the data from all of the backends has been loaded.
      * <p>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
index fb0c5e9..cd5ac30 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
@@ -7,6 +7,7 @@
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Intent;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.StrictMode;
 import android.support.v4.view.GravityCompat;
@@ -75,11 +76,16 @@
     private static class DownloadBackendProvider implements BackendProvider {
         private OfflinePageDownloadBridge mOfflinePageBridge;
         private SelectionDelegate<DownloadHistoryItemWrapper> mSelectionDelegate;
+        private ThumbnailProvider mThumbnailProvider;
 
         DownloadBackendProvider() {
+            Resources resources = ContextUtils.getApplicationContext().getResources();
+            int iconSize = resources.getDimensionPixelSize(R.dimen.downloads_item_icon_size);
+
             mOfflinePageBridge = new OfflinePageDownloadBridge(
                     Profile.getLastUsedProfile().getOriginalProfile());
             mSelectionDelegate = new SelectionDelegate<DownloadHistoryItemWrapper>();
+            mThumbnailProvider = new ThumbnailProviderImpl(iconSize);
         }
 
         @Override
@@ -94,9 +100,22 @@
         }
 
         @Override
+        public ThumbnailProvider getThumbnailProvider() {
+            return mThumbnailProvider;
+        }
+
+        @Override
         public SelectionDelegate<DownloadHistoryItemWrapper> getSelectionDelegate() {
             return mSelectionDelegate;
         }
+
+        @Override
+        public void destroy() {
+            getOfflinePageBridge().destroy();
+
+            mThumbnailProvider.destroy();
+            mThumbnailProvider = null;
+        }
     }
 
     private static final String TAG = "download_ui";
@@ -211,7 +230,7 @@
             removeObserver(observer);
         }
 
-        mBackendProvider.getOfflinePageBridge().destroy();
+        mBackendProvider.destroy();
 
         mHistoryAdapter.unregisterAdapterDataObserver(mAdapterObserver);
         mHistoryAdapter.unregisterAdapterDataObserver(mSpaceDisplay);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OWNERS
new file mode 100644
index 0000000..5a46910
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/OWNERS
@@ -0,0 +1,3 @@
+dfalcantara@chromium.org
+twellington@chromium.org
+ianwen@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProvider.java
new file mode 100644
index 0000000..3ef3b466
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProvider.java
@@ -0,0 +1,31 @@
+// 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.
+
+package org.chromium.chrome.browser.download.ui;
+
+import android.graphics.Bitmap;
+
+/** Provides thumbnails that represent different files. */
+public interface ThumbnailProvider {
+    /** Used to request the retrieval of a thumbnail. */
+    public static interface ThumbnailRequest {
+        /** Local storage path to the file. */
+        String getFilePath();
+
+        /** Called when a thumbnail is ready. */
+        void onThumbnailRetrieved(String filePath, Bitmap thumbnail);
+    }
+
+    /** Destroys the class. */
+    void destroy();
+
+    /**
+     * Asynchronously returns a thumbnail via {@link ThumbnailRequest#onThumbnailRetrieved}.
+     * @param request Parameters that describe the thumbnail being retrieved.
+     */
+    void getThumbnail(ThumbnailRequest request);
+
+    /** Removes a particular request from the pending queue. */
+    void cancelRetrieval(ThumbnailRequest request);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java
new file mode 100644
index 0000000..7b75280
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java
@@ -0,0 +1,141 @@
+// 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.
+
+package org.chromium.chrome.browser.download.ui;
+
+import android.graphics.Bitmap;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.v4.util.LruCache;
+import android.text.TextUtils;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.annotations.CalledByNative;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayDeque;
+import java.util.Deque;
+
+/**
+ * Concrete implementation of {@link ThumbnailProvider}.
+ *
+ * Thumbnails are cached and shared across all ThumbnailProviderImpls.  The cache itself is LRU and
+ * limited in size.  It is automatically garbage collected under memory pressure.
+ *
+ * A queue of requests is maintained in FIFO order.  Missing thumbnails are retrieved asynchronously
+ * by the native ThumbnailProvider, which is owned and destroyed by the Java class.
+ *
+ * TODO(dfalcantara): Figure out how to send requests simultaneously to the utility process without
+ *                    duplicating work to decode the same image for two different requests.
+ */
+public class ThumbnailProviderImpl implements ThumbnailProvider {
+    /** 5 MB of thumbnails should be enough for everyone. */
+    private static final int MAX_CACHE_BYTES = 5 * 1024 * 1024;
+
+    /** Weakly referenced cache containing thumbnails that can be deleted under memory pressure. */
+    private static WeakReference<LruCache<String, Bitmap>> sBitmapCache = new WeakReference<>(null);
+
+    /** Enqueues requests. */
+    private final Handler mHandler;
+
+    /** Maximum size in pixels of the smallest side of the thumbnail. */
+    private final int mIconSizePx;
+
+    /** Queue of files to retrieve thumbnails for. */
+    private final Deque<ThumbnailRequest> mRequestQueue;
+
+    /** The native side pointer that is owned and destroyed by the Java class. */
+    private long mNativeThumbnailProvider;
+
+    /** Request that is currently having its thumbnail retrieved. */
+    private ThumbnailRequest mCurrentRequest;
+
+    public ThumbnailProviderImpl(int iconSizePx) {
+        mIconSizePx = iconSizePx;
+        mHandler = new Handler(Looper.getMainLooper());
+        mRequestQueue = new ArrayDeque<>();
+        mNativeThumbnailProvider = nativeInit();
+    }
+
+    @Override
+    public void destroy() {
+        ThreadUtils.assertOnUiThread();
+        nativeDestroy(mNativeThumbnailProvider);
+        mNativeThumbnailProvider = 0;
+    }
+
+    @Override
+    public void getThumbnail(ThumbnailRequest request) {
+        String filePath = request.getFilePath();
+        if (TextUtils.isEmpty(filePath)) return;
+
+        mRequestQueue.offer(request);
+        processQueue();
+    }
+
+    /** Removes a particular file from the pending queue. */
+    @Override
+    public void cancelRetrieval(ThumbnailRequest request) {
+        if (mRequestQueue.contains(request)) mRequestQueue.remove(request);
+    }
+
+    private void processQueue() {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                processNextRequest();
+            }
+        });
+    }
+
+    private void processNextRequest() {
+        if (!isInitialized() || mCurrentRequest != null || mRequestQueue.isEmpty()) return;
+
+        mCurrentRequest = mRequestQueue.poll();
+        String currentFilePath = mCurrentRequest.getFilePath();
+
+        Bitmap cachedBitmap = getBitmapCache().get(currentFilePath);
+        if (cachedBitmap == null) {
+            // Asynchronously process the file to make a thumbnail.
+            nativeRetrieveThumbnail(mNativeThumbnailProvider, currentFilePath, mIconSizePx);
+        } else {
+            // Send back the already-processed file.
+            onThumbnailRetrieved(currentFilePath, cachedBitmap);
+        }
+    }
+
+    @CalledByNative
+    private void onThumbnailRetrieved(String filePath, Bitmap bitmap) {
+        getBitmapCache().put(filePath, bitmap);
+        mCurrentRequest.onThumbnailRetrieved(filePath, bitmap);
+        mCurrentRequest = null;
+        processQueue();
+    }
+
+    private boolean isInitialized() {
+        return mNativeThumbnailProvider != 0;
+    }
+
+    private static LruCache<String, Bitmap> getBitmapCache() {
+        ThreadUtils.assertOnUiThread();
+
+        LruCache<String, Bitmap> cache = sBitmapCache == null ? null : sBitmapCache.get();
+        if (cache != null) return cache;
+
+        // Create a new weakly-referenced cache.
+        cache = new LruCache<String, Bitmap>(MAX_CACHE_BYTES) {
+            @Override
+            protected int sizeOf(String key, Bitmap thumbnail) {
+                return thumbnail == null ? 0 : thumbnail.getByteCount();
+            }
+        };
+        sBitmapCache = new WeakReference<>(cache);
+        return cache;
+    }
+
+    private native long nativeInit();
+    private native void nativeDestroy(long nativeThumbnailProvider);
+    private native void nativeRetrieveThumbnail(
+            long nativeThumbnailProvider, String filePath, int thumbnailSize);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
index b887c61..cc0edce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java
@@ -346,7 +346,7 @@
     public void acceptTermsOfService(boolean allowCrashUpload) {
         // If default is true then it corresponds to opt-out and false corresponds to opt-in.
         UmaUtils.recordMetricsReportingDefaultOptIn(!DEFAULT_METRICS_AND_CRASH_REPORTING);
-        sGlue.acceptTermsOfService(getApplicationContext(), allowCrashUpload);
+        sGlue.acceptTermsOfService(allowCrashUpload);
         FirstRunStatus.setSkipWelcomePage(FirstRunActivity.this, true);
         flushPersistentData();
         stopProgressionIfNotAcceptedTermsOfService();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlue.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlue.java
index a724968..5732be7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlue.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlue.java
@@ -19,10 +19,9 @@
 
     /**
      * Sets the EULA/Terms of Services state as "ACCEPTED".
-     * @param appContext An application context.
      * @param allowCrashUpload True if the user allows to upload crash dumps and collect stats.
      */
-    void acceptTermsOfService(Context appContext, boolean allowCrashUpload);
+    void acceptTermsOfService(boolean allowCrashUpload);
 
     /**
      * @return Whether a given account name is the default (first) Android account name.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlueImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlueImpl.java
index 1ccf130..cbcb2f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlueImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunGlueImpl.java
@@ -26,7 +26,7 @@
     }
 
     @Override
-    public void acceptTermsOfService(Context appContext, boolean allowCrashUpload) {
+    public void acceptTermsOfService(boolean allowCrashUpload) {
         UmaSessionStats.changeMetricsReportingConsent(allowCrashUpload);
         PrefServiceBridge.getInstance().setEulaAccepted();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
index f9ece002..4d3a933 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/LightweightFirstRunActivity.java
@@ -62,7 +62,7 @@
                 .setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View v) {
-                        sGlue.acceptTermsOfService(LightweightFirstRunActivity.this, false);
+                        sGlue.acceptTermsOfService(false);
                         completeFirstRunExperience();
                     }
                 });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index a51b82e..67bdfd8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -12,7 +12,6 @@
 import android.os.Looper;
 import android.os.Process;
 import android.os.StrictMode;
-import android.text.TextUtils;
 
 import com.squareup.leakcanary.LeakCanary;
 
@@ -42,7 +41,6 @@
 import org.chromium.chrome.browser.tabmodel.document.DocumentTabModelImpl;
 import org.chromium.chrome.browser.webapps.ActivityAssigner;
 import org.chromium.chrome.browser.webapps.ChromeWebApkHost;
-import org.chromium.components.variations.VariationsAssociatedData;
 import org.chromium.content.app.ContentApplication;
 import org.chromium.content.browser.BrowserStartupController;
 import org.chromium.content.browser.ChildProcessCreationParams;
@@ -397,23 +395,19 @@
         mNativeInitializationComplete = true;
         ContentUriUtils.setFileProviderUtil(new FileProviderHelper());
 
-        if (TextUtils.equals("true", VariationsAssociatedData.getVariationParamValue(
-                MinidumpDirectoryObserver.MINIDUMP_EXPERIMENT_NAME, "Enabled"))) {
+        // Start the file observer to watch the minidump directory.
+        new AsyncTask<Void, Void, MinidumpDirectoryObserver>() {
+            @Override
+            protected MinidumpDirectoryObserver doInBackground(Void... params) {
+                return new MinidumpDirectoryObserver();
+            }
 
-            // Start the file observer to watch the minidump directory.
-            new AsyncTask<Void, Void, MinidumpDirectoryObserver>() {
-                @Override
-                protected MinidumpDirectoryObserver doInBackground(Void... params) {
-                    return new MinidumpDirectoryObserver();
-                }
-
-                @Override
-                protected void onPostExecute(MinidumpDirectoryObserver minidumpDirectoryObserver) {
-                    mMinidumpDirectoryObserver = minidumpDirectoryObserver;
-                    mMinidumpDirectoryObserver.startWatching();
-                }
-            }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-        }
+            @Override
+            protected void onPostExecute(MinidumpDirectoryObserver minidumpDirectoryObserver) {
+                mMinidumpDirectoryObserver = minidumpDirectoryObserver;
+                mMinidumpDirectoryObserver.startWatching();
+            }
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
     private void waitForDebuggerIfNeeded() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/OWNERS
new file mode 100644
index 0000000..0fa757c
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/OWNERS
@@ -0,0 +1 @@
+twellington@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
index 5175232..805a9e9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarTablet.java
@@ -572,7 +572,9 @@
         if (tab == null) return false;
         boolean isChromeScheme = tab.getUrl().startsWith(UrlConstants.CHROME_SCHEME)
                 || tab.getUrl().startsWith(UrlConstants.CHROME_NATIVE_SCHEME);
-        return !isChromeScheme;
+        boolean isValidTab = !tab.isOfflinePage() && !tab.isShowingErrorPage()
+                             && !tab.isShowingInterstitialPage();
+        return !isChromeScheme && isValidTab;
     }
 
     private boolean shouldShowPageActionButtons() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CurrencyStringFormatter.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CurrencyStringFormatter.java
index dd8a8a1..0bb0e59e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CurrencyStringFormatter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CurrencyStringFormatter.java
@@ -21,14 +21,13 @@
     private static final int DIGITS_BETWEEN_NEGATIVE_AND_PERIOD_GROUP = 2;
     private static final int DIGITS_AFTER_PERIOD_GROUP = 4;
 
-    // Amount currency code pattern.
-    private static final String AMOUNT_CURRENCY_CODE_PATTERN = "^[A-Z]{3}$";
+    // Max currency code length. Maximum length of currency code can be at most 2048.
+    private static final int MAX_CURRENCY_CODE_LEN = 2048;
 
     // Formatting constants.
     private static final int DIGIT_GROUPING_SIZE = 3;
 
     private final Pattern mAmountValuePattern;
-    private final Pattern mAmountCurrencyCodePattern;
 
     /**
      * The symbol for the currency specified on the bill. For example, the symbol for "USD" is "$".
@@ -66,7 +65,6 @@
         assert userLocale != null : "userLocale should not be null";
 
         mAmountValuePattern = Pattern.compile(AMOUNT_VALUE_PATTERN);
-        mAmountCurrencyCodePattern = Pattern.compile(AMOUNT_CURRENCY_CODE_PATTERN);
 
         String currencySymbol;
         int defaultFractionDigits;
@@ -120,8 +118,7 @@
      * @return Whether the currency code is in valid format.
      */
     public boolean isValidAmountCurrencyCode(String amountCurrencyCode) {
-        return amountCurrencyCode != null
-                && mAmountCurrencyCodePattern.matcher(amountCurrencyCode).matches();
+        return amountCurrencyCode != null && amountCurrencyCode.length() <= MAX_CURRENCY_CODE_LEN;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
index 73ec097..aed2a388 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -13,7 +13,6 @@
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.net.Uri;
-import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -38,7 +37,6 @@
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.blimp_public.contents.BlimpContents;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
@@ -60,8 +58,6 @@
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchTabHelper;
-import org.chromium.chrome.browser.crash.MinidumpDirectoryObserver;
-import org.chromium.chrome.browser.crash.MinidumpUploadService;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.download.ChromeDownloadDelegate;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
@@ -94,7 +90,6 @@
 import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
-import org.chromium.components.variations.VariationsAssociatedData;
 import org.chromium.content.browser.ActivityContentVideoViewEmbedder;
 import org.chromium.content.browser.ChildProcessLauncher;
 import org.chromium.content.browser.ContentVideoViewEmbedder;
@@ -1504,7 +1499,8 @@
             if (isBlimpTab() && getBlimpContents() == null) {
                 Profile profile = Profile.getLastUsedProfile();
                 if (mIncognito) profile = profile.getOffTheRecordProfile();
-                mBlimpContents = nativeInitBlimpContents(mNativeTabAndroid, profile);
+                mBlimpContents = nativeInitBlimpContents(
+                        mNativeTabAndroid, profile, mWindowAndroid.getNativePointer());
                 if (mBlimpContents != null) {
                     getBlimpContents().addObserver(new TabBlimpContentsObserver(this));
                 } else {
@@ -1631,6 +1627,7 @@
 
         reparentingParams.finalizeTabReparenting();
         mIsDetachedForReparenting = false;
+        mIsTabStateDirty = true;
 
         for (TabObserver observer : mObservers) {
             observer.onReparentingFinished(this);
@@ -2830,29 +2827,6 @@
         mIsBeingRestored = false;
 
         if (mTabUma != null) mTabUma.onRendererCrashed();
-
-        if (!TextUtils.equals("true", VariationsAssociatedData.getVariationParamValue(
-                MinidumpDirectoryObserver.MINIDUMP_EXPERIMENT_NAME, "Enabled"))) {
-            try {
-                // Update the most recent minidump file with the logcat. Doing this asynchronously
-                // adds a race condition in the case of multiple simultaneously renderer crashses
-                // but because the data will be the same for all of them it is innocuous. We can
-                // attempt to do this regardless of whether it was a foreground tab in the event
-                // that it's a real crash and not just android killing the tab.
-                Context context = getApplicationContext();
-                Intent intent = MinidumpUploadService.createFindAndUploadLastCrashIntent(context);
-                context.startService(intent);
-                RecordUserAction.record("MobileBreakpadUploadAttempt");
-            } catch (SecurityException e) {
-                // For KitKat and below, there was a framework bug which cause us to not be able to
-                // find our own crash uploading service. Ignore a SecurityException here on older
-                // OS versions since the crash will eventually get uploaded on next start.
-                // crbug/542533
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-                    throw e;
-                }
-            }
-        }
     }
 
     /**
@@ -3318,7 +3292,8 @@
     private native void nativeInitWebContents(long nativeTabAndroid, boolean incognito,
             WebContents webContents, TabWebContentsDelegateAndroid delegate,
             ContextMenuPopulator contextMenuPopulator);
-    private native BlimpContents nativeInitBlimpContents(long nativeTabAndroid, Profile profile);
+    private native BlimpContents nativeInitBlimpContents(
+            long nativeTabAndroid, Profile profile, long windowAndroidPtr);
     private native void nativeUpdateDelegates(long nativeTabAndroid,
             TabWebContentsDelegateAndroid delegate, ContextMenuPopulator contextMenuPopulator);
     private native void nativeDestroyWebContents(long nativeTabAndroid, boolean deleteNative);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContentViewParent.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContentViewParent.java
index d2104ad..0543f10 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContentViewParent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContentViewParent.java
@@ -29,19 +29,26 @@
     private final Behavior<?> mBehavior = new SnackbarAwareBehavior();
 
     private EmptyTabObserver mTabObserver = new EmptyTabObserver() {
+        /**
+         * @return the {@link View} to show for the given {@link Tab}.
+         */
+        private View getViewToShow(Tab tab) {
+            if (tab.getNativePage() != null) {
+                return tab.getNativePage().getView();
+            } else if (tab.getBlimpContents() != null) {
+                return tab.getBlimpContents().getView();
+            } else {
+                return tab.getContentViewCore().getContainerView();
+            }
+        }
+
         @Override
         public void onContentChanged(Tab tab) {
             // If the tab is frozen, both native page and content view are not ready.
             if (tab.isFrozen()) return;
-            View viewToShow = null;
-            if (tab.getNativePage() != null) {
-                viewToShow = tab.getNativePage().getView();
-                if (isShowing(viewToShow)) return;
 
-            } else {
-                viewToShow = tab.getContentViewCore().getContainerView();
-                if (isShowing(viewToShow)) return;
-            }
+            View viewToShow = getViewToShow(tab);
+            if (isShowing(viewToShow)) return;
 
             removeCurrentContent();
             LayoutParams lp = (LayoutParams) viewToShow.getLayoutParams();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
index 36ad1bdd..c8726db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -227,6 +227,17 @@
         };
     }
 
+    /**
+     * Exposed to allow tests to initialize the selector with different tab models.
+     * @param normalModel The normal tab model.
+     * @param incognitoModel The incognito tab model.
+     */
+    @VisibleForTesting
+    public void initializeForTesting(TabModel normalModel, TabModel incognitoModel) {
+        initialize(isIncognitoSelected(), normalModel, incognitoModel);
+        mActiveState = true;
+    }
+
     @Override
     public void setCloseAllTabsDelegate(CloseAllTabsDelegate delegate) {
         mCloseAllTabsDelegate = delegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
index aedf958..a91bcde2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistencePolicy.java
@@ -43,18 +43,21 @@
     String getStateToBeMergedFileName();
 
     /**
-     * Performs any necessary migration required before accessing the tab information.
+     * Performs any necessary initialization required before accessing the tab information.  This
+     * can include cleanups or migrations that must occur before the tab state information can be
+     * read reliably.
      *
      * @param executor The executor that any asynchronous tasks should be run on.
-     * @return Whether any migration is necessary.
+     * @return Whether any blocking initialization is necessary.
      */
-    boolean performMigration(Executor executor);
+    boolean performInitialization(Executor executor);
 
     /**
-     * Waits for the task that migrates all state files to their new location to
-     * finish.
+     * Waits for the any pending initialization to finish.
+     *
+     * @see #performInitialization(Executor)
      */
-    void waitForMigrationToFinish();
+    void waitForInitializationToFinish();
 
     /**
      * @return Whether a merge is currently in progress.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
index 8126adb8..1bfbef6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -219,11 +219,12 @@
         mPreferences = ContextUtils.getAppSharedPreferences();
 
         assert isStateFile(policy.getStateFileName()) : "State file name is not valid";
-        boolean needsMigration = mPersistencePolicy.performMigration(AsyncTask.SERIAL_EXECUTOR);
+        boolean needsInitialization = mPersistencePolicy.performInitialization(
+                AsyncTask.SERIAL_EXECUTOR);
 
         if (mPersistencePolicy.isMergeInProgress()) return;
 
-        Executor executor = needsMigration
+        Executor executor = needsInitialization
                 ? AsyncTask.SERIAL_EXECUTOR : AsyncTask.THREAD_POOL_EXECUTOR;
 
         mPrefetchTabListTask =
@@ -247,7 +248,7 @@
      */
     @VisibleForTesting
     public void waitForMigrationToFinish() {
-        mPersistencePolicy.waitForMigrationToFinish();
+        mPersistencePolicy.waitForInitializationToFinish();
     }
 
     /**
@@ -998,7 +999,7 @@
      * @param forMerge Whether this state file was read as part of a merge.
      * @return The next available tab ID based on the maximum ID referenced in this state file.
      */
-    protected static int readSavedStateFile(
+    public static int readSavedStateFile(
             DataInputStream stream, @Nullable OnTabStateReadCallback callback,
             @Nullable SparseBooleanArray tabIds, boolean forMerge) throws IOException {
         if (stream == null) return 0;
@@ -1367,9 +1368,19 @@
     }
 
     /**
+     * Parses the state file name and returns the unique ID encoded into it.
+     * @param stateFileName The state file name to be parsed.
+     * @return The unique ID used when generating the file name.
+     */
+    public static String getStateFileUniqueId(String stateFileName) {
+        assert isStateFile(stateFileName);
+        return stateFileName.substring(TabPersistencePolicy.SAVED_STATE_FILE_PREFIX.length());
+    }
+
+    /**
      * @return Whether the specified filename matches the expected pattern of the tab state files.
      */
-    private static boolean isStateFile(String fileName) {
+    public static boolean isStateFile(String fileName) {
         return fileName.startsWith(TabPersistencePolicy.SAVED_STATE_FILE_PREFIX);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
index 96bb664..26f6bf6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
@@ -143,7 +143,7 @@
     }
 
     @Override
-    public boolean performMigration(Executor executor) {
+    public boolean performInitialization(Executor executor) {
         ThreadUtils.assertOnUiThread();
 
         final boolean hasRunLegacyMigration =
@@ -291,7 +291,7 @@
     }
 
     @Override
-    public void waitForMigrationToFinish() {
+    public void waitForInitializationToFinish() {
         if (sMigrationTask == null) return;
         try {
             sMigrationTask.get();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
index adfdbb5b..18b4987 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java
@@ -39,6 +39,9 @@
     /** Monitors installation progress. */
     private InstallerDelegate mInstallTask;
 
+    /** Indicates whether to install or update a WebAPK. */
+    private boolean mIsInstall;
+
     /** Weak pointer to the native WebApkInstaller. */
     private long mNativePointer;
 
@@ -71,12 +74,17 @@
                     "WebAPK install failed because installation from unknown sources is disabled.");
             return false;
         }
+        mIsInstall = true;
+        return installDownloadedWebApk(filePath, packageName);
+    }
+
+    private boolean installDownloadedWebApk(String filePath, String packageName) {
         mWebApkPackageName = packageName;
 
         // Start monitoring the installation.
         PackageManager packageManager = ContextUtils.getApplicationContext().getPackageManager();
         mInstallTask = new InstallerDelegate(Looper.getMainLooper(), packageManager,
-                createInstallerDelegateObserver(), packageName);
+                createInstallerDelegateObserver(), mWebApkPackageName);
         mInstallTask.start();
         // Start monitoring the application state changes.
         mListener = createApplicationStateListener();
@@ -110,11 +118,12 @@
         if (mNativePointer != 0) {
             nativeOnInstallFinished(mNativePointer, success);
         }
-        if (success) {
+        if (success && mIsInstall) {
             ShortcutHelper.addWebApkShortcut(ContextUtils.getApplicationContext(),
                     mWebApkPackageName);
         }
     }
+
     /**
      * Updates a WebAPK.
      * @param filePath File to update.
@@ -124,9 +133,8 @@
      */
     @CalledByNative
     private boolean updateAsyncFromNative(String filePath, String packageName) {
-        // TODO(hanxi): Calls back to C++ when the updating is complete or return a failure status
-        // if fails.
-        return false;
+        mIsInstall = false;
+        return installDownloadedWebApk(filePath, packageName);
     }
 
     /**
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index ff24f8c..cf7f2ce 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -269,6 +269,7 @@
   "java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java",
   "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java",
   "java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java",
+  "java/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicy.java",
   "java/src/org/chromium/chrome/browser/customtabs/RequestThrottler.java",
   "java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity.java",
   "java/src/org/chromium/chrome/browser/customtabs/SeparateTaskCustomTabActivity0.java",
@@ -287,7 +288,6 @@
   "java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java",
   "java/src/org/chromium/chrome/browser/device/DeviceClassManager.java",
   "java/src/org/chromium/chrome/browser/document/ChromeLauncherActivity.java",
-  "java/src/org/chromium/chrome/browser/document/CipherKeyActivity.java",
   "java/src/org/chromium/chrome/browser/document/DocumentActivity.java",
   "java/src/org/chromium/chrome/browser/document/DocumentUtils.java",
   "java/src/org/chromium/chrome/browser/document/DocumentWebContentsDelegate.java",
@@ -327,6 +327,8 @@
   "java/src/org/chromium/chrome/browser/download/ui/DownloadManagerToolbar.java",
   "java/src/org/chromium/chrome/browser/download/ui/FilterAdapter.java",
   "java/src/org/chromium/chrome/browser/download/ui/SpaceDisplay.java",
+  "java/src/org/chromium/chrome/browser/download/ui/ThumbnailProvider.java",
+  "java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java",
   "java/src/org/chromium/chrome/browser/externalauth/ExternalAuthUtils.java",
   "java/src/org/chromium/chrome/browser/externalauth/UserRecoverableErrorHandler.java",
   "java/src/org/chromium/chrome/browser/externalauth/VerifiedHandler.java",
@@ -1157,6 +1159,7 @@
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsTestUtils.java",
+  "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/RequestThrottlerTest.java",
   "javatests/src/org/chromium/chrome/browser/document/LauncherActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/dom_distiller/DistillabilityServiceTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/CrashFileManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/CrashFileManagerTest.java
index f5b671a..f860305 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/CrashFileManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/CrashFileManagerTest.java
@@ -14,6 +14,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
 /**
@@ -32,6 +34,8 @@
     private File mUpFile1;
     private File mUpFile2;
 
+    private File mLogfile;
+
     @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
     @Override
     protected void setUp() throws Exception {
@@ -58,6 +62,9 @@
 
         mUpFile2 = new File(mCrashDir, "chromium-renderer_abcd.up" + TEST_PID);
         mUpFile2.createNewFile();
+
+        mLogfile = new File(mCrashDir, CrashFileManager.CRASH_DUMP_LOGFILE);
+        mLogfile.createNewFile();
     }
 
     @SmallTest
@@ -108,6 +115,18 @@
 
     @SmallTest
     @Feature({"Android-AppBase"})
+    public void testGetAllFilesSorted() {
+        CrashFileManager crashFileManager = new CrashFileManager(mCacheDir);
+        File[] expectedFiles = new File[] {mLogfile, mUpFile2, mUpFile1, mDmpFile2, mDmpFile1,
+                mTmpFile3, mTmpFile2, mTmpFile1};
+        File[] actualFiles = crashFileManager.getAllFilesSorted();
+        assertNotNull(actualFiles);
+        MoreAsserts.assertEquals(
+                "Failed to sort all files by modification time", expectedFiles, actualFiles);
+    }
+
+    @SmallTest
+    @Feature({"Android-AppBase"})
     public void testGetCrashDirectory() {
         CrashFileManager crashFileManager = new CrashFileManager(mCacheDir);
         File actualFile = crashFileManager.getCrashDirectory();
@@ -190,4 +209,73 @@
         assertFalse(mDmpFile1.exists());
         assertTrue(new File(mCrashDir, "123_abc.skipped0").exists());
     }
+
+    @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
+    @SmallTest
+    @Feature({"Android-AppBase"})
+    public void testCleanOutAllNonFreshMinidumpFiles() throws IOException {
+        // Create some simulated old files.
+        long oldTimestamp = new Date().getTime() - TimeUnit.MILLISECONDS.convert(31, TimeUnit.DAYS);
+        File old1 = new File(mCrashDir, "chromium-renderer-minidump-cooo10ff.dmp");
+        File old2 = new File(mCrashDir, "chromium-renderer-minidump-cooo10ff.up0");
+        File old3 = new File(mCrashDir, "chromium-renderer-minidump-cooo10ff.logcat");
+        old1.setLastModified(oldTimestamp);
+        old2.setLastModified(oldTimestamp - 1);
+        old3.setLastModified(oldTimestamp - 2);
+
+        // These will be the most recent files in the directory, after all successfully uploaded
+        // files and all temp files are removed.
+        File[] recentFiles = new File[3 * CrashFileManager.MAX_CRASH_REPORTS_TO_KEEP];
+        for (int i = 0; i < CrashFileManager.MAX_CRASH_REPORTS_TO_KEEP; ++i) {
+            String prefix = "chromium-renderer-minidump-deadbeef" + i;
+            // There is no reason why both a minidump and failed upload should exist at the same
+            // time, but the cleanup code should be robust to it anyway.
+            File recentMinidump = new File(mCrashDir, prefix + ".dmp");
+            File recentFailedUpload = new File(mCrashDir, prefix + ".up0.try0");
+            File recentLogcatFile = new File(mCrashDir, prefix + ".logcat");
+            recentMinidump.createNewFile();
+            recentFailedUpload.createNewFile();
+            recentLogcatFile.createNewFile();
+            recentFiles[3 * i + 0] = recentMinidump;
+            recentFiles[3 * i + 1] = recentFailedUpload;
+            recentFiles[3 * i + 2] = recentLogcatFile;
+        }
+
+        // Create some additional successful uploads.
+        File success1 = new File(mCrashDir, "chromium-renderer-minidump-cafebebe1.up0");
+        File success2 = new File(mCrashDir, "chromium-renderer-minidump-cafebebe2.up1");
+        File success3 = new File(mCrashDir, "chromium-renderer-minidump-cafebebe3.up2");
+        success1.createNewFile();
+        success2.createNewFile();
+        success3.createNewFile();
+
+        // Create some additional temp files.
+        File temp1 = new File(mCrashDir, "chromium-renderer-minidump-oooff1ce1.tmp");
+        File temp2 = new File(mCrashDir, "chromium-renderer-minidump-oooff1ce2.tmp");
+        temp1.createNewFile();
+        temp2.createNewFile();
+
+        CrashFileManager crashFileManager = new CrashFileManager(mCacheDir);
+        crashFileManager.cleanOutAllNonFreshMinidumpFiles();
+
+        assertFalse(old1.exists());
+        assertFalse(old2.exists());
+        assertFalse(old3.exists());
+        for (File f : recentFiles) {
+            assertTrue(f.exists());
+        }
+        assertTrue(mLogfile.exists());
+        assertFalse(mTmpFile1.exists());
+        assertFalse(mTmpFile2.exists());
+        assertFalse(mTmpFile3.exists());
+        assertFalse(mDmpFile1.exists());
+        assertFalse(mDmpFile2.exists());
+        assertFalse(mUpFile1.exists());
+        assertFalse(mUpFile2.exists());
+        assertFalse(temp1.exists());
+        assertFalse(temp2.exists());
+        assertFalse(success1.exists());
+        assertFalse(success2.exists());
+        assertFalse(success3.exists());
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
index 5c6713d2..e2042e1c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadCallableTest.java
@@ -178,7 +178,7 @@
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        mUploadLog = new File(mCacheDir, CrashFileManager.CRASH_DUMP_LOGFILE);
+        mUploadLog = new File(mCrashDir, CrashFileManager.CRASH_DUMP_LOGFILE);
         // Delete all logs from previous runs if possible.
         mUploadLog.delete();
 
@@ -386,7 +386,7 @@
     }
 
     private void assertValidUploadLogEntry() throws IOException {
-        File logfile = new File(mCacheDir, CrashFileManager.CRASH_DUMP_LOGFILE);
+        File logfile = new File(mCrashDir, CrashFileManager.CRASH_DUMP_LOGFILE);
         BufferedReader input =  new BufferedReader(new FileReader(logfile));
         String line = null;
         String lastEntry = null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java
index 6f4cd07..f4aae35b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java
@@ -312,7 +312,7 @@
         // Create the file used for uploading.
         File minidumpFile = new File(mCrashDir, "chromium_renderer-111.dmp1");
         minidumpFile.createNewFile();
-        File logfile = new File(mCacheDir, CrashFileManager.CRASH_DUMP_LOGFILE);
+        File logfile = new File(mCrashDir, CrashFileManager.CRASH_DUMP_LOGFILE);
         setUpMinidumpFile(minidumpFile, BOUNDARY);
 
         // Run test.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java
new file mode 100644
index 0000000..499348c
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java
@@ -0,0 +1,432 @@
+// 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.
+
+package org.chromium.chrome.browser.customtabs;
+
+import static android.test.MoreAsserts.assertContentsInAnyOrder;
+import static android.test.MoreAsserts.assertEmpty;
+
+import android.app.Activity;
+import android.os.AsyncTask;
+import android.test.InstrumentationTestCase;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.ActivityState;
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.StreamUtil;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.AdvancedMockContext;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.TabState;
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
+import org.chromium.chrome.browser.tabmodel.TabPersistencePolicy;
+import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
+import org.chromium.chrome.browser.tabmodel.TestTabModelDirectory;
+import org.chromium.chrome.test.util.browser.tabmodel.MockTabModel;
+import org.chromium.content.browser.test.util.CallbackHelper;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.annotation.Nullable;
+
+/**
+ * Tests for the Custom Tab persistence logic.
+ */
+public class CustomTabTabPersistencePolicyTest extends InstrumentationTestCase {
+
+    private TestTabModelDirectory mMockDirectory;
+    private AdvancedMockContext mAppContext;
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        mAppContext = new AdvancedMockContext(
+                getInstrumentation().getTargetContext().getApplicationContext());
+        ContextUtils.initApplicationContextForTests(mAppContext);
+
+        mMockDirectory = new TestTabModelDirectory(
+                mAppContext, "CustomTabTabPersistencePolicyTest",
+                CustomTabTabPersistencePolicy.SAVED_STATE_DIRECTORY);
+        TabPersistentStore.setBaseStateDirectoryForTests(mMockDirectory.getBaseDirectory());
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        mMockDirectory.tearDown();
+
+        List<WeakReference<Activity>> activities = ApplicationStatus.getRunningActivities();
+        for (int i = 0; i < activities.size(); i++) {
+            Activity activity = activities.get(i).get();
+            if (activity == null) continue;
+            ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
+        }
+        super.tearDown();
+    }
+
+    @Feature("TabPersistentStore")
+    @SmallTest
+    public void testDeletableMetadataSelection_NoFiles() {
+        List<File> deletableFiles = CustomTabTabPersistencePolicy.getMetadataFilesForDeletion(
+                System.currentTimeMillis(), new ArrayList<File>());
+        assertEmpty(deletableFiles);
+    }
+
+    @Feature("TabPersistentStore")
+    @SmallTest
+    public void testDeletableMetadataSelection_MaximumValidFiles() {
+        long currentTime = System.currentTimeMillis();
+
+        // Test the maximum allowed number of state files where they are all valid in terms of age.
+        List<File> filesToTest = new ArrayList<>();
+        filesToTest.addAll(generateMaximumStateFiles(currentTime));
+        List<File> deletableFiles = CustomTabTabPersistencePolicy.getMetadataFilesForDeletion(
+                currentTime, filesToTest);
+        assertEmpty(deletableFiles);
+    }
+
+    @Feature("TabPersistentStore")
+    @SmallTest
+    public void testDeletableMetadataSelection_ExceedsMaximumValidFiles() {
+        long currentTime = System.currentTimeMillis();
+
+        // Test where we exceed the maximum number of allowed state files and ensure it chooses the
+        // older file to delete.
+        List<File> filesToTest = new ArrayList<>();
+        filesToTest.addAll(generateMaximumStateFiles(currentTime));
+        File slightlyOlderFile = buildTestFile("slightlyolderfile", currentTime - 1L);
+        // Insert it into the middle just to ensure it is not picking the last file.
+        filesToTest.add(filesToTest.size() / 2, slightlyOlderFile);
+        List<File> deletableFiles = CustomTabTabPersistencePolicy.getMetadataFilesForDeletion(
+                currentTime, filesToTest);
+        assertContentsInAnyOrder(deletableFiles, slightlyOlderFile);
+    }
+
+    @Feature("TabPersistentStore")
+    @SmallTest
+    public void testDeletableMetadataSelection_ExceedExpiryThreshold() {
+        long currentTime = System.currentTimeMillis();
+
+        // Ensure that files that exceed the allowed time threshold are removed regardless of the
+        // number of possible files.
+        List<File> filesToTest = new ArrayList<>();
+        File expiredFile = buildTestFile("expired_file",
+                currentTime - CustomTabTabPersistencePolicy.STATE_EXPIRY_THRESHOLD);
+        filesToTest.add(expiredFile);
+        List<File> deletableFiles = CustomTabTabPersistencePolicy.getMetadataFilesForDeletion(
+                currentTime, filesToTest);
+        assertContentsInAnyOrder(deletableFiles, expiredFile);
+    }
+
+    /**
+     * Test to ensure that an existing metadata files are deleted if no restore is requested.
+     */
+    @Feature("TabPersistentStore")
+    @MediumTest
+    public void testExistingMetadataFileDeletedIfNoRestore() throws Exception {
+        File baseStateDirectory = TabPersistentStore.getOrCreateBaseStateDirectory();
+        assertNotNull(baseStateDirectory);
+
+        CustomTabTabPersistencePolicy policy = new CustomTabTabPersistencePolicy(7, false);
+        File stateDirectory = policy.getOrCreateStateDirectory();
+        assertNotNull(stateDirectory);
+
+        String stateFileName = policy.getStateFileName();
+        File existingStateFile = new File(stateDirectory, stateFileName);
+        assertTrue(existingStateFile.createNewFile());
+
+        assertTrue(existingStateFile.exists());
+        policy.performInitialization(AsyncTask.SERIAL_EXECUTOR);
+        policy.waitForInitializationToFinish();
+        assertFalse(existingStateFile.exists());
+    }
+
+    /**
+     * Test the logic that gets all the live tab and task IDs.
+     */
+    @Feature("TabPersistentStore")
+    @SmallTest
+    @UiThreadTest
+    public void testGettingTabAndTaskIds() {
+        Set<Integer> tabIds = new HashSet<>();
+        Set<Integer> taskIds = new HashSet<>();
+        CustomTabTabPersistencePolicy.getAllLiveTabAndTaskIds(tabIds, taskIds);
+        assertEmpty(tabIds);
+        assertEmpty(taskIds);
+
+        tabIds.clear();
+        taskIds.clear();
+
+        CustomTabActivity cct1 = buildTestCustomTabActivity(1, new int[] {4, 8, 9}, null);
+        ApplicationStatus.onStateChangeForTesting(cct1, ActivityState.CREATED);
+
+        CustomTabActivity cct2 = buildTestCustomTabActivity(5, new int[] {458}, new int[] {9878});
+        ApplicationStatus.onStateChangeForTesting(cct2, ActivityState.CREATED);
+
+        // Add a tabbed mode activity to ensure that its IDs are not included in the returned CCT
+        // ID sets.
+        final TabModelSelectorImpl tabbedSelector =
+                buildTestTabModelSelector(new int[] {12121212}, new int[] {1515151515});
+        ChromeTabbedActivity tabbedActivity = new ChromeTabbedActivity() {
+            @Override
+            public int getTaskId() {
+                return 888;
+            }
+
+            @Override
+            public TabModelSelector getTabModelSelector() {
+                return tabbedSelector;
+            }
+        };
+        ApplicationStatus.onStateChangeForTesting(tabbedActivity, ActivityState.CREATED);
+
+        CustomTabTabPersistencePolicy.getAllLiveTabAndTaskIds(tabIds, taskIds);
+        assertContentsInAnyOrder(tabIds, 4, 8, 9, 458, 9878);
+        assertContentsInAnyOrder(taskIds, 1, 5);
+    }
+
+    /**
+     * Test the full cleanup task path that determines what files are eligible for deletion.
+     */
+    @Feature("TabPersistentStore")
+    @MediumTest
+    public void testCleanupTask() throws Exception {
+        File baseStateDirectory = TabPersistentStore.getOrCreateBaseStateDirectory();
+        assertNotNull(baseStateDirectory);
+
+        CustomTabTabPersistencePolicy policy = new CustomTabTabPersistencePolicy(2, false);
+        File stateDirectory = policy.getOrCreateStateDirectory();
+        assertNotNull(stateDirectory);
+
+        final AtomicReference<List<String>> filesToDelete = new AtomicReference<>();
+        final CallbackHelper callbackSignal = new CallbackHelper();
+        Callback<List<String>> filesToDeleteCallback = new Callback<List<String>>() {
+            @Override
+            public void onResult(List<String> fileNames) {
+                filesToDelete.set(fileNames);
+                callbackSignal.notifyCalled();
+            }
+        };
+
+        // Test when no files have been created.
+        policy.cleanupUnusedFiles(filesToDeleteCallback);
+        callbackSignal.waitForCallback(0);
+        assertEmpty(filesToDelete.get());
+
+        // Create an unreferenced tab state file and ensure it is marked for deletion.
+        File tab999File = TabState.getTabStateFile(stateDirectory, 999, false);
+        assertTrue(tab999File.createNewFile());
+        policy.cleanupUnusedFiles(filesToDeleteCallback);
+        callbackSignal.waitForCallback(1);
+        assertContentsInAnyOrder(filesToDelete.get(), tab999File.getName());
+
+        // Reference the tab state file and ensure it is no longer marked for deletion.
+        CustomTabActivity cct1 = buildTestCustomTabActivity(1, new int[] {999}, null);
+        ApplicationStatus.onStateChangeForTesting(cct1, ActivityState.CREATED);
+        policy.cleanupUnusedFiles(filesToDeleteCallback);
+        callbackSignal.waitForCallback(2);
+        assertEmpty(filesToDelete.get());
+
+        // Create a tab model and associated tabs. Ensure it is not marked for deletion as it is
+        // new enough.
+        final TabModelSelectorImpl selectorImpl = buildTestTabModelSelector(
+                new int[] {111, 222, 333 }, null);
+        byte[] data = ThreadUtils.runOnUiThreadBlockingNoException(new Callable<byte[]>() {
+            @Override
+            public byte[] call() throws Exception {
+                return TabPersistentStore.serializeTabModelSelector(selectorImpl, null);
+            }
+        });
+        FileOutputStream fos = null;
+        File metadataFile = new File(
+                stateDirectory, TabPersistentStore.getStateFileName("3"));
+        try {
+            fos = new FileOutputStream(metadataFile);
+            fos.write(data);
+        } finally {
+            StreamUtil.closeQuietly(fos);
+        }
+        File tab111File = TabState.getTabStateFile(stateDirectory, 111, false);
+        assertTrue(tab111File.createNewFile());
+        File tab222File = TabState.getTabStateFile(stateDirectory, 222, false);
+        assertTrue(tab222File.createNewFile());
+        File tab333File = TabState.getTabStateFile(stateDirectory, 333, false);
+        assertTrue(tab333File.createNewFile());
+        policy.cleanupUnusedFiles(filesToDeleteCallback);
+        callbackSignal.waitForCallback(3);
+        assertEmpty(filesToDelete.get());
+
+        // Set the age of the metadata file to be past the expiration threshold and ensure it along
+        // with the associated tab files are marked for deletion.
+        assertTrue(metadataFile.setLastModified(1234));
+        policy.cleanupUnusedFiles(filesToDeleteCallback);
+        callbackSignal.waitForCallback(4);
+        assertContentsInAnyOrder(filesToDelete.get(), tab111File.getName(), tab222File.getName(),
+                tab333File.getName(), metadataFile.getName());
+    }
+
+    /**
+     * Ensure that the metadata file's last modified timestamp is updated on initialization.
+     */
+    @Feature("TabPersistentStore")
+    @MediumTest
+    public void testMetadataTimestampRefreshed() throws Exception {
+        File baseStateDirectory = TabPersistentStore.getOrCreateBaseStateDirectory();
+        assertNotNull(baseStateDirectory);
+
+        CustomTabTabPersistencePolicy policy = new CustomTabTabPersistencePolicy(2, true);
+        File stateDirectory = policy.getOrCreateStateDirectory();
+        assertNotNull(stateDirectory);
+
+        File metadataFile = new File(stateDirectory, policy.getStateFileName());
+        assertTrue(metadataFile.createNewFile());
+
+        long previousTimestamp =
+                System.currentTimeMillis() - CustomTabTabPersistencePolicy.STATE_EXPIRY_THRESHOLD;
+        assertTrue(metadataFile.setLastModified(previousTimestamp));
+
+        policy.performInitialization(AsyncTask.SERIAL_EXECUTOR);
+        policy.waitForInitializationToFinish();
+
+        assertTrue(metadataFile.lastModified() > previousTimestamp);
+    }
+
+    private static List<File> generateMaximumStateFiles(long currentTime) {
+        List<File> validFiles = new ArrayList<>();
+        for (int i = 0; i < CustomTabTabPersistencePolicy.MAXIMUM_STATE_FILES; i++) {
+            validFiles.add(buildTestFile("testfile" + i, currentTime));
+        }
+        return validFiles;
+    }
+
+    private static File buildTestFile(String filename, final long lastModifiedTime) {
+        return new File(filename) {
+            @Override
+            public long lastModified() {
+                return lastModifiedTime;
+            }
+        };
+    }
+
+    private static CustomTabActivity buildTestCustomTabActivity(
+            final int taskId, int[] normalTabIds, int[] incognitoTabIds) {
+        final TabModelSelectorImpl selectorImpl =
+                buildTestTabModelSelector(normalTabIds, incognitoTabIds);
+        return new CustomTabActivity() {
+            @Override
+            public int getTaskId() {
+                return taskId;
+            }
+
+            @Override
+            public TabModelSelectorImpl getTabModelSelector() {
+                return selectorImpl;
+            }
+        };
+    }
+
+    private static TabPersistencePolicy buildTestPersistencePolicy() {
+        return new TabPersistencePolicy() {
+            @Override
+            public void waitForInitializationToFinish() {
+            }
+
+            @Override
+            public void setTabContentManager(TabContentManager cache) {
+            }
+
+            @Override
+            public void setMergeInProgress(boolean isStarted) {
+            }
+
+            @Override
+            public boolean performInitialization(Executor executor) {
+                return false;
+            }
+
+            @Override
+            public boolean isMergeInProgress() {
+                return false;
+            }
+
+            @Override
+            @Nullable
+            public String getStateToBeMergedFileName() {
+                return null;
+            }
+
+            @Override
+            public String getStateFileName() {
+                return "testing_is_niftytown";
+            }
+
+            @Override
+            public File getOrCreateStateDirectory() {
+                return new File(
+                        TabPersistentStore.getOrCreateBaseStateDirectory(), "cct_tests_zor");
+            }
+
+            @Override
+            public void destroy() {
+            }
+
+            @Override
+            public void cleanupUnusedFiles(Callback<List<String>> filesToDelete) {
+            }
+
+            @Override
+            public void cancelCleanupInProgress() {
+            }
+        };
+    }
+
+    private static TabModelSelectorImpl buildTestTabModelSelector(
+            int[] normalTabIds, int[] incognitoTabIds) {
+        MockTabModel.MockTabModelDelegate tabModelDelegate =
+                new MockTabModel.MockTabModelDelegate() {
+                    @Override
+                    public Tab createTab(int id, boolean incognito) {
+                        return new Tab(id, incognito, null) {
+                            @Override
+                            public String getUrl() {
+                                return "https://www.google.com";
+                            }
+                        };
+                    }
+                };
+        final MockTabModel normalTabModel = new MockTabModel(false, tabModelDelegate);
+        if (normalTabIds != null) {
+            for (int tabId : normalTabIds) normalTabModel.addTab(tabId);
+        }
+        final MockTabModel incognitoTabModel = new MockTabModel(true, tabModelDelegate);
+        if (incognitoTabIds != null) {
+            for (int tabId : incognitoTabIds) incognitoTabModel.addTab(tabId);
+        }
+
+        CustomTabActivity activity = new CustomTabActivity();
+        ApplicationStatus.onStateChangeForTesting(activity, ActivityState.CREATED);
+        TabModelSelectorImpl selector = new TabModelSelectorImpl(
+                activity, buildTestPersistencePolicy(), null, false);
+        selector.initializeForTesting(normalTabModel, incognitoTabModel);
+        ApplicationStatus.onStateChangeForTesting(activity, ActivityState.DESTROYED);
+        return selector;
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/OWNERS
new file mode 100644
index 0000000..92e42be0
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/OWNERS
@@ -0,0 +1,2 @@
+dfalcantara@chromium.org
+twellington@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
index 9ce1ba7..58c14b9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/ui/StubbedProvider.java
@@ -136,18 +136,30 @@
         @Override public void destroy() { }
     }
 
+    /** Stubs out all attempts to get thumbnails for files. */
+    public static class StubbedThumbnailProvider implements ThumbnailProvider {
+        @Override
+        public void destroy() {}
+        @Override
+        public void getThumbnail(ThumbnailRequest request) {}
+        @Override
+        public void cancelRetrieval(ThumbnailRequest request) {}
+    }
+
     private static final long ONE_GIGABYTE = 1024L * 1024L * 1024L;
 
     private final Handler mHandler;
     private final StubbedDownloadDelegate mDownloadDelegate;
     private final StubbedOfflinePageDelegate mOfflineDelegate;
     private final SelectionDelegate<DownloadHistoryItemWrapper> mSelectionDelegate;
+    private final StubbedThumbnailProvider mStubbedThumbnailProvider;
 
     public StubbedProvider() {
         mHandler = new Handler(Looper.getMainLooper());
         mDownloadDelegate = new StubbedDownloadDelegate();
         mOfflineDelegate = new StubbedOfflinePageDelegate();
         mSelectionDelegate = new SelectionDelegate<>();
+        mStubbedThumbnailProvider = new StubbedThumbnailProvider();
     }
 
     @Override
@@ -165,6 +177,14 @@
         return mSelectionDelegate;
     }
 
+    @Override
+    public StubbedThumbnailProvider getThumbnailProvider() {
+        return mStubbedThumbnailProvider;
+    }
+
+    @Override
+    public void destroy() {}
+
     /** Creates a new DownloadItem with pre-defined values. */
     public static DownloadItem createDownloadItem(int which, String date) throws Exception {
         DownloadItem item = null;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/OWNERS
new file mode 100644
index 0000000..0fa757c
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/multiwindow/OWNERS
@@ -0,0 +1 @@
+twellington@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
index 0e7d541..0693dbba 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
@@ -11,7 +11,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
@@ -244,7 +243,6 @@
         return result;
     }
 
-    @DisabledTest(message = "Flaky, crbug.com/640319")
     @SmallTest
     public void testCopyToShareableLocation() throws Exception {
         // Save an offline page.
@@ -257,22 +255,20 @@
 
         File offlinePageOriginal = new File(offlinePageFilePath);
 
-        // Clear the directory before perform file copying.
-        Context context = getActivity().getBaseContext();
-        OfflinePageUtils.clearSharedOfflineFiles(context);
+        // Clear the directory before copying the file.
+        clearSharedOfflineFilesAndWait();
 
-        File offlineCacheDir =
+        File offlineSharingDir =
                 OfflinePageUtils.getDirectoryForOfflineSharing(getActivity().getBaseContext());
+        assertTrue("Offline sharing directory should exist.", offlineSharingDir != null);
 
-        assertTrue("The shareable offline page file should not already exist.",
-                (offlineCacheDir != null));
-
-        File offlinePageShareable = new File(offlineCacheDir, offlinePageOriginal.getName());
-
+        File offlinePageShareable = new File(offlineSharingDir, offlinePageOriginal.getName());
         assertFalse("File with the same name should not exist.", offlinePageShareable.exists());
+
         assertTrue("Should be able to copy file to shareable location.",
                 OfflinePageUtils.copyToShareableLocation(
                         offlinePageOriginal, offlinePageShareable));
+
         assertEquals("File copy result incorrect", offlinePageOriginal.length(),
                 offlinePageShareable.length());
     }
@@ -290,12 +286,12 @@
         File offlinePageOriginal = new File(offlinePageFilePath);
 
         final Context context = getActivity().getBaseContext();
-        final File offlineCacheDir = OfflinePageUtils.getDirectoryForOfflineSharing(context);
+        final File offlineSharingDir = OfflinePageUtils.getDirectoryForOfflineSharing(context);
 
         assertTrue("Should be able to create subdirectory in shareable directory.",
-                (offlineCacheDir != null));
+                (offlineSharingDir != null));
 
-        File offlinePageShareable = new File(offlineCacheDir, offlinePageOriginal.getName());
+        File offlinePageShareable = new File(offlineSharingDir, offlinePageOriginal.getName());
         if (!offlinePageShareable.exists()) {
             assertTrue("Should be able to copy file to shareable location.",
                     OfflinePageUtils.copyToShareableLocation(
@@ -303,19 +299,23 @@
         }
 
         // Clear files.
+        clearSharedOfflineFilesAndWait();
+    }
+
+    private void clearSharedOfflineFilesAndWait() {
+        Context context = getActivity().getBaseContext();
+        final File offlineSharingDir = OfflinePageUtils.getDirectoryForOfflineSharing(context);
         OfflinePageUtils.clearSharedOfflineFiles(context);
         try {
             CriteriaHelper.pollInstrumentationThread(
                     new Criteria("Failed while waiting for file operation to complete.") {
                         @Override
                         public boolean isSatisfied() {
-                            return !offlineCacheDir.exists();
+                            return !offlineSharingDir.exists();
                         }
                     });
         } catch (InterruptedException e) {
             fail("Failed while waiting for file operation to complete." + e);
         }
-
-        assertFalse("Cache directory should be deleted.", offlineCacheDir.exists());
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/OWNERS
index 79becd2..92053b9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/OWNERS
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/OWNERS
@@ -1 +1,4 @@
 dfalcantara@chromium.org
+
+per-file MultiInstanceMigrationTest.java=twellington@chromium.org
+per-file TabModelMergingTest.java=twellington@chromium.org
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/payments/CurrencyStringFormatterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/payments/CurrencyStringFormatterTest.java
index e84048e8..b13d45d0 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/payments/CurrencyStringFormatterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/payments/CurrencyStringFormatterTest.java
@@ -74,13 +74,14 @@
                     "$123,456,789,012,345,678,901,234,567,890.123456789012345678901234567890",
                     ExpectedValidity.VALID_AMOUNT},
 
+            // Any string of at most 2048 characters can be valid amount currency codes.
+            {"55.00", "", "en-US", "55.00", ExpectedValidity.VALID_AMOUNT},
+            {"55.00", "ABCDEF", "en-US", "55.00", ExpectedValidity.VALID_AMOUNT},
+            {"55.00", longStringOfLength(2048), "en-US", "55.00", ExpectedValidity.VALID_AMOUNT},
+
             // Invalid amount currency codes.
-            {"55.00", "", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
-            {"55.00", "usd", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
-            {"55.00", "US8", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
-            {"55.00", "US", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
-            {"55.00", "USDR", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
-            {"55.00", "USDr", "en-US", null, ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
+            {"55.00", longStringOfLength(2049), "en-US", null,
+                    ExpectedValidity.INVALID_AMOUNT_CURRENCY_CODE},
 
             // Invalid amount values.
             {"", "USD", "en-US", null, ExpectedValidity.INVALID_AMOUNT_VALUE},
@@ -102,6 +103,14 @@
     private final String mExpectedFormatting;
     private final ExpectedValidity mExpectedValidity;
 
+    private static String longStringOfLength(int len) {
+        StringBuilder currency = new StringBuilder();
+        for (int i = 0; i < len; i++) {
+            currency.append("A");
+        }
+        return currency.toString();
+    }
+
     public CurrencyStringFormatterTest(String amount, String currency, String languageTag,
             String expectedFormatting, ExpectedValidity expectedValidity) {
         mAmount = amount;
diff --git a/chrome/app/DEPS b/chrome/app/DEPS
index fdc68a2d..6a5da83b 100644
--- a/chrome/app/DEPS
+++ b/chrome/app/DEPS
@@ -24,7 +24,6 @@
   "+components/policy",
   "+components/safe_browsing_db/safe_browsing_api_handler.h",
   "+components/startup_metric_utils/browser",
-  "+components/startup_metric_utils/common",
   "+components/upload_list",
   "+components/version_info",
   "+content/public/app",
diff --git a/chrome/app/chrome_exe_main_win.cc b/chrome/app/chrome_exe_main_win.cc
index 2ec47c28..22ec4bf4 100644
--- a/chrome/app/chrome_exe_main_win.cc
+++ b/chrome/app/chrome_exe_main_win.cc
@@ -34,7 +34,6 @@
 #include "components/crash/content/app/crashpad.h"
 #include "components/crash/content/app/run_as_crashpad_handler_win.h"
 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
-#include "components/startup_metric_utils/common/pre_read_field_trial_utils_win.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/result_codes.h"
 
@@ -214,9 +213,6 @@
   const std::string process_type =
       command_line->GetSwitchValueASCII(switches::kProcessType);
 
-  startup_metric_utils::InitializePreReadOptions(
-      BrowserDistribution::GetDistribution()->GetRegistryPath());
-
   // Confirm that an explicit prefetch profile is used for all process types
   // except for the browser process. Any new process type will have to assign
   // itself a prefetch id. See kPrefetchArgument* constants in
diff --git a/chrome/app/file_pre_reader_win.cc b/chrome/app/file_pre_reader_win.cc
index f95c0276..c62c8c0d 100644
--- a/chrome/app/file_pre_reader_win.cc
+++ b/chrome/app/file_pre_reader_win.cc
@@ -7,21 +7,16 @@
 #include <windows.h>
 
 #include "base/files/file.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "components/startup_metric_utils/common/pre_read_field_trial_utils_win.h"
 
-namespace {
-
-// Pre-reads |file_path| using ::ReadFile.
-void PreReadFileUsingReadFile(const base::FilePath& file_path) {
+void PreReadFile(const base::FilePath& file_path) {
   base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
                                  base::File::FLAG_SEQUENTIAL_SCAN);
   if (!file.IsValid())
     return;
 
+  // This could be replaced with ::PrefetchVirtualMemory once we drop support
+  // for Win7. The performance of ::PrefetchVirtualMemory is roughly equivalent
+  // to these buffered reads.
   const DWORD kStepSize = 1024 * 1024;
   char* buffer = reinterpret_cast<char*>(
       ::VirtualAlloc(nullptr, kStepSize, MEM_COMMIT, PAGE_READWRITE));
@@ -32,62 +27,3 @@
 
   ::VirtualFree(buffer, 0, MEM_RELEASE);
 }
-
-// Pre-reads |file_path| using ::PrefetchVirtualMemory, if available. Otherwise,
-// falls back on using ::ReadFile.
-void PreReadFileUsingPrefetchVirtualMemory(const base::FilePath& file_path) {
-  // Load ::PrefetchVirtualMemory dynamically, because it is only available on
-  // Win8+.
-  using PrefetchVirtualMemoryPtr = decltype(::PrefetchVirtualMemory)*;
-  PrefetchVirtualMemoryPtr prefetch_virtual_memory =
-      reinterpret_cast<PrefetchVirtualMemoryPtr>(::GetProcAddress(
-          ::GetModuleHandle(L"kernel32.dll"), "PrefetchVirtualMemory"));
-  if (!prefetch_virtual_memory) {
-    // If ::PrefetchVirtualMemory is not available, fall back to
-    // PreReadFileUsingReadFile().
-    PreReadFileUsingReadFile(file_path);
-    return;
-  }
-
-  base::MemoryMappedFile memory_mapped_file;
-  if (!memory_mapped_file.Initialize(file_path)) {
-    // Initializing the memory map should not fail. If it does fail in a debug
-    // build, we want to be warned about it so that we can investigate the
-    // failure.
-    NOTREACHED();
-    PreReadFileUsingReadFile(file_path);
-    return;
-  }
-
-  WIN32_MEMORY_RANGE_ENTRY memory_range;
-  memory_range.VirtualAddress = const_cast<void*>(
-      reinterpret_cast<const void*>(memory_mapped_file.data()));
-  memory_range.NumberOfBytes = memory_mapped_file.length();
-  prefetch_virtual_memory(::GetCurrentProcess(), 1U, &memory_range, 0);
-}
-
-}  // namespace
-
-void PreReadFile(const base::FilePath& file_path,
-                 const startup_metric_utils::PreReadOptions& pre_read_options) {
-  DCHECK(pre_read_options.pre_read);
-  base::ThreadRestrictions::AssertIOAllowed();
-
-  // Increase thread priority if necessary.
-  base::ThreadPriority previous_priority = base::ThreadPriority::NORMAL;
-  if (pre_read_options.high_priority) {
-    previous_priority = base::PlatformThread::GetCurrentThreadPriority();
-    base::PlatformThread::SetCurrentThreadPriority(
-        base::ThreadPriority::DISPLAY);
-  }
-
-  // Pre-read |file_path|.
-  if (pre_read_options.prefetch_virtual_memory)
-    PreReadFileUsingPrefetchVirtualMemory(file_path);
-  else
-    PreReadFileUsingReadFile(file_path);
-
-  // Reset thread priority.
-  if (pre_read_options.high_priority)
-    base::PlatformThread::SetCurrentThreadPriority(previous_priority);
-}
diff --git a/chrome/app/file_pre_reader_win.h b/chrome/app/file_pre_reader_win.h
index 93cc2e7..dcd596c 100644
--- a/chrome/app/file_pre_reader_win.h
+++ b/chrome/app/file_pre_reader_win.h
@@ -12,13 +12,8 @@
 class FilePath;
 }
 
-namespace startup_metric_utils {
-struct PreReadOptions;
-}
-
 // Pre-reads |file_path| to avoid touching the disk when the file is actually
-// used. Checks |pre_read_options| to determine how to pre-read the file.
-void PreReadFile(const base::FilePath& file_path,
-                 const startup_metric_utils::PreReadOptions& pre_read_options);
+// used.
+void PreReadFile(const base::FilePath& file_path);
 
 #endif  // CHROME_APP_FILE_PRE_READER_WIN_H_
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 9175545..8a2e7759 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -13858,10 +13858,10 @@
         Share your screen - <ph name="APP_NAME">$1<ex>Google Hangouts</ex></ph>
       </message>
       <message name="IDS_DESKTOP_MEDIA_PICKER_TEXT" desc="Text for the window picker dialog shown when desktop capture is requested by an app to be used by the app itself.">
-        <ph name="APP_NAME">$1<ex>Google Hangouts</ex></ph> would like to share the contents of your screen. Choose what you'd like to share.
+        <ph name="APP_NAME">$1<ex>Google Hangouts</ex></ph> wants to share the contents of your screen. Choose what you'd like to share.
       </message>
       <message name="IDS_DESKTOP_MEDIA_PICKER_TEXT_DELEGATED" desc="Text for the window picker dialog shown when desktop capture is requested by an app to be used by a tab.">
-        <ph name="APP_NAME">$1<ex>Google Hangouts</ex></ph> would like to share the content of your screen with <ph name="TARGET_NAME">$2<ex>https://google.com</ex></ph>. Choose what you'd like to share.
+        <ph name="APP_NAME">$1<ex>Google Hangouts</ex></ph> wants to share the content of your screen with <ph name="TARGET_NAME">$2<ex>https://google.com</ex></ph>. Choose what you'd like to share.
       </message>
       <message name="IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE" desc="Text for the checkbox on the window picker dialog, when checked, audio will be shared, otherwise just video sharing">
         Share audio
diff --git a/chrome/app/main_dll_loader_win.cc b/chrome/app/main_dll_loader_win.cc
index 96d32137..66a3034e 100644
--- a/chrome/app/main_dll_loader_win.cc
+++ b/chrome/app/main_dll_loader_win.cc
@@ -42,7 +42,6 @@
 #include "chrome/installer/util/install_util.h"
 #include "chrome/installer/util/module_util_win.h"
 #include "chrome/installer/util/util_constants.h"
-#include "components/startup_metric_utils/common/pre_read_field_trial_utils_win.h"
 #include "content/public/app/sandbox_helper_win.h"
 #include "content/public/common/content_switches.h"
 #include "sandbox/win/src/sandbox.h"
@@ -57,20 +56,7 @@
 // reference to the loaded module on success, or null on error.
 HMODULE LoadModuleWithDirectory(const base::FilePath& module) {
   ::SetCurrentDirectoryW(module.DirName().value().c_str());
-
-  const startup_metric_utils::PreReadOptions pre_read_options =
-      startup_metric_utils::GetPreReadOptions();
-
-  // If enabled by the PreRead field trial, pre-read the binary to avoid a lot
-  // of random IO. Don't pre-read the binary if it is chrome_child.dll and the
-  // |pre_read_chrome_child_in_browser| option is enabled; the binary should
-  // already have been pre-read by the browser process in that case.
-  if (pre_read_options.pre_read &&
-      (!pre_read_options.pre_read_chrome_child_in_browser ||
-       module.BaseName().value() != installer::kChromeChildDll)) {
-    PreReadFile(module, pre_read_options);
-  }
-
+  PreReadFile(module);
   return ::LoadLibraryExW(module.value().c_str(), nullptr,
                           LOAD_WITH_ALTERED_SEARCH_PATH);
 }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f8e8aea..2a8c743c 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -23,11 +23,6 @@
 additional_modules_list_file =
     "$root_gen_dir/chrome/browser/internal/additional_modules_list.txt"
 
-gypi_values = exec_script("//build/gypi_to_gn.py",
-                          [ rebase_path("../chrome_browser.gypi") ],
-                          "scope",
-                          [ "../chrome_browser.gypi" ])
-
 if (is_win) {
   # This is in a separate config so the flags can be applied to dependents.
   # ldflags in GN aren't automatically inherited.
@@ -664,6 +659,8 @@
     "page_load_metrics/observers/aborts_page_load_metrics_observer.h",
     "page_load_metrics/observers/core_page_load_metrics_observer.cc",
     "page_load_metrics/observers/core_page_load_metrics_observer.h",
+    "page_load_metrics/observers/css_scanning_page_load_metrics_observer.cc",
+    "page_load_metrics/observers/css_scanning_page_load_metrics_observer.h",
     "page_load_metrics/observers/data_reduction_proxy_metrics_observer.cc",
     "page_load_metrics/observers/data_reduction_proxy_metrics_observer.h",
     "page_load_metrics/observers/document_write_page_load_metrics_observer.cc",
@@ -1332,10 +1329,6 @@
     "//components/ssl_errors",
     "//components/startup_metric_utils/browser:host",
     "//components/startup_metric_utils/browser:lib",
-
-    # TODO(fdoray): Remove this once the PreRead field trial has expired.
-    # crbug.com/577698
-    "//components/startup_metric_utils/common",
     "//components/storage_monitor",
     "//components/strings",
     "//components/subresource_filter/content/browser",
@@ -1434,31 +1427,41 @@
   }
 
   if (android_java_ui) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_sync_android_java_ui_sources,
-                    ".",
-                    "//chrome")
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ssl_android_java_ui_sources,
-                    ".",
-                    "//chrome")
-    sources +=
-        rebase_path(gypi_values.chrome_browser_history_android_java_ui_sources,
-                    ".",
-                    "//chrome")
-    sources += rebase_path(
-            gypi_values.chrome_browser_permissions_android_java_ui_sources,
-            ".",
-            "//chrome")
-    sources += rebase_path(
-            gypi_values.chrome_browser_search_engines_android_java_ui_sources,
-            ".",
-            "//chrome")
+    sources += [
+      "history/android/android_history_provider_service.cc",
+      "history/android/android_history_provider_service.h",
+      "history/android/android_provider_backend.cc",
+      "history/android/android_provider_backend.h",
+      "history/android/bookmark_model_sql_handler.cc",
+      "history/android/bookmark_model_sql_handler.h",
+      "history/android/sqlite_cursor.cc",
+      "history/android/sqlite_cursor.h",
+      "permissions/grouped_permission_infobar_delegate.cc",
+      "permissions/grouped_permission_infobar_delegate.h",
+      "permissions/permission_update_infobar_delegate_android.cc",
+      "permissions/permission_update_infobar_delegate_android.h",
+      "search_engines/template_url_service_android.cc",
+      "search_engines/template_url_service_android.h",
+      "ssl/security_state_model_android.cc",
+      "ssl/security_state_model_android.h",
+      "sync/glue/synced_tab_delegate_android.cc",
+      "sync/glue/synced_tab_delegate_android.h",
+      "sync/glue/synced_window_delegate_android.cc",
+      "sync/glue/synced_window_delegate_android.h",
+      "sync/glue/synced_window_delegates_getter_android.cc",
+      "sync/glue/synced_window_delegates_getter_android.h",
+      "sync/profile_sync_service_android.cc",
+      "sync/profile_sync_service_android.h",
+      "sync/sync_sessions_metrics_android.cc",
+      "sync/sync_sessions_metrics_android.h",
+    ]
     if (enable_supervised_users) {
-      sources += rebase_path(
-              gypi_values.chrome_browser_supervised_user_android_java_ui_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "supervised_user/child_accounts/child_account_feedback_reporter_android.cc",
+        "supervised_user/child_accounts/child_account_feedback_reporter_android.h",
+        "supervised_user/child_accounts/child_account_service_android.cc",
+        "supervised_user/child_accounts/child_account_service_android.h",
+      ]
     }
   }
 
@@ -1467,8 +1470,35 @@
   }
 
   if (is_win || is_mac) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_win_mac_sources, ".", "//chrome")
+    # Sources (generally "desktop OS importers") used only on Mac & Windows.
+    sources += [
+      "crash_upload_list/crash_upload_list_crashpad.cc",
+      "crash_upload_list/crash_upload_list_crashpad.h",
+      "media_galleries/fileapi/file_path_watcher_util.cc",
+      "media_galleries/fileapi/file_path_watcher_util.h",
+      "media_galleries/fileapi/iapps_data_provider.cc",
+      "media_galleries/fileapi/iapps_data_provider.h",
+      "media_galleries/fileapi/itunes_data_provider.cc",
+      "media_galleries/fileapi/itunes_data_provider.h",
+      "media_galleries/fileapi/itunes_file_util.cc",
+      "media_galleries/fileapi/itunes_file_util.h",
+      "media_galleries/fileapi/picasa_data_provider.cc",
+      "media_galleries/fileapi/picasa_data_provider.h",
+      "media_galleries/fileapi/picasa_file_util.cc",
+      "media_galleries/fileapi/picasa_file_util.h",
+      "media_galleries/fileapi/safe_iapps_library_parser.cc",
+      "media_galleries/fileapi/safe_iapps_library_parser.h",
+      "media_galleries/fileapi/safe_itunes_pref_parser_win.cc",
+      "media_galleries/fileapi/safe_itunes_pref_parser_win.h",
+      "media_galleries/fileapi/safe_picasa_album_table_reader.cc",
+      "media_galleries/fileapi/safe_picasa_album_table_reader.h",
+      "media_galleries/fileapi/safe_picasa_albums_indexer.cc",
+      "media_galleries/fileapi/safe_picasa_albums_indexer.h",
+      "recovery/recovery_install_global_error.cc",
+      "recovery/recovery_install_global_error.h",
+      "recovery/recovery_install_global_error_factory.cc",
+      "recovery/recovery_install_global_error_factory.h",
+    ]
   }
   if (!is_win && !is_mac) {
     sources += [ "net/net_error_diagnostics_dialog_generic.cc" ]
@@ -1480,14 +1510,214 @@
     ]
   }
   if (is_mac) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_mac_sources, ".", "//chrome")
+    sources += [
+      "media/window_icon_util_mac.mm",
+      "password_manager/password_manager_util_mac.h",
+      "password_manager/password_manager_util_mac.mm",
+    ]
     deps += [
       "//chrome/app_shim",
       "//chrome/browser/apps/app_shim",
     ]
   }
   if (enable_extensions) {
+    sources += [
+      "accessibility/accessibility_extension_api.cc",
+      "accessibility/accessibility_extension_api.h",
+      "accessibility/animation_policy_prefs.cc",
+      "accessibility/animation_policy_prefs.h",
+      "autocomplete/keyword_extensions_delegate_impl.cc",
+      "autocomplete/keyword_extensions_delegate_impl.h",
+      "browsing_data/hosted_apps_counter.cc",
+      "browsing_data/hosted_apps_counter.h",
+      "content_settings/content_settings_internal_extension_provider.cc",
+      "content_settings/content_settings_internal_extension_provider.h",
+      "drive/drive_notification_manager_factory.cc",
+      "drive/drive_notification_manager_factory.h",
+      "guest_view/app_view/chrome_app_view_guest_delegate.cc",
+      "guest_view/app_view/chrome_app_view_guest_delegate.h",
+      "guest_view/chrome_guest_view_manager_delegate.cc",
+      "guest_view/chrome_guest_view_manager_delegate.h",
+      "guest_view/extension_options/chrome_extension_options_guest_delegate.cc",
+      "guest_view/extension_options/chrome_extension_options_guest_delegate.h",
+      "guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc",
+      "guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h",
+      "guest_view/web_view/chrome_web_view_guest_delegate.cc",
+      "guest_view/web_view/chrome_web_view_guest_delegate.h",
+      "guest_view/web_view/chrome_web_view_permission_helper_delegate.cc",
+      "guest_view/web_view/chrome_web_view_permission_helper_delegate.h",
+      "guest_view/web_view/context_menu_content_type_web_view.cc",
+      "guest_view/web_view/context_menu_content_type_web_view.h",
+      "media/capture_access_handler_base.cc",
+      "media/capture_access_handler_base.h",
+      "media/cast_transport_host_filter.cc",
+      "media/cast_transport_host_filter.h",
+      "media/desktop_capture_access_handler.cc",
+      "media/desktop_capture_access_handler.h",
+      "media/extension_media_access_handler.cc",
+      "media/extension_media_access_handler.h",
+      "media/tab_capture_access_handler.cc",
+      "media/tab_capture_access_handler.h",
+      "metrics/extensions_metrics_provider.cc",
+      "metrics/extensions_metrics_provider.h",
+      "renderer_context_menu/context_menu_content_type_app_mode.cc",
+      "renderer_context_menu/context_menu_content_type_app_mode.h",
+      "renderer_context_menu/context_menu_content_type_extension_popup.cc",
+      "renderer_context_menu/context_menu_content_type_extension_popup.h",
+      "renderer_context_menu/context_menu_content_type_platform_app.cc",
+      "renderer_context_menu/context_menu_content_type_platform_app.h",
+      "renderer_host/chrome_extension_message_filter.cc",
+      "renderer_host/chrome_extension_message_filter.h",
+      "search/hotword_audio_history_handler.cc",
+      "search/hotword_audio_history_handler.h",
+      "search/hotword_client.h",
+      "search/hotword_service.cc",
+      "search/hotword_service.h",
+      "search/hotword_service_factory.cc",
+      "search/hotword_service_factory.h",
+      "signin/chrome_proximity_auth_client.cc",
+      "signin/chrome_proximity_auth_client.h",
+      "signin/easy_unlock_app_manager.cc",
+      "signin/easy_unlock_app_manager.h",
+      "signin/easy_unlock_auth_attempt.cc",
+      "signin/easy_unlock_auth_attempt.h",
+      "signin/easy_unlock_metrics.cc",
+      "signin/easy_unlock_metrics.h",
+      "signin/easy_unlock_screenlock_state_handler.cc",
+      "signin/easy_unlock_screenlock_state_handler.h",
+      "signin/easy_unlock_service.cc",
+      "signin/easy_unlock_service.h",
+      "signin/easy_unlock_service_factory.cc",
+      "signin/easy_unlock_service_factory.h",
+      "signin/easy_unlock_service_regular.cc",
+      "signin/easy_unlock_service_regular.h",
+      "signin/easy_unlock_service_signin_chromeos.cc",
+      "signin/easy_unlock_service_signin_chromeos.h",
+      "speech/extension_api/tts_engine_extension_api.cc",
+      "speech/extension_api/tts_engine_extension_api.h",
+      "speech/extension_api/tts_engine_extension_observer.cc",
+      "speech/extension_api/tts_engine_extension_observer.h",
+      "speech/extension_api/tts_extension_api.cc",
+      "speech/extension_api/tts_extension_api.h",
+      "sync_file_system/conflict_resolution_policy.h",
+      "sync_file_system/drive_backend/callback_helper.h",
+      "sync_file_system/drive_backend/callback_tracker.cc",
+      "sync_file_system/drive_backend/callback_tracker.h",
+      "sync_file_system/drive_backend/callback_tracker_internal.cc",
+      "sync_file_system/drive_backend/callback_tracker_internal.h",
+      "sync_file_system/drive_backend/conflict_resolver.cc",
+      "sync_file_system/drive_backend/conflict_resolver.h",
+      "sync_file_system/drive_backend/drive_backend_constants.cc",
+      "sync_file_system/drive_backend/drive_backend_constants.h",
+      "sync_file_system/drive_backend/drive_backend_util.cc",
+      "sync_file_system/drive_backend/drive_backend_util.h",
+      "sync_file_system/drive_backend/drive_service_on_worker.cc",
+      "sync_file_system/drive_backend/drive_service_on_worker.h",
+      "sync_file_system/drive_backend/drive_service_wrapper.cc",
+      "sync_file_system/drive_backend/drive_service_wrapper.h",
+      "sync_file_system/drive_backend/drive_uploader_on_worker.cc",
+      "sync_file_system/drive_backend/drive_uploader_on_worker.h",
+      "sync_file_system/drive_backend/drive_uploader_wrapper.cc",
+      "sync_file_system/drive_backend/drive_uploader_wrapper.h",
+      "sync_file_system/drive_backend/folder_creator.cc",
+      "sync_file_system/drive_backend/folder_creator.h",
+      "sync_file_system/drive_backend/leveldb_wrapper.cc",
+      "sync_file_system/drive_backend/leveldb_wrapper.h",
+      "sync_file_system/drive_backend/list_changes_task.cc",
+      "sync_file_system/drive_backend/list_changes_task.h",
+      "sync_file_system/drive_backend/local_to_remote_syncer.cc",
+      "sync_file_system/drive_backend/local_to_remote_syncer.h",
+      "sync_file_system/drive_backend/metadata_database.cc",
+      "sync_file_system/drive_backend/metadata_database.h",
+      "sync_file_system/drive_backend/metadata_database_index.cc",
+      "sync_file_system/drive_backend/metadata_database_index.h",
+      "sync_file_system/drive_backend/metadata_database_index_interface.h",
+      "sync_file_system/drive_backend/metadata_database_index_on_disk.cc",
+      "sync_file_system/drive_backend/metadata_database_index_on_disk.h",
+      "sync_file_system/drive_backend/metadata_db_migration_util.cc",
+      "sync_file_system/drive_backend/metadata_db_migration_util.h",
+      "sync_file_system/drive_backend/register_app_task.cc",
+      "sync_file_system/drive_backend/register_app_task.h",
+      "sync_file_system/drive_backend/remote_change_processor_on_worker.cc",
+      "sync_file_system/drive_backend/remote_change_processor_on_worker.h",
+      "sync_file_system/drive_backend/remote_change_processor_wrapper.cc",
+      "sync_file_system/drive_backend/remote_change_processor_wrapper.h",
+      "sync_file_system/drive_backend/remote_to_local_syncer.cc",
+      "sync_file_system/drive_backend/remote_to_local_syncer.h",
+      "sync_file_system/drive_backend/sync_engine.cc",
+      "sync_file_system/drive_backend/sync_engine.h",
+      "sync_file_system/drive_backend/sync_engine_context.cc",
+      "sync_file_system/drive_backend/sync_engine_context.h",
+      "sync_file_system/drive_backend/sync_engine_initializer.cc",
+      "sync_file_system/drive_backend/sync_engine_initializer.h",
+      "sync_file_system/drive_backend/sync_task.cc",
+      "sync_file_system/drive_backend/sync_task.h",
+      "sync_file_system/drive_backend/sync_task_manager.cc",
+      "sync_file_system/drive_backend/sync_task_manager.h",
+      "sync_file_system/drive_backend/sync_task_token.cc",
+      "sync_file_system/drive_backend/sync_task_token.h",
+      "sync_file_system/drive_backend/sync_worker.cc",
+      "sync_file_system/drive_backend/sync_worker.h",
+      "sync_file_system/drive_backend/sync_worker_interface.h",
+      "sync_file_system/drive_backend/task_dependency_manager.cc",
+      "sync_file_system/drive_backend/task_dependency_manager.h",
+      "sync_file_system/drive_backend/tracker_id_set.cc",
+      "sync_file_system/drive_backend/tracker_id_set.h",
+      "sync_file_system/drive_backend/uninstall_app_task.cc",
+      "sync_file_system/drive_backend/uninstall_app_task.h",
+      "sync_file_system/file_change.cc",
+      "sync_file_system/file_change.h",
+      "sync_file_system/file_status_observer.h",
+      "sync_file_system/local/local_file_change_tracker.cc",
+      "sync_file_system/local/local_file_change_tracker.h",
+      "sync_file_system/local/local_file_sync_context.cc",
+      "sync_file_system/local/local_file_sync_context.h",
+      "sync_file_system/local/local_file_sync_service.cc",
+      "sync_file_system/local/local_file_sync_service.h",
+      "sync_file_system/local/local_file_sync_status.cc",
+      "sync_file_system/local/local_file_sync_status.h",
+      "sync_file_system/local/local_origin_change_observer.h",
+      "sync_file_system/local/root_delete_helper.cc",
+      "sync_file_system/local/root_delete_helper.h",
+      "sync_file_system/local/sync_file_system_backend.cc",
+      "sync_file_system/local/sync_file_system_backend.h",
+      "sync_file_system/local/syncable_file_operation_runner.cc",
+      "sync_file_system/local/syncable_file_operation_runner.h",
+      "sync_file_system/local/syncable_file_system_operation.cc",
+      "sync_file_system/local/syncable_file_system_operation.h",
+      "sync_file_system/local_change_processor.h",
+      "sync_file_system/logger.cc",
+      "sync_file_system/logger.h",
+      "sync_file_system/remote_change_processor.h",
+      "sync_file_system/remote_file_sync_service.cc",
+      "sync_file_system/remote_file_sync_service.h",
+      "sync_file_system/subtree_set.cc",
+      "sync_file_system/subtree_set.h",
+      "sync_file_system/sync_action.cc",
+      "sync_file_system/sync_action.h",
+      "sync_file_system/sync_callbacks.h",
+      "sync_file_system/sync_direction.h",
+      "sync_file_system/sync_event_observer.h",
+      "sync_file_system/sync_file_metadata.cc",
+      "sync_file_system/sync_file_metadata.h",
+      "sync_file_system/sync_file_status.h",
+      "sync_file_system/sync_file_system_service.cc",
+      "sync_file_system/sync_file_system_service.h",
+      "sync_file_system/sync_file_system_service_factory.cc",
+      "sync_file_system/sync_file_system_service_factory.h",
+      "sync_file_system/sync_file_type.h",
+      "sync_file_system/sync_operation_type.cc",
+      "sync_file_system/sync_operation_type.h",
+      "sync_file_system/sync_process_runner.cc",
+      "sync_file_system/sync_process_runner.h",
+      "sync_file_system/sync_service_state.h",
+      "sync_file_system/sync_status_code.cc",
+      "sync_file_system/sync_status_code.h",
+      "sync_file_system/syncable_file_system_util.cc",
+      "sync_file_system/syncable_file_system_util.h",
+      "sync_file_system/task_logger.cc",
+      "sync_file_system/task_logger.h",
+    ]
     public_deps += [ "//chrome/browser/extensions" ]
     allow_circular_includes_from += [ "//chrome/browser/extensions" ]
     deps += [
@@ -1501,33 +1731,122 @@
       "//extensions/components/javascript_dialog_extensions_client",
       "//media/cast:net",
     ]
-    sources += rebase_path(gypi_values.chrome_browser_extensions_sources,
-                           ".",
-                           "//chrome")
   }
   if (enable_background) {
-    sources += rebase_path(gypi_values.chrome_browser_background_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "background/background_application_list_model.cc",
+      "background/background_application_list_model.h",
+      "background/background_contents_service.cc",
+      "background/background_contents_service.h",
+      "background/background_contents_service_factory.cc",
+      "background/background_contents_service_factory.h",
+      "background/background_mode_manager.cc",
+      "background/background_mode_manager.h",
+      "background/background_mode_manager_aura.cc",
+      "background/background_mode_manager_chromeos.cc",
+      "background/background_mode_manager_mac.mm",
+      "background/background_mode_manager_win.cc",
+      "background/background_mode_optimizer.cc",
+      "background/background_mode_optimizer.h",
+      "background/background_trigger.h",
+    ]
     if (!use_aura || is_win || is_chromeos) {
       sources -= [ "background/background_mode_manager_aura.cc" ]
     }
   }
   if (enable_task_manager) {
-    sources += rebase_path(gypi_values.chrome_browser_task_manager_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "task_manager/providers/browser_process_task.cc",
+      "task_manager/providers/browser_process_task.h",
+      "task_manager/providers/browser_process_task_provider.cc",
+      "task_manager/providers/browser_process_task_provider.h",
+      "task_manager/providers/child_process_task.cc",
+      "task_manager/providers/child_process_task.h",
+      "task_manager/providers/child_process_task_provider.cc",
+      "task_manager/providers/child_process_task_provider.h",
+      "task_manager/providers/task.cc",
+      "task_manager/providers/task.h",
+      "task_manager/providers/task_provider.cc",
+      "task_manager/providers/task_provider.h",
+      "task_manager/providers/task_provider_observer.h",
+      "task_manager/providers/web_contents/background_contents_tag.cc",
+      "task_manager/providers/web_contents/background_contents_tag.h",
+      "task_manager/providers/web_contents/background_contents_task.cc",
+      "task_manager/providers/web_contents/background_contents_task.h",
+      "task_manager/providers/web_contents/devtools_tag.cc",
+      "task_manager/providers/web_contents/devtools_tag.h",
+      "task_manager/providers/web_contents/devtools_task.cc",
+      "task_manager/providers/web_contents/devtools_task.h",
+      "task_manager/providers/web_contents/extension_tag.cc",
+      "task_manager/providers/web_contents/extension_tag.h",
+      "task_manager/providers/web_contents/extension_task.cc",
+      "task_manager/providers/web_contents/extension_task.h",
+      "task_manager/providers/web_contents/guest_tag.cc",
+      "task_manager/providers/web_contents/guest_tag.h",
+      "task_manager/providers/web_contents/guest_task.cc",
+      "task_manager/providers/web_contents/guest_task.h",
+      "task_manager/providers/web_contents/prerender_tag.cc",
+      "task_manager/providers/web_contents/prerender_tag.h",
+      "task_manager/providers/web_contents/prerender_task.cc",
+      "task_manager/providers/web_contents/prerender_task.h",
+      "task_manager/providers/web_contents/printing_tag.cc",
+      "task_manager/providers/web_contents/printing_tag.h",
+      "task_manager/providers/web_contents/printing_task.cc",
+      "task_manager/providers/web_contents/printing_task.h",
+      "task_manager/providers/web_contents/renderer_task.cc",
+      "task_manager/providers/web_contents/renderer_task.h",
+      "task_manager/providers/web_contents/subframe_task.cc",
+      "task_manager/providers/web_contents/subframe_task.h",
+      "task_manager/providers/web_contents/tab_contents_tag.cc",
+      "task_manager/providers/web_contents/tab_contents_tag.h",
+      "task_manager/providers/web_contents/tab_contents_task.cc",
+      "task_manager/providers/web_contents/tab_contents_task.h",
+      "task_manager/providers/web_contents/web_contents_tag.cc",
+      "task_manager/providers/web_contents/web_contents_tag.h",
+      "task_manager/providers/web_contents/web_contents_tags_manager.cc",
+      "task_manager/providers/web_contents/web_contents_tags_manager.h",
+      "task_manager/providers/web_contents/web_contents_task_provider.cc",
+      "task_manager/providers/web_contents/web_contents_task_provider.h",
+      "task_manager/sampling/shared_sampler.h",
+      "task_manager/sampling/shared_sampler_posix.cc",
+      "task_manager/sampling/shared_sampler_win.cc",
+      "task_manager/sampling/task_group.cc",
+      "task_manager/sampling/task_group.h",
+      "task_manager/sampling/task_group_sampler.cc",
+      "task_manager/sampling/task_group_sampler.h",
+      "task_manager/sampling/task_manager_impl.cc",
+      "task_manager/sampling/task_manager_impl.h",
+      "task_manager/sampling/task_manager_io_thread_helper.cc",
+      "task_manager/sampling/task_manager_io_thread_helper.h",
+      "task_manager/task_manager_interface.cc",
+      "task_manager/task_manager_interface.h",
+      "task_manager/task_manager_observer.cc",
+      "task_manager/task_manager_observer.h",
+    ]
     if (is_chromeos) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_task_manager_chromeos_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "task_manager/providers/arc/arc_process_task.cc",
+        "task_manager/providers/arc/arc_process_task.h",
+        "task_manager/providers/arc/arc_process_task_provider.cc",
+        "task_manager/providers/arc/arc_process_task_provider.h",
+      ]
     }
   }
   if (enable_spellcheck) {
-    sources += rebase_path(gypi_values.chrome_browser_spellchecker_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "spellchecker/spellcheck_custom_dictionary.cc",
+      "spellchecker/spellcheck_custom_dictionary.h",
+      "spellchecker/spellcheck_dictionary.h",
+      "spellchecker/spellcheck_factory.cc",
+      "spellchecker/spellcheck_factory.h",
+      "spellchecker/spellcheck_hunspell_dictionary.cc",
+      "spellchecker/spellcheck_hunspell_dictionary.h",
+      "spellchecker/spellcheck_message_filter.cc",
+      "spellchecker/spellcheck_message_filter.h",
+      "spellchecker/spellcheck_message_filter_platform_mac.cc",
+      "spellchecker/spellcheck_service.cc",
+      "spellchecker/spellcheck_service.h",
+    ]
     deps += [
       "//components/spellcheck/browser",
       "//components/spellcheck/common:common",
@@ -1538,14 +1857,73 @@
     }
   }
   if (enable_nacl) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_nacl_sources, ".", "//chrome")
+    sources += [
+      "nacl_host/nacl_browser_delegate_impl.cc",
+      "nacl_host/nacl_browser_delegate_impl.h",
+      "nacl_host/nacl_infobar_delegate.cc",
+      "nacl_host/nacl_infobar_delegate.h",
+    ]
     deps += [ "//components/nacl/browser" ]
   }
 
   if (enable_plugins) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_plugins_sources, ".", "//chrome")
+    # See also the plugin_installation_sources list below.
+    sources += [
+      "browsing_data/browsing_data_flash_lso_helper.cc",
+      "browsing_data/browsing_data_flash_lso_helper.h",
+      "component_updater/pepper_flash_component_installer.cc",
+      "component_updater/pepper_flash_component_installer.h",
+      "metrics/plugin_metrics_provider.cc",
+      "metrics/plugin_metrics_provider.h",
+      "pepper_broker_infobar_delegate.cc",
+      "pepper_broker_infobar_delegate.h",
+      "pepper_flash_settings_manager.cc",
+      "pepper_flash_settings_manager.h",
+      "plugins/chrome_content_browser_client_plugins_part.cc",
+      "plugins/chrome_content_browser_client_plugins_part.h",
+      "plugins/chrome_plugin_service_filter.cc",
+      "plugins/chrome_plugin_service_filter.h",
+      "plugins/plugin_data_remover_helper.cc",
+      "plugins/plugin_data_remover_helper.h",
+      "plugins/plugin_filter_utils.cc",
+      "plugins/plugin_filter_utils.h",
+      "plugins/plugin_finder.cc",
+      "plugins/plugin_finder.h",
+      "plugins/plugin_info_message_filter.cc",
+      "plugins/plugin_info_message_filter.h",
+      "plugins/plugin_infobar_delegates.cc",
+      "plugins/plugin_infobar_delegates.h",
+      "plugins/plugin_metadata.cc",
+      "plugins/plugin_metadata.h",
+      "plugins/plugin_observer.cc",
+      "plugins/plugin_observer.h",
+      "plugins/plugin_prefs.cc",
+      "plugins/plugin_prefs.h",
+      "plugins/plugin_prefs_factory.cc",
+      "plugins/plugin_prefs_factory.h",
+      "plugins/plugin_status_pref_setter.cc",
+      "plugins/plugin_status_pref_setter.h",
+      "plugins/plugins_field_trial.cc",
+      "plugins/plugins_field_trial.h",
+      "renderer_host/pepper/chrome_browser_pepper_host_factory.cc",
+      "renderer_host/pepper/chrome_browser_pepper_host_factory.h",
+      "renderer_host/pepper/device_id_fetcher.cc",
+      "renderer_host/pepper/device_id_fetcher.h",
+      "renderer_host/pepper/monitor_finder_mac.h",
+      "renderer_host/pepper/monitor_finder_mac.mm",
+      "renderer_host/pepper/pepper_broker_message_filter.cc",
+      "renderer_host/pepper/pepper_broker_message_filter.h",
+      "renderer_host/pepper/pepper_flash_browser_host.cc",
+      "renderer_host/pepper/pepper_flash_browser_host.h",
+      "renderer_host/pepper/pepper_flash_clipboard_message_filter.cc",
+      "renderer_host/pepper/pepper_flash_clipboard_message_filter.h",
+      "renderer_host/pepper/pepper_flash_drm_host.cc",
+      "renderer_host/pepper/pepper_flash_drm_host.h",
+      "renderer_host/pepper/pepper_isolated_file_system_message_filter.cc",
+      "renderer_host/pepper/pepper_isolated_file_system_message_filter.h",
+      "renderer_host/pepper/pepper_output_protection_message_filter.cc",
+      "renderer_host/pepper/pepper_output_protection_message_filter.h",
+    ]
     deps += [
       "//components/pdf/browser",
       "//ppapi/proxy:ipc",
@@ -1553,28 +1931,162 @@
     ]
   }
   if (safe_browsing_mode != 0) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_safe_browsing_basic_sources,
-                    ".",
-                    "//chrome")
+    # "Safe Browsing Basic" files used for safe browsing in full mode
+    # (safe_browsing=1) and mobile (=2)
+    sources += [
+      "renderer_host/data_reduction_proxy_resource_throttle_android.cc",
+      "renderer_host/data_reduction_proxy_resource_throttle_android.h",
+      "safe_browsing/mock_permission_report_sender.cc",
+      "safe_browsing/mock_permission_report_sender.h",
+      "safe_browsing/permission_reporter.cc",
+      "safe_browsing/permission_reporter.h",
+      "safe_browsing/ping_manager.cc",
+      "safe_browsing/ping_manager.h",
+      "safe_browsing/protocol_manager_helper.cc",
+      "safe_browsing/protocol_manager_helper.h",
+      "safe_browsing/safe_browsing_blocking_page.cc",
+      "safe_browsing/safe_browsing_blocking_page.h",
+      "safe_browsing/safe_browsing_service.cc",
+      "safe_browsing/safe_browsing_service.h",
+      "safe_browsing/services_delegate.h",
+      "safe_browsing/test_safe_browsing_service.cc",
+      "safe_browsing/test_safe_browsing_service.h",
+      "safe_browsing/threat_details.cc",
+      "safe_browsing/threat_details.h",
+      "safe_browsing/threat_details_cache.cc",
+      "safe_browsing/threat_details_cache.h",
+      "safe_browsing/threat_details_history.cc",
+      "safe_browsing/threat_details_history.h",
+      "safe_browsing/ui_manager.cc",
+      "safe_browsing/ui_manager.h",
+    ]
     deps += [
       "//chrome/browser/safe_browsing:chunk_proto",
       "//chrome/common/safe_browsing:proto",
       "//components/safe_browsing_db:metadata_proto",
     ]
     if (safe_browsing_mode == 1) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_safe_browsing_full_sources,
-                      ".",
-                      "//chrome")
+      # "Safe Browsing Full" files in addition to the "basic" ones to use for
+      # full safe browsing. This has some in common with "mobile."
+      sources += [
+        "download/download_completion_blocker.cc",
+        "download/download_completion_blocker.h",
+        "renderer_host/safe_browsing_resource_throttle.cc",
+        "renderer_host/safe_browsing_resource_throttle.h",
+        "safe_browsing/browser_feature_extractor.cc",
+        "safe_browsing/browser_feature_extractor.h",
+        "safe_browsing/browser_features.cc",
+        "safe_browsing/browser_features.h",
+        "safe_browsing/chunk_range.cc",
+        "safe_browsing/chunk_range.h",
+        "safe_browsing/client_side_detection_host.cc",
+        "safe_browsing/client_side_detection_host.h",
+        "safe_browsing/client_side_detection_service.cc",
+        "safe_browsing/client_side_detection_service.h",
+        "safe_browsing/client_side_model_loader.cc",
+        "safe_browsing/client_side_model_loader.h",
+        "safe_browsing/download_feedback.cc",
+        "safe_browsing/download_feedback.h",
+        "safe_browsing/download_feedback_service.cc",
+        "safe_browsing/download_feedback_service.h",
+        "safe_browsing/download_protection_service.cc",
+        "safe_browsing/download_protection_service.h",
+        "safe_browsing/incident_reporting/binary_integrity_analyzer.cc",
+        "safe_browsing/incident_reporting/binary_integrity_analyzer.h",
+        "safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc",
+        "safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc",
+        "safe_browsing/incident_reporting/binary_integrity_incident.cc",
+        "safe_browsing/incident_reporting/binary_integrity_incident.h",
+        "safe_browsing/incident_reporting/blacklist_load_analyzer.cc",
+        "safe_browsing/incident_reporting/blacklist_load_analyzer.h",
+        "safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc",
+        "safe_browsing/incident_reporting/blacklist_load_incident.cc",
+        "safe_browsing/incident_reporting/blacklist_load_incident.h",
+        "safe_browsing/incident_reporting/delayed_analysis_callback.h",
+        "safe_browsing/incident_reporting/delayed_callback_runner.cc",
+        "safe_browsing/incident_reporting/delayed_callback_runner.h",
+        "safe_browsing/incident_reporting/download_metadata_manager.cc",
+        "safe_browsing/incident_reporting/download_metadata_manager.h",
+        "safe_browsing/incident_reporting/environment_data_collection.cc",
+        "safe_browsing/incident_reporting/environment_data_collection.h",
+        "safe_browsing/incident_reporting/environment_data_collection_win.cc",
+        "safe_browsing/incident_reporting/environment_data_collection_win.h",
+        "safe_browsing/incident_reporting/extension_data_collection.cc",
+        "safe_browsing/incident_reporting/extension_data_collection.h",
+        "safe_browsing/incident_reporting/incident.cc",
+        "safe_browsing/incident_reporting/incident.h",
+        "safe_browsing/incident_reporting/incident_handler_util.cc",
+        "safe_browsing/incident_reporting/incident_handler_util.h",
+        "safe_browsing/incident_reporting/incident_receiver.h",
+        "safe_browsing/incident_reporting/incident_report_uploader.cc",
+        "safe_browsing/incident_reporting/incident_report_uploader.h",
+        "safe_browsing/incident_reporting/incident_report_uploader_impl.cc",
+        "safe_browsing/incident_reporting/incident_report_uploader_impl.h",
+        "safe_browsing/incident_reporting/incident_reporting_service.cc",
+        "safe_browsing/incident_reporting/incident_reporting_service.h",
+        "safe_browsing/incident_reporting/last_download_finder.cc",
+        "safe_browsing/incident_reporting/last_download_finder.h",
+        "safe_browsing/incident_reporting/module_integrity_verifier_win.cc",
+        "safe_browsing/incident_reporting/module_integrity_verifier_win.h",
+        "safe_browsing/incident_reporting/module_load_analyzer.cc",
+        "safe_browsing/incident_reporting/module_load_analyzer.h",
+        "safe_browsing/incident_reporting/module_load_analyzer_win.cc",
+        "safe_browsing/incident_reporting/platform_state_store.cc",
+        "safe_browsing/incident_reporting/platform_state_store.h",
+        "safe_browsing/incident_reporting/platform_state_store_win.cc",
+        "safe_browsing/incident_reporting/preference_validation_delegate.cc",
+        "safe_browsing/incident_reporting/preference_validation_delegate.h",
+        "safe_browsing/incident_reporting/resource_request_detector.cc",
+        "safe_browsing/incident_reporting/resource_request_detector.h",
+        "safe_browsing/incident_reporting/resource_request_incident.cc",
+        "safe_browsing/incident_reporting/resource_request_incident.h",
+        "safe_browsing/incident_reporting/state_store.cc",
+        "safe_browsing/incident_reporting/state_store.h",
+        "safe_browsing/incident_reporting/suspicious_module_incident.cc",
+        "safe_browsing/incident_reporting/suspicious_module_incident.h",
+        "safe_browsing/incident_reporting/tracked_preference_incident.cc",
+        "safe_browsing/incident_reporting/tracked_preference_incident.h",
+        "safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc",
+        "safe_browsing/incident_reporting/variations_seed_signature_analyzer.h",
+        "safe_browsing/incident_reporting/variations_seed_signature_incident.cc",
+        "safe_browsing/incident_reporting/variations_seed_signature_incident.h",
+        "safe_browsing/local_database_manager.cc",
+        "safe_browsing/local_database_manager.h",
+        "safe_browsing/path_sanitizer.cc",
+        "safe_browsing/path_sanitizer.h",
+        "safe_browsing/protocol_manager.cc",
+        "safe_browsing/protocol_manager.h",
+        "safe_browsing/protocol_parser.cc",
+        "safe_browsing/protocol_parser.h",
+        "safe_browsing/safe_browsing_database.cc",
+        "safe_browsing/safe_browsing_database.h",
+        "safe_browsing/safe_browsing_store.cc",
+        "safe_browsing/safe_browsing_store.h",
+        "safe_browsing/safe_browsing_store_file.cc",
+        "safe_browsing/safe_browsing_store_file.h",
+        "safe_browsing/safe_browsing_util.cc",
+        "safe_browsing/safe_browsing_util.h",
+        "safe_browsing/sandboxed_dmg_analyzer_mac.cc",
+        "safe_browsing/sandboxed_dmg_analyzer_mac.h",
+        "safe_browsing/sandboxed_zip_analyzer.cc",
+        "safe_browsing/sandboxed_zip_analyzer.h",
+        "safe_browsing/services_delegate_impl.cc",
+        "safe_browsing/services_delegate_impl.h",
+        "safe_browsing/signature_evaluator_mac.h",
+        "safe_browsing/signature_evaluator_mac.mm",
+        "safe_browsing/two_phase_uploader.cc",
+        "safe_browsing/two_phase_uploader.h",
+      ]
       if (is_win) {
         deps += [ "//chrome/browser/safe_browsing/incident_reporting:state_store_data_proto" ]
       }
     } else if (safe_browsing_mode == 2) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_safe_browsing_mobile_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "renderer_host/safe_browsing_resource_throttle.cc",
+        "renderer_host/safe_browsing_resource_throttle.h",
+        "safe_browsing/services_delegate_stub.cc",
+        "safe_browsing/services_delegate_stub.h",
+      ]
       deps += [ "//components/safe_browsing_db:safe_browsing_db_mobile" ]
     }
   }
@@ -1596,14 +2108,44 @@
   }
 
   if (is_chromeos) {
-    sources += rebase_path(gypi_values.chrome_browser_chromeos_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "download/notification/download_item_notification.cc",
+      "download/notification/download_item_notification.h",
+      "download/notification/download_notification.cc",
+      "download/notification/download_notification.h",
+      "download/notification/download_notification_manager.cc",
+      "download/notification/download_notification_manager.h",
+      "media/protected_media_identifier_permission_context.cc",
+      "media/protected_media_identifier_permission_context.h",
+      "media/window_icon_util_chromeos.cc",
+      "metrics/chromeos_metrics_provider.cc",
+      "metrics/chromeos_metrics_provider.h",
+      "metrics/perf/cpu_identity.cc",
+      "metrics/perf/cpu_identity.h",
+      "metrics/perf/perf_output.cc",
+      "metrics/perf/perf_output.h",
+      "metrics/perf/random_selector.cc",
+      "metrics/perf/random_selector.h",
+      "metrics/perf/windowed_incognito_observer.cc",
+      "metrics/perf/windowed_incognito_observer.h",
+      "policy/default_geolocation_policy_handler.cc",
+      "policy/default_geolocation_policy_handler.h",
+
+      # This is technically also dependent on enable_plugins but we don"t
+      # support ChromeOS with enable_plugins==0.
+      "renderer_host/pepper/pepper_platform_verification_message_filter.cc",
+      "renderer_host/pepper/pepper_platform_verification_message_filter.h",
+    ]
     deps += [ "//chrome/browser/chromeos" ]
   } else {  # Non-ChromeOS.
-    sources += rebase_path(gypi_values.chrome_browser_non_chromeos_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "policy/cloud/user_cloud_policy_manager_factory.cc",
+      "policy/cloud/user_cloud_policy_manager_factory.h",
+      "policy/cloud/user_policy_signin_service_base.cc",
+      "policy/cloud/user_policy_signin_service_base.h",
+      "policy/cloud/user_policy_signin_service_factory.cc",
+      "policy/cloud/user_policy_signin_service_factory.h",
+    ]
   }
 
   if (is_chromeos) {
@@ -1630,21 +2172,28 @@
     configs += [ "//printing:cups" ]
   }
   if (use_gnome_keyring) {
-    sources += rebase_path(gypi_values.chrome_browser_gnome_keyring_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "password_manager/native_backend_gnome_x.cc",
+      "password_manager/native_backend_gnome_x.h",
+    ]
     configs += [ "//components/os_crypt:gnome_keyring" ]
   }
   if (is_desktop_linux) {
-    sources += rebase_path(gypi_values.chrome_browser_libsecret_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "password_manager/native_backend_libsecret.cc",
+      "password_manager/native_backend_libsecret.h",
+    ]
     defines += [ "USE_LIBSECRET" ]
     deps += [ "//third_party/libsecret" ]
   }
   if (use_aura) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_aura_sources, ".", "//chrome")
+    # Cross-platform Aura files.
+    sources += [
+      # This file is called _views but has Aura calls in it.
+      "download/drag_download_item_views.cc",
+      "lifetime/application_lifetime_aura.cc",
+      "platform_util_aura.cc",
+    ]
 
     # These files are only built in a GN build because they bring in
     # dependencies that don't build with GYP.
@@ -1668,14 +2217,29 @@
   }
 
   if (use_ash) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ash_sources, ".", "//chrome")
+    # Cross-platform Ash sources.
+    sources += [
+      "media/desktop_media_list_ash.cc",
+      "media/desktop_media_list_ash.h",
+      "renderer_context_menu/open_with_menu_factory_ash.cc",
+      "renderer_context_menu/open_with_menu_factory_ash.h",
+      "signin/signin_error_notifier_ash.cc",
+      "signin/signin_error_notifier_ash.h",
+      "signin/signin_error_notifier_factory_ash.cc",
+      "signin/signin_error_notifier_factory_ash.h",
+      "sync/sync_error_notifier_ash.cc",
+      "sync/sync_error_notifier_ash.h",
+      "sync/sync_error_notifier_factory_ash.cc",
+      "sync/sync_error_notifier_factory_ash.h",
+    ]
     deps += [ "//ash" ]
   }
 
   if (use_x11) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_x11_sources, ".", "//chrome")
+    sources += [
+      "chrome_browser_main_extra_parts_x11.cc",
+      "chrome_browser_main_extra_parts_x11.h",
+    ]
   } else {
     sources -= [ "password_manager/password_store_x.cc" ]
   }
@@ -1695,86 +2259,582 @@
     ]
   }
   if (use_nss_certs) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_nss_sources, ".", "//chrome")
+    sources += [
+      "certificate_manager_model.cc",
+      "certificate_manager_model.h",
+      "net/nss_context.cc",
+      "net/nss_context.h",
+      "net/nss_context_chromeos.cc",
+      "net/nss_context_linux.cc",
+    ]
     if (is_chromeos) {
       sources -= [ "net/nss_context_linux.cc" ]
     }
   }
   if (enable_notifications) {
-    sources += rebase_path(gypi_values.chrome_browser_notifications_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "notifications/desktop_notification_profile_util.cc",
+      "notifications/desktop_notification_profile_util.h",
+      "notifications/login_state_notification_blocker_chromeos.cc",
+      "notifications/login_state_notification_blocker_chromeos.h",
+      "notifications/message_center_display_service.cc",
+      "notifications/message_center_display_service.h",
+      "notifications/native_notification_display_service.cc",
+      "notifications/native_notification_display_service.h",
+      "notifications/non_persistent_notification_handler.cc",
+      "notifications/non_persistent_notification_handler.h",
+      "notifications/notification.cc",
+      "notifications/notification.h",
+      "notifications/notification_common.cc",
+      "notifications/notification_common.h",
+      "notifications/notification_delegate.h",
+      "notifications/notification_display_service.h",
+      "notifications/notification_display_service_factory.cc",
+      "notifications/notification_display_service_factory.h",
+      "notifications/notification_handler.h",
+      "notifications/notification_object_proxy.cc",
+      "notifications/notification_object_proxy.h",
+      "notifications/notification_permission_context.cc",
+      "notifications/notification_permission_context.h",
+      "notifications/notification_platform_bridge.h",
+      "notifications/notification_platform_bridge_mac.h",
+      "notifications/notification_platform_bridge_mac.mm",
+      "notifications/notification_ui_manager.h",
+      "notifications/notifier_state_tracker.cc",
+      "notifications/notifier_state_tracker.h",
+      "notifications/notifier_state_tracker_factory.cc",
+      "notifications/notifier_state_tracker_factory.h",
+      "notifications/persistent_notification_delegate.cc",
+      "notifications/persistent_notification_delegate.h",
+      "notifications/persistent_notification_handler.cc",
+      "notifications/persistent_notification_handler.h",
+      "notifications/platform_notification_service_impl.cc",
+      "notifications/platform_notification_service_impl.h",
+      "push_messaging/push_messaging_notification_manager.cc",
+      "push_messaging/push_messaging_notification_manager.h",
+    ]
     if (android_java_ui) {
-      sources += rebase_path(
-              gypi_values.chrome_browser_notifications_android_java_ui_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "notifications/notification_permission_infobar_delegate.cc",
+        "notifications/notification_permission_infobar_delegate.h",
+        "notifications/notification_platform_bridge_android.cc",
+        "notifications/notification_platform_bridge_android.h",
+      ]
     } else {
-      sources += rebase_path(
-              gypi_values.chrome_browser_notifications_non_android_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "notifications/application_notifier_source.cc",
+        "notifications/application_notifier_source.h",
+        "notifications/arc_application_notifier_source_chromeos.cc",
+        "notifications/arc_application_notifier_source_chromeos.h",
+        "notifications/extension_welcome_notification.cc",
+        "notifications/extension_welcome_notification.h",
+        "notifications/extension_welcome_notification_factory.cc",
+        "notifications/extension_welcome_notification_factory.h",
+        "notifications/fullscreen_notification_blocker.cc",
+        "notifications/fullscreen_notification_blocker.h",
+        "notifications/google_now_notification_stats_collector.cc",
+        "notifications/google_now_notification_stats_collector.h",
+        "notifications/message_center_notification_manager.cc",
+        "notifications/message_center_notification_manager.h",
+        "notifications/message_center_settings_controller.cc",
+        "notifications/message_center_settings_controller.h",
+        "notifications/message_center_stats_collector.cc",
+        "notifications/message_center_stats_collector.h",
+        "notifications/notification_conversion_helper.cc",
+        "notifications/notification_conversion_helper.h",
+        "notifications/notification_system_observer.cc",
+        "notifications/notification_system_observer.h",
+        "notifications/notification_ui_manager_desktop.cc",
+        "notifications/notifier_source.h",
+        "notifications/profile_notification.cc",
+        "notifications/profile_notification.h",
+        "notifications/screen_lock_notification_blocker.cc",
+        "notifications/screen_lock_notification_blocker.h",
+        "notifications/system_component_notifier_source_chromeos.cc",
+        "notifications/system_component_notifier_source_chromeos.h",
+        "notifications/web_page_notifier_source.cc",
+        "notifications/web_page_notifier_source.h",
+      ]
     }
     if (is_mac) {
       deps += [ "//chrome/browser/ui/cocoa/notifications:common" ]
     }
   }
   if (enable_themes) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_themes_sources, ".", "//chrome")
+    sources += [
+      "sync/glue/theme_data_type_controller.cc",
+      "sync/glue/theme_data_type_controller.h",
+      "themes/browser_theme_pack.cc",
+      "themes/browser_theme_pack.h",
+      "themes/custom_theme_supplier.cc",
+      "themes/custom_theme_supplier.h",
+      "themes/theme_properties.cc",
+      "themes/theme_properties.h",
+      "themes/theme_service.cc",
+      "themes/theme_service.h",
+      "themes/theme_service_factory.cc",
+      "themes/theme_service_factory.h",
+      "themes/theme_service_mac.mm",
+      "themes/theme_syncable_service.cc",
+      "themes/theme_syncable_service.h",
+    ]
   }
 
   if (enable_basic_printing || enable_print_preview) {
     # Some form of printing support.
-    sources += rebase_path(gypi_values.chrome_browser_printing_basic_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "printing/print_job.cc",
+      "printing/print_job.h",
+      "printing/print_job_manager.cc",
+      "printing/print_job_manager.h",
+      "printing/print_job_worker.cc",
+      "printing/print_job_worker.h",
+      "printing/print_job_worker_owner.cc",
+      "printing/print_job_worker_owner.h",
+      "printing/print_view_manager_base.cc",
+      "printing/print_view_manager_base.h",
+      "printing/print_view_manager_common.cc",
+      "printing/print_view_manager_common.h",
+      "printing/printer_query.cc",
+      "printing/printer_query.h",
+      "printing/printing_message_filter.cc",
+      "printing/printing_message_filter.h",
+    ]
     deps += [
       "//components/printing/browser",
       "//printing",
     ]
 
     if (is_win) {
-      sources += rebase_path(gypi_values.chrome_browser_printing_emf_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "printing/pdf_to_emf_converter.cc",
+        "printing/pdf_to_emf_converter.h",
+      ]
     }
     if (enable_print_preview) {
       # Full printing on top of the above.
-      sources += rebase_path(gypi_values.chrome_browser_printing_full_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "printing/background_printing_manager.cc",
+        "printing/background_printing_manager.h",
+        "printing/cloud_print/cloud_print_proxy_service.cc",
+        "printing/cloud_print/cloud_print_proxy_service.h",
+        "printing/cloud_print/cloud_print_proxy_service_factory.cc",
+        "printing/cloud_print/cloud_print_proxy_service_factory.h",
+        "printing/print_dialog_cloud.cc",
+        "printing/print_dialog_cloud.h",
+        "printing/print_dialog_cloud_posix.cc",
+        "printing/print_dialog_cloud_win.cc",
+        "printing/print_error_dialog.cc",
+        "printing/print_error_dialog.h",
+        "printing/print_preview_context_menu_observer.cc",
+        "printing/print_preview_context_menu_observer.h",
+        "printing/print_preview_data_service.cc",
+        "printing/print_preview_data_service.h",
+        "printing/print_preview_dialog_controller.cc",
+        "printing/print_preview_dialog_controller.h",
+        "printing/print_preview_message_handler.cc",
+        "printing/print_preview_message_handler.h",
+        "printing/print_view_manager.cc",
+        "printing/print_view_manager.h",
+        "printing/printer_manager_dialog.h",
+        "printing/printer_manager_dialog_linux.cc",
+        "printing/printer_manager_dialog_mac.mm",
+        "printing/printer_manager_dialog_win.cc",
+        "printing/pwg_raster_converter.cc",
+        "printing/pwg_raster_converter.h",
+        "service_process/service_process_control.cc",
+        "service_process/service_process_control.h",
+        "service_process/service_process_control_mac.mm",
+      ]
     } else {
       # Partial-only printing support.
-      sources +=
-          rebase_path(gypi_values.chrome_browser_printing_basic_only_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "printing/print_view_manager_basic.cc",
+        "printing/print_view_manager_basic.h",
+      ]
     }
   }
   if (enable_captive_portal_detection) {
-    sources += rebase_path(gypi_values.chrome_browser_captive_portal_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "captive_portal/captive_portal_login_detector.cc",
+      "captive_portal/captive_portal_login_detector.h",
+      "captive_portal/captive_portal_service.cc",
+      "captive_portal/captive_portal_service.h",
+      "captive_portal/captive_portal_service_factory.cc",
+      "captive_portal/captive_portal_service_factory.h",
+      "captive_portal/captive_portal_tab_helper.cc",
+      "captive_portal/captive_portal_tab_helper.h",
+      "captive_portal/captive_portal_tab_reloader.cc",
+      "captive_portal/captive_portal_tab_reloader.h",
+      "ssl/captive_portal_blocking_page.cc",
+      "ssl/captive_portal_blocking_page.h",
+      "ssl/captive_portal_metrics_recorder.cc",
+      "ssl/captive_portal_metrics_recorder.h",
+    ]
   }
   if (enable_session_service) {
-    sources += rebase_path(gypi_values.chrome_browser_session_service_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "sessions/session_restore.cc",
+      "sessions/session_restore.h",
+      "sessions/session_restore_delegate.cc",
+      "sessions/session_restore_delegate.h",
+      "sessions/session_restore_stats_collector.cc",
+      "sessions/session_restore_stats_collector.h",
+      "sessions/session_service.cc",
+      "sessions/session_service.h",
+      "sessions/session_service_factory.cc",
+      "sessions/session_service_factory.h",
+      "sessions/session_service_utils.cc",
+      "sessions/session_service_utils.h",
+      "sessions/tab_loader.cc",
+      "sessions/tab_loader.h",
+      "sessions/tab_loader_delegate.cc",
+      "sessions/tab_loader_delegate.h",
+    ]
   }
 
   if (!is_android && !is_chromeos) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_desktop_sources, ".", "//chrome")
+    sources += [
+      "metrics/desktop_engagement/audible_contents_tracker.cc",
+      "metrics/desktop_engagement/audible_contents_tracker.h",
+      "metrics/desktop_engagement/chrome_visibility_observer.cc",
+      "metrics/desktop_engagement/chrome_visibility_observer.h",
+      "metrics/desktop_engagement/desktop_engagement_observer.cc",
+      "metrics/desktop_engagement/desktop_engagement_observer.h",
+      "metrics/desktop_engagement/desktop_engagement_service.cc",
+      "metrics/desktop_engagement/desktop_engagement_service.h",
+      "platform_util.cc",
+      "policy/cloud/user_policy_signin_service.cc",
+      "policy/cloud/user_policy_signin_service.h",
+      "profiles/avatar_menu_actions_desktop.cc",
+      "profiles/avatar_menu_actions_desktop.h",
+      "profiles/avatar_menu_desktop.cc",
+      "profiles/avatar_menu_observer.h",
+      "profiles/profile_list_desktop.cc",
+      "profiles/profile_list_desktop.h",
+      "profiles/profile_statistics.cc",
+      "profiles/profile_statistics.h",
+      "profiles/profile_statistics_aggregator.cc",
+      "profiles/profile_statistics_aggregator.h",
+      "profiles/profile_statistics_common.cc",
+      "profiles/profile_statistics_common.h",
+      "profiles/profile_statistics_factory.cc",
+      "profiles/profile_statistics_factory.h",
+      "signin/cross_device_promo.cc",
+      "signin/cross_device_promo.h",
+      "signin/cross_device_promo_factory.cc",
+      "signin/cross_device_promo_factory.h",
+      "signin/signin_global_error.cc",
+      "signin/signin_global_error.h",
+      "signin/signin_global_error_factory.cc",
+      "signin/signin_global_error_factory.h",
+      "sync/sync_global_error.cc",
+      "sync/sync_global_error.h",
+      "sync/sync_global_error_factory.cc",
+      "sync/sync_global_error_factory.h",
+      "upgrade_detector_impl.cc",
+      "upgrade_detector_impl.h",
+    ]
   }
 
   if (is_android) {
-    # Mobile.
-    sources +=
-        rebase_path(gypi_values.chrome_browser_mobile_sources, ".", "//chrome")
+    sources += [
+      "chrome_browser_field_trials_mobile.cc",
+      "chrome_browser_field_trials_mobile.h",
+      "policy/cloud/user_policy_signin_service_mobile.cc",
+      "policy/cloud/user_policy_signin_service_mobile.h",
+    ]
   } else {
-    # Non-mobile.
+    # Non-Android.
+    sources += [
+      "accessibility/invert_bubble_prefs.cc",
+      "accessibility/invert_bubble_prefs.h",
+      "background/background_contents.cc",
+      "background/background_contents.h",
+      "banners/app_banner_infobar_delegate_desktop.cc",
+      "banners/app_banner_infobar_delegate_desktop.h",
+      "banners/app_banner_manager_desktop.cc",
+      "banners/app_banner_manager_desktop.h",
+      "bookmarks/bookmark_html_writer.cc",
+      "bookmarks/bookmark_html_writer.h",
+      "certificate_viewer.cc",
+      "certificate_viewer.h",
+      "chooser_controller/chooser_controller.cc",
+      "chooser_controller/chooser_controller.h",
+      "chrome_browser_field_trials_desktop.cc",
+      "chrome_browser_field_trials_desktop.h",
+      "chrome_browser_main_posix.cc",
+      "chrome_browser_main_posix.h",
+      "chrome_process_singleton.cc",
+      "chrome_process_singleton.h",
+      "component_updater/widevine_cdm_component_installer.cc",
+      "component_updater/widevine_cdm_component_installer.h",
+      "custom_handlers/register_protocol_handler_permission_request.cc",
+      "custom_handlers/register_protocol_handler_permission_request.h",
+      "custom_home_pages_table_model.cc",
+      "custom_home_pages_table_model.h",
+      "diagnostics/diagnostics_controller.cc",
+      "diagnostics/diagnostics_controller.h",
+      "diagnostics/diagnostics_metrics.cc",
+      "diagnostics/diagnostics_metrics.h",
+      "diagnostics/diagnostics_model.cc",
+      "diagnostics/diagnostics_model.h",
+      "diagnostics/diagnostics_test.cc",
+      "diagnostics/diagnostics_test.h",
+      "diagnostics/diagnostics_writer.cc",
+      "diagnostics/diagnostics_writer.h",
+      "diagnostics/recon_diagnostics.cc",
+      "diagnostics/recon_diagnostics.h",
+      "diagnostics/sqlite_diagnostics.cc",
+      "diagnostics/sqlite_diagnostics.h",
+      "download/download_commands.cc",
+      "download/download_commands.h",
+      "download/download_crx_util.cc",
+      "download/download_crx_util.h",
+      "download/download_danger_prompt.cc",
+      "download/download_danger_prompt.h",
+      "download/download_dir_policy_handler.cc",
+      "download/download_dir_policy_handler.h",
+      "download/download_permission_request.cc",
+      "download/download_permission_request.h",
+      "download/download_shelf.cc",
+      "download/download_shelf.h",
+      "download/download_shelf_context_menu.cc",
+      "download/download_shelf_context_menu.h",
+      "feedback/feedback_profile_observer.cc",
+      "feedback/feedback_profile_observer.h",
+      "feedback/show_feedback_page.cc",
+      "feedback/system_logs/about_system_logs_fetcher.cc",
+      "feedback/system_logs/about_system_logs_fetcher.h",
+      "feedback/system_logs/log_sources/chrome_internal_log_source.cc",
+      "feedback/system_logs/log_sources/chrome_internal_log_source.h",
+      "feedback/system_logs/log_sources/memory_details_log_source.cc",
+      "feedback/system_logs/log_sources/memory_details_log_source.h",
+      "feedback/system_logs/scrubbed_system_logs_fetcher.cc",
+      "feedback/system_logs/scrubbed_system_logs_fetcher.h",
+      "feedback/system_logs/system_logs_fetcher_base.cc",
+      "feedback/system_logs/system_logs_fetcher_base.h",
+      "first_run/first_run.cc",
+      "first_run/first_run.h",
+      "first_run/first_run_dialog.h",
+      "first_run/first_run_internal.h",
+      "first_run/first_run_internal_linux.cc",
+      "first_run/first_run_internal_mac.mm",
+      "first_run/first_run_internal_posix.cc",
+      "first_run/first_run_internal_win.cc",
+      "first_run/upgrade_util.h",
+      "first_run/upgrade_util_mac.cc",
+      "first_run/upgrade_util_win.cc",
+      "first_run/upgrade_util_win.h",
+      "font_family_cache.cc",
+      "font_family_cache.h",
+      "gpu/gl_string_manager.cc",
+      "gpu/gl_string_manager.h",
+      "importer/external_process_importer_client.cc",
+      "importer/external_process_importer_client.h",
+      "importer/external_process_importer_host.cc",
+      "importer/external_process_importer_host.h",
+      "importer/firefox_profile_lock.cc",
+      "importer/firefox_profile_lock.h",
+      "importer/firefox_profile_lock_posix.cc",
+      "importer/firefox_profile_lock_win.cc",
+      "importer/importer_list.cc",
+      "importer/importer_list.h",
+      "importer/importer_lock_dialog.h",
+      "importer/importer_progress_observer.h",
+      "importer/importer_uma.cc",
+      "importer/importer_uma.h",
+      "importer/in_process_importer_bridge.cc",
+      "importer/in_process_importer_bridge.h",
+      "importer/profile_writer.cc",
+      "importer/profile_writer.h",
+      "lifetime/browser_close_manager.cc",
+      "lifetime/browser_close_manager.h",
+      "lifetime/keep_alive_registry.cc",
+      "lifetime/keep_alive_registry.h",
+      "lifetime/keep_alive_state_observer.h",
+      "lifetime/keep_alive_types.cc",
+      "lifetime/keep_alive_types.h",
+      "lifetime/scoped_keep_alive.cc",
+      "lifetime/scoped_keep_alive.h",
+      "media/tab_desktop_media_list.cc",
+      "media/tab_desktop_media_list.h",
+      "media_galleries/fileapi/av_scanning_file_validator.cc",
+      "media_galleries/fileapi/av_scanning_file_validator.h",
+      "media_galleries/fileapi/device_media_async_file_util.cc",
+      "media_galleries/fileapi/device_media_async_file_util.h",
+      "media_galleries/fileapi/iapps_finder.h",
+      "media_galleries/fileapi/iapps_finder_impl.cc",
+      "media_galleries/fileapi/iapps_finder_impl.h",
+      "media_galleries/fileapi/iapps_finder_impl_mac.mm",
+      "media_galleries/fileapi/iapps_finder_impl_win.cc",
+      "media_galleries/fileapi/media_file_system_backend.cc",
+      "media_galleries/fileapi/media_file_system_backend.h",
+      "media_galleries/fileapi/media_file_validator_factory.cc",
+      "media_galleries/fileapi/media_file_validator_factory.h",
+      "media_galleries/fileapi/media_path_filter.cc",
+      "media_galleries/fileapi/media_path_filter.h",
+      "media_galleries/fileapi/mtp_device_async_delegate.cc",
+      "media_galleries/fileapi/mtp_device_async_delegate.h",
+      "media_galleries/fileapi/mtp_device_map_service.cc",
+      "media_galleries/fileapi/mtp_device_map_service.h",
+      "media_galleries/fileapi/mtp_file_stream_reader.cc",
+      "media_galleries/fileapi/mtp_file_stream_reader.h",
+      "media_galleries/fileapi/native_media_file_util.cc",
+      "media_galleries/fileapi/native_media_file_util.h",
+      "media_galleries/fileapi/picasa_finder.cc",
+      "media_galleries/fileapi/picasa_finder.h",
+      "media_galleries/fileapi/picasa_finder_mac.mm",
+      "media_galleries/fileapi/readahead_file_stream_reader.cc",
+      "media_galleries/fileapi/readahead_file_stream_reader.h",
+      "media_galleries/fileapi/safe_audio_video_checker.cc",
+      "media_galleries/fileapi/safe_audio_video_checker.h",
+      "media_galleries/fileapi/safe_media_metadata_parser.cc",
+      "media_galleries/fileapi/safe_media_metadata_parser.h",
+      "media_galleries/fileapi/supported_audio_video_checker.cc",
+      "media_galleries/fileapi/supported_audio_video_checker.h",
+      "media_galleries/fileapi/supported_image_type_validator.cc",
+      "media_galleries/fileapi/supported_image_type_validator.h",
+      "media_galleries/gallery_watch_manager.cc",
+      "media_galleries/gallery_watch_manager.h",
+      "media_galleries/gallery_watch_manager_observer.h",
+      "media_galleries/imported_media_gallery_registry.cc",
+      "media_galleries/imported_media_gallery_registry.h",
+      "media_galleries/linux/mtp_device_delegate_impl_linux.cc",
+      "media_galleries/linux/mtp_device_delegate_impl_linux.h",
+      "media_galleries/linux/mtp_device_object_enumerator.cc",
+      "media_galleries/linux/mtp_device_object_enumerator.h",
+      "media_galleries/linux/mtp_device_task_helper.cc",
+      "media_galleries/linux/mtp_device_task_helper.h",
+      "media_galleries/linux/mtp_device_task_helper_map_service.cc",
+      "media_galleries/linux/mtp_device_task_helper_map_service.h",
+      "media_galleries/linux/mtp_read_file_worker.cc",
+      "media_galleries/linux/mtp_read_file_worker.h",
+      "media_galleries/linux/snapshot_file_details.cc",
+      "media_galleries/linux/snapshot_file_details.h",
+      "media_galleries/mac/mtp_device_delegate_impl_mac.h",
+      "media_galleries/mac/mtp_device_delegate_impl_mac.mm",
+      "media_galleries/media_file_system_registry.cc",
+      "media_galleries/media_file_system_registry.h",
+      "media_galleries/media_galleries_dialog_controller.cc",
+      "media_galleries/media_galleries_dialog_controller.h",
+      "media_galleries/media_galleries_histograms.cc",
+      "media_galleries/media_galleries_histograms.h",
+      "media_galleries/media_galleries_permission_controller.cc",
+      "media_galleries/media_galleries_permission_controller.h",
+      "media_galleries/media_galleries_preferences.cc",
+      "media_galleries/media_galleries_preferences.h",
+      "media_galleries/media_galleries_preferences_factory.cc",
+      "media_galleries/media_galleries_preferences_factory.h",
+      "media_galleries/media_gallery_context_menu.cc",
+      "media_galleries/media_gallery_context_menu.h",
+      "media_galleries/win/mtp_device_delegate_impl_win.cc",
+      "media_galleries/win/mtp_device_delegate_impl_win.h",
+      "media_galleries/win/mtp_device_object_entry.cc",
+      "media_galleries/win/mtp_device_object_entry.h",
+      "media_galleries/win/mtp_device_object_enumerator.cc",
+      "media_galleries/win/mtp_device_object_enumerator.h",
+      "media_galleries/win/mtp_device_operations_util.cc",
+      "media_galleries/win/mtp_device_operations_util.h",
+      "media_galleries/win/portable_device_map_service.cc",
+      "media_galleries/win/portable_device_map_service.h",
+      "media_galleries/win/snapshot_file_details.cc",
+      "media_galleries/win/snapshot_file_details.h",
+      "memory/oom_memory_details.cc",
+      "memory/oom_memory_details.h",
+      "memory/tab_manager.cc",
+      "memory/tab_manager.h",
+      "memory/tab_manager_delegate_chromeos.cc",
+      "memory/tab_manager_delegate_chromeos.h",
+      "memory/tab_manager_observer.cc",
+      "memory/tab_manager_observer.h",
+      "memory/tab_manager_web_contents_data.cc",
+      "memory/tab_manager_web_contents_data.h",
+      "memory/tab_stats.cc",
+      "memory/tab_stats.h",
+      "metrics/first_web_contents_profiler.cc",
+      "metrics/first_web_contents_profiler.h",
+      "net/firefox_proxy_settings.cc",
+      "net/firefox_proxy_settings.h",
+      "net/utility_process_mojo_proxy_resolver_factory.cc",
+      "net/utility_process_mojo_proxy_resolver_factory.h",
+      "obsolete_system/obsolete_system.h",
+      "obsolete_system/obsolete_system_linux.cc",
+      "obsolete_system/obsolete_system_mac.cc",
+      "obsolete_system/obsolete_system_win.cc",
+      "pdf/pdf_extension_util.cc",
+      "pdf/pdf_extension_util.h",
+      "power/process_power_collector.cc",
+      "power/process_power_collector.h",
+      "process_singleton_modal_dialog_lock.cc",
+      "process_singleton_modal_dialog_lock.h",
+      "process_singleton_posix.cc",
+      "process_singleton_startup_lock.cc",
+      "process_singleton_startup_lock.h",
+      "profile_resetter/brandcode_config_fetcher.cc",
+      "profile_resetter/brandcode_config_fetcher.h",
+      "profile_resetter/brandcoded_default_settings.cc",
+      "profile_resetter/brandcoded_default_settings.h",
+      "profile_resetter/profile_resetter.cc",
+      "profile_resetter/profile_resetter.h",
+      "profile_resetter/reset_report_uploader.cc",
+      "profile_resetter/reset_report_uploader.h",
+      "profile_resetter/reset_report_uploader_factory.cc",
+      "profile_resetter/reset_report_uploader_factory.h",
+      "profile_resetter/resettable_settings_snapshot.cc",
+      "profile_resetter/resettable_settings_snapshot.h",
+      "profile_resetter/triggered_profile_resetter.cc",
+      "profile_resetter/triggered_profile_resetter.h",
+      "profile_resetter/triggered_profile_resetter_factory.cc",
+      "profile_resetter/triggered_profile_resetter_factory.h",
+      "profile_resetter/triggered_profile_resetter_win.cc",
+      "profiles/avatar_menu.cc",
+      "profiles/avatar_menu.h",
+      "profiles/profile_shortcut_manager.cc",
+      "profiles/profile_shortcut_manager.h",
+      "profiles/profile_window.cc",
+      "profiles/profile_window.h",
+      "renderer_context_menu/open_with_menu_factory.cc",
+      "renderer_context_menu/open_with_menu_factory.h",
+      "renderer_context_menu/render_view_context_menu.cc",
+      "renderer_context_menu/render_view_context_menu.h",
+      "renderer_context_menu/spelling_bubble_model.cc",
+      "renderer_context_menu/spelling_bubble_model.h",
+      "renderer_context_menu/spelling_menu_observer.cc",
+      "renderer_context_menu/spelling_menu_observer.h",
+      "repost_form_warning_controller.cc",
+      "repost_form_warning_controller.h",
+      "search/local_ntp_source.cc",
+      "search/local_ntp_source.h",
+      "search/search_terms_tracker.cc",
+      "search/search_terms_tracker.h",
+      "signin/signin_promo.cc",
+      "signin/signin_promo.h",
+      "signin/signin_ui_util.cc",
+      "signin/signin_ui_util.h",
+      "speech/extension_api/tts_extension_api_constants.cc",  # Should be moved to extensions section?
+      "speech/extension_api/tts_extension_api_constants.h",
+      "ssl/ssl_add_certificate.cc",
+      "ssl/ssl_add_certificate.h",
+      "ssl/ssl_client_auth_observer.cc",
+      "ssl/ssl_client_auth_observer.h",
+      "status_icons/desktop_notification_balloon.cc",
+      "status_icons/desktop_notification_balloon.h",
+      "sync/glue/extension_data_type_controller.cc",
+      "sync/glue/extension_data_type_controller.h",
+      "sync/glue/extension_setting_data_type_controller.cc",
+      "sync/glue/extension_setting_data_type_controller.h",
+      "sync/sync_ui_util.cc",
+      "sync/sync_ui_util.h",
+      "upgrade_detector.cc",
+      "upgrade_detector.h",
+      "usb/usb_chooser_controller.cc",
+      "usb/usb_chooser_controller.h",
+      "usb/web_usb_chooser_service.cc",
+      "usb/web_usb_chooser_service.h",
+      "usb/web_usb_detector.cc",
+      "usb/web_usb_detector.h",
+    ]
     deps += [
       "//apps",
       "//chrome/browser/policy:path_parser",
@@ -1783,9 +2843,6 @@
       "//components/web_modal",
       "//net:net_browser_services",
     ]
-    sources += rebase_path(gypi_values.chrome_browser_non_mobile_sources,
-                           ".",
-                           "//chrome")
   }
 
   if (!is_chrome_branded) {
@@ -1796,17 +2853,448 @@
   }
 
   if (is_android) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_android_sources, ".", "//chrome")
+    sources += [
+      "gpu/gpu_driver_info_manager_android.cc",
+      "gpu/gpu_driver_info_manager_android.h",
+      "media/protected_media_identifier_permission_context.cc",
+      "media/protected_media_identifier_permission_context.h",
+    ]
   }
 
   if (android_java_ui) {
-    sources += rebase_path(gypi_values.chrome_browser_android_java_ui_sources,
-                           ".",
-                           "//chrome")
-    sources += rebase_path(gypi_values.chrome_browser_offline_pages_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "after_startup_task_utils_android.cc",
+      "after_startup_task_utils_android.h",
+      "android/accessibility/font_size_prefs_android.cc",
+      "android/accessibility/font_size_prefs_android.h",
+      "android/accessibility_util.cc",
+      "android/accessibility_util.h",
+      "android/activity_type_ids.cc",
+      "android/activity_type_ids.h",
+      "android/android_theme_resources.h",
+      "android/appmenu/app_menu_drag_helper.cc",
+      "android/appmenu/app_menu_drag_helper.h",
+      "android/background_sync_launcher_android.cc",
+      "android/background_sync_launcher_android.h",
+      "android/banners/app_banner_infobar_delegate_android.cc",
+      "android/banners/app_banner_infobar_delegate_android.h",
+      "android/banners/app_banner_manager_android.cc",
+      "android/banners/app_banner_manager_android.h",
+      "android/blimp/blimp_client_context_factory.cc",
+      "android/blimp/blimp_client_context_factory.h",
+      "android/blimp/blimp_client_context_factory_android.cc",
+      "android/blimp/blimp_client_context_factory_android.h",
+      "android/blimp/blimp_contents_profile_attachment.cc",
+      "android/blimp/blimp_contents_profile_attachment.h",
+      "android/blimp/chrome_blimp_client_context_delegate.cc",
+      "android/blimp/chrome_blimp_client_context_delegate.h",
+      "android/blimp/chrome_blimp_client_context_delegate_android.cc",
+      "android/blimp/chrome_blimp_client_context_delegate_android.h",
+      "android/bookmarks/bookmark_bridge.cc",
+      "android/bookmarks/bookmark_bridge.h",
+      "android/bookmarks/partner_bookmarks_reader.cc",
+      "android/bookmarks/partner_bookmarks_reader.h",
+      "android/bookmarks/partner_bookmarks_shim.cc",
+      "android/bookmarks/partner_bookmarks_shim.h",
+      "android/bottombar/overlay_panel_content.cc",
+      "android/bottombar/overlay_panel_content.h",
+      "android/browsing_data/browsing_data_counter_bridge.cc",
+      "android/browsing_data/browsing_data_counter_bridge.h",
+      "android/browsing_data/url_filter_bridge.cc",
+      "android/browsing_data/url_filter_bridge.h",
+      "android/chrome_application.cc",
+      "android/chrome_application.h",
+      "android/chrome_feature_list.cc",
+      "android/chrome_feature_list.h",
+      "android/chrome_jni_registrar.cc",
+      "android/chrome_jni_registrar.h",
+      "android/chrome_startup_flags.cc",
+      "android/chrome_startup_flags.h",
+      "android/compositor/compositor_view.cc",
+      "android/compositor/compositor_view.h",
+      "android/compositor/decoration_title.cc",
+      "android/compositor/decoration_title.h",
+      "android/compositor/layer/content_layer.cc",
+      "android/compositor/layer/content_layer.h",
+      "android/compositor/layer/contextual_search_layer.cc",
+      "android/compositor/layer/contextual_search_layer.h",
+      "android/compositor/layer/crushed_sprite_layer.cc",
+      "android/compositor/layer/crushed_sprite_layer.h",
+      "android/compositor/layer/layer.h",
+      "android/compositor/layer/overlay_panel_layer.cc",
+      "android/compositor/layer/overlay_panel_layer.h",
+      "android/compositor/layer/reader_mode_layer.cc",
+      "android/compositor/layer/reader_mode_layer.h",
+      "android/compositor/layer/tab_handle_layer.cc",
+      "android/compositor/layer/tab_handle_layer.h",
+      "android/compositor/layer/tab_layer.cc",
+      "android/compositor/layer/tab_layer.h",
+      "android/compositor/layer/thumbnail_layer.cc",
+      "android/compositor/layer/thumbnail_layer.h",
+      "android/compositor/layer/toolbar_layer.cc",
+      "android/compositor/layer/toolbar_layer.h",
+      "android/compositor/layer_title_cache.cc",
+      "android/compositor/layer_title_cache.h",
+      "android/compositor/scene_layer/contextual_search_scene_layer.cc",
+      "android/compositor/scene_layer/contextual_search_scene_layer.h",
+      "android/compositor/scene_layer/reader_mode_scene_layer.cc",
+      "android/compositor/scene_layer/reader_mode_scene_layer.h",
+      "android/compositor/scene_layer/scene_layer.cc",
+      "android/compositor/scene_layer/scene_layer.h",
+      "android/compositor/scene_layer/static_tab_scene_layer.cc",
+      "android/compositor/scene_layer/static_tab_scene_layer.h",
+      "android/compositor/scene_layer/tab_list_scene_layer.cc",
+      "android/compositor/scene_layer/tab_list_scene_layer.h",
+      "android/compositor/scene_layer/tab_strip_scene_layer.cc",
+      "android/compositor/scene_layer/tab_strip_scene_layer.h",
+      "android/compositor/scene_layer/toolbar_scene_layer.cc",
+      "android/compositor/scene_layer/toolbar_scene_layer.h",
+      "android/compositor/tab_content_manager.cc",
+      "android/compositor/tab_content_manager.h",
+      "android/contextualsearch/contextual_search_context.cc",
+      "android/contextualsearch/contextual_search_context.h",
+      "android/contextualsearch/contextual_search_delegate.cc",
+      "android/contextualsearch/contextual_search_delegate.h",
+      "android/contextualsearch/contextual_search_field_trial.cc",
+      "android/contextualsearch/contextual_search_field_trial.h",
+      "android/contextualsearch/contextual_search_manager.cc",
+      "android/contextualsearch/contextual_search_manager.h",
+      "android/contextualsearch/contextual_search_tab_helper.cc",
+      "android/contextualsearch/contextual_search_tab_helper.h",
+      "android/contextualsearch/resolved_search_term.cc",
+      "android/contextualsearch/resolved_search_term.h",
+      "android/cookies/cookies_fetcher.cc",
+      "android/cookies/cookies_fetcher.h",
+      "android/data_usage/data_use_matcher.cc",
+      "android/data_usage/data_use_matcher.h",
+      "android/data_usage/data_use_tab_helper.cc",
+      "android/data_usage/data_use_tab_helper.h",
+      "android/data_usage/data_use_tab_model.cc",
+      "android/data_usage/data_use_tab_model.h",
+      "android/data_usage/data_use_tab_ui_manager_android.cc",
+      "android/data_usage/data_use_tab_ui_manager_android.h",
+      "android/data_usage/data_use_ui_tab_model.cc",
+      "android/data_usage/data_use_ui_tab_model.h",
+      "android/data_usage/data_use_ui_tab_model_factory.cc",
+      "android/data_usage/data_use_ui_tab_model_factory.h",
+      "android/data_usage/external_data_use_observer.cc",
+      "android/data_usage/external_data_use_observer.h",
+      "android/data_usage/external_data_use_observer_bridge.cc",
+      "android/data_usage/external_data_use_observer_bridge.h",
+      "android/data_usage/external_data_use_reporter.cc",
+      "android/data_usage/external_data_use_reporter.h",
+      "android/data_usage/tab_data_use_entry.cc",
+      "android/data_usage/tab_data_use_entry.h",
+      "android/dev_tools_server.cc",
+      "android/dev_tools_server.h",
+      "android/devtools_manager_delegate_android.cc",
+      "android/devtools_manager_delegate_android.h",
+      "android/document/document_web_contents_delegate.cc",
+      "android/dom_distiller/distiller_ui_handle_android.cc",
+      "android/dom_distiller/distiller_ui_handle_android.h",
+      "android/download/android_download_manager_overwrite_infobar_delegate.cc",
+      "android/download/android_download_manager_overwrite_infobar_delegate.h",
+      "android/download/chrome_download_delegate.cc",
+      "android/download/chrome_download_delegate.h",
+      "android/download/chrome_download_manager_overwrite_infobar_delegate.cc",
+      "android/download/chrome_download_manager_overwrite_infobar_delegate.h",
+      "android/download/download_controller.cc",
+      "android/download/download_controller.h",
+      "android/download/download_controller_base.cc",
+      "android/download/download_controller_base.h",
+      "android/download/download_manager_service.cc",
+      "android/download/download_manager_service.h",
+      "android/download/download_overwrite_infobar_delegate.cc",
+      "android/download/download_overwrite_infobar_delegate.h",
+      "android/download/mock_download_controller.cc",
+      "android/download/mock_download_controller.h",
+      "android/download/ui/thumbnail_provider.cc",
+      "android/download/ui/thumbnail_provider.h",
+      "android/favicon_helper.cc",
+      "android/favicon_helper.h",
+      "android/feature_utilities.cc",
+      "android/feature_utilities.h",
+      "android/feedback/connectivity_checker.cc",
+      "android/feedback/connectivity_checker.h",
+      "android/feedback/screenshot_task.cc",
+      "android/feedback/screenshot_task.h",
+      "android/find_in_page/find_in_page_bridge.cc",
+      "android/find_in_page/find_in_page_bridge.h",
+      "android/foreign_session_helper.cc",
+      "android/foreign_session_helper.h",
+      "android/history_report/data_observer.cc",
+      "android/history_report/data_observer.h",
+      "android/history_report/data_provider.cc",
+      "android/history_report/data_provider.h",
+      "android/history_report/delta_file_backend_leveldb.cc",
+      "android/history_report/delta_file_backend_leveldb.h",
+      "android/history_report/delta_file_commons.cc",
+      "android/history_report/delta_file_commons.h",
+      "android/history_report/delta_file_service.cc",
+      "android/history_report/delta_file_service.h",
+      "android/history_report/get_all_urls_from_history_task.cc",
+      "android/history_report/get_all_urls_from_history_task.h",
+      "android/history_report/historic_visits_migration_task.cc",
+      "android/history_report/historic_visits_migration_task.h",
+      "android/history_report/history_report_jni_bridge.cc",
+      "android/history_report/history_report_jni_bridge.h",
+      "android/history_report/usage_report_util.cc",
+      "android/history_report/usage_report_util.h",
+      "android/history_report/usage_reports_buffer_backend.cc",
+      "android/history_report/usage_reports_buffer_backend.h",
+      "android/history_report/usage_reports_buffer_service.cc",
+      "android/history_report/usage_reports_buffer_service.h",
+      "android/hung_renderer_infobar_delegate.cc",
+      "android/hung_renderer_infobar_delegate.h",
+      "android/instantapps/instant_apps_infobar_delegate.cc",
+      "android/instantapps/instant_apps_infobar_delegate.h",
+      "android/intent_helper.cc",
+      "android/intent_helper.h",
+      "android/intercept_download_resource_throttle.cc",
+      "android/intercept_download_resource_throttle.h",
+      "android/java_exception_reporter.cc",
+      "android/java_exception_reporter.h",
+      "android/large_icon_bridge.cc",
+      "android/large_icon_bridge.h",
+      "android/location_settings.h",
+      "android/location_settings_impl.cc",
+      "android/location_settings_impl.h",
+      "android/logo_bridge.cc",
+      "android/logo_bridge.h",
+      "android/logo_service.cc",
+      "android/logo_service.h",
+      "android/media/media_throttle_infobar_delegate.cc",
+      "android/media/media_throttle_infobar_delegate.h",
+      "android/metrics/launch_metrics.cc",
+      "android/metrics/launch_metrics.h",
+      "android/metrics/uma_session_stats.cc",
+      "android/metrics/uma_session_stats.h",
+      "android/metrics/uma_utils.cc",
+      "android/metrics/uma_utils.h",
+      "android/metrics/variations_session.cc",
+      "android/metrics/variations_session.h",
+      "android/mojo/chrome_interface_registrar_android.cc",
+      "android/mojo/chrome_interface_registrar_android.h",
+      "android/net/external_estimate_provider_android.cc",
+      "android/net/external_estimate_provider_android.h",
+      "android/ntp/most_visited_sites_bridge.cc",
+      "android/ntp/most_visited_sites_bridge.h",
+      "android/ntp/new_tab_page_prefs.cc",
+      "android/ntp/new_tab_page_prefs.h",
+      "android/ntp/new_tab_page_url_handler.cc",
+      "android/ntp/new_tab_page_url_handler.h",
+      "android/ntp/ntp_snippets_bridge.cc",
+      "android/ntp/ntp_snippets_bridge.h",
+      "android/ntp/ntp_snippets_launcher.cc",
+      "android/ntp/ntp_snippets_launcher.h",
+      "android/ntp/popular_sites.cc",
+      "android/ntp/popular_sites.h",
+      "android/offline_pages/background_scheduler_bridge.cc",
+      "android/offline_pages/background_scheduler_bridge.h",
+      "android/offline_pages/downloads/offline_page_download_bridge.cc",
+      "android/offline_pages/downloads/offline_page_download_bridge.h",
+      "android/offline_pages/downloads/offline_page_notification_bridge.cc",
+      "android/offline_pages/downloads/offline_page_notification_bridge.h",
+      "android/offline_pages/offline_page_bridge.cc",
+      "android/offline_pages/offline_page_bridge.h",
+      "android/offline_pages/offline_page_mhtml_archiver.cc",
+      "android/offline_pages/offline_page_mhtml_archiver.h",
+      "android/offline_pages/offline_page_model_factory.cc",
+      "android/offline_pages/offline_page_model_factory.h",
+      "android/offline_pages/offline_page_request_interceptor.cc",
+      "android/offline_pages/offline_page_request_interceptor.h",
+      "android/offline_pages/offline_page_request_job.cc",
+      "android/offline_pages/offline_page_request_job.h",
+      "android/offline_pages/offline_page_tab_helper.cc",
+      "android/offline_pages/offline_page_tab_helper.h",
+      "android/offline_pages/offline_page_utils.cc",
+      "android/offline_pages/offline_page_utils.h",
+      "android/offline_pages/offliner_factory.h",
+      "android/offline_pages/prerender_adapter.cc",
+      "android/offline_pages/prerender_adapter.h",
+      "android/offline_pages/prerendering_loader.cc",
+      "android/offline_pages/prerendering_loader.h",
+      "android/offline_pages/prerendering_offliner.cc",
+      "android/offline_pages/prerendering_offliner.h",
+      "android/offline_pages/prerendering_offliner_factory.cc",
+      "android/offline_pages/prerendering_offliner_factory.h",
+      "android/offline_pages/recent_tab_helper.cc",
+      "android/offline_pages/recent_tab_helper.h",
+      "android/offline_pages/request_coordinator_factory.cc",
+      "android/offline_pages/request_coordinator_factory.h",
+      "android/omnibox/answers_image_bridge.cc",
+      "android/omnibox/answers_image_bridge.h",
+      "android/omnibox/autocomplete_controller_android.cc",
+      "android/omnibox/autocomplete_controller_android.h",
+      "android/omnibox/omnibox_prerender.cc",
+      "android/omnibox/omnibox_prerender.h",
+      "android/password_ui_view_android.cc",
+      "android/password_ui_view_android.h",
+      "android/policy/policy_auditor.cc",
+      "android/policy/policy_auditor.h",
+      "android/precache/precache_launcher.cc",
+      "android/precache/precache_launcher.h",
+      "android/preferences/autofill/autofill_profile_bridge.cc",
+      "android/preferences/autofill/autofill_profile_bridge.h",
+      "android/preferences/important_sites_util.cc",
+      "android/preferences/important_sites_util.h",
+      "android/preferences/pref_service_bridge.cc",
+      "android/preferences/pref_service_bridge.h",
+      "android/preferences/website_preference_bridge.cc",
+      "android/preferences/website_preference_bridge.h",
+      "android/profiles/profile_downloader_android.cc",
+      "android/profiles/profile_downloader_android.h",
+      "android/provider/blocking_ui_thread_async_request.cc",
+      "android/provider/blocking_ui_thread_async_request.h",
+      "android/provider/bookmark_model_observer_task.cc",
+      "android/provider/bookmark_model_observer_task.h",
+      "android/provider/chrome_browser_provider.cc",
+      "android/provider/chrome_browser_provider.h",
+      "android/provider/run_on_ui_thread_blocking.h",
+      "android/rappor/rappor_service_bridge.cc",
+      "android/rappor/rappor_service_bridge.h",
+      "android/recently_closed_tabs_bridge.cc",
+      "android/recently_closed_tabs_bridge.h",
+      "android/resource_id.h",
+      "android/resource_mapper.cc",
+      "android/resource_mapper.h",
+      "android/rlz/revenue_stats.cc",
+      "android/rlz/revenue_stats.h",
+      "android/safe_browsing/safe_browsing_api_handler_bridge.cc",
+      "android/safe_browsing/safe_browsing_api_handler_bridge.h",
+      "android/seccomp_support_detector.cc",
+      "android/seccomp_support_detector.h",
+      "android/service_tab_launcher.cc",
+      "android/service_tab_launcher.h",
+      "android/sessions/session_tab_helper_android.cc",
+      "android/sessions/session_tab_helper_android.h",
+      "android/shortcut_helper.cc",
+      "android/shortcut_helper.h",
+      "android/shortcut_info.cc",
+      "android/shortcut_info.h",
+      "android/signin/account_management_screen_helper.cc",
+      "android/signin/account_management_screen_helper.h",
+      "android/signin/account_tracker_service_android.cc",
+      "android/signin/account_tracker_service_android.h",
+      "android/signin/signin_investigator_android.cc",
+      "android/signin/signin_investigator_android.h",
+      "android/signin/signin_manager_android.cc",
+      "android/signin/signin_manager_android.h",
+      "android/signin/signin_promo_util_android.cc",
+      "android/signin/signin_promo_util_android.h",
+      "android/tab_android.cc",
+      "android/tab_android.h",
+      "android/tab_state.cc",
+      "android/tab_state.h",
+      "android/tab_web_contents_delegate_android.cc",
+      "android/tab_web_contents_delegate_android.h",
+      "android/thumbnail/thumbnail.cc",
+      "android/thumbnail/thumbnail.h",
+      "android/thumbnail/thumbnail_cache.cc",
+      "android/thumbnail/thumbnail_cache.h",
+      "android/url_utilities.cc",
+      "android/url_utilities.h",
+      "android/usb/web_usb_chooser_service_android.cc",
+      "android/usb/web_usb_chooser_service_android.h",
+      "android/voice_search_tab_helper.cc",
+      "android/voice_search_tab_helper.h",
+      "android/warmup_manager.cc",
+      "android/warmup_manager.h",
+      "android/web_contents_factory.cc",
+      "android/web_contents_factory.h",
+      "android/webapk/chrome_webapk_host.cc",
+      "android/webapk/chrome_webapk_host.h",
+      "android/webapk/manifest_upgrade_detector_fetcher.cc",
+      "android/webapk/manifest_upgrade_detector_fetcher.h",
+      "android/webapk/webapk_icon_hasher.cc",
+      "android/webapk/webapk_icon_hasher.h",
+      "android/webapk/webapk_installer.cc",
+      "android/webapk/webapk_installer.h",
+      "android/webapk/webapk_update_manager.cc",
+      "android/webapk/webapk_update_manager.h",
+      "android/webapk/webapk_web_manifest_checker.cc",
+      "android/webapk/webapk_web_manifest_checker.h",
+      "android/webapps/add_to_homescreen_data_fetcher.cc",
+      "android/webapps/add_to_homescreen_data_fetcher.h",
+      "android/webapps/add_to_homescreen_dialog_helper.cc",
+      "android/webapps/add_to_homescreen_dialog_helper.h",
+      "android/webapps/single_tab_mode_tab_helper.cc",
+      "android/webapps/single_tab_mode_tab_helper.h",
+      "android/webapps/webapp_registry.cc",
+      "android/webapps/webapp_registry.h",
+      "autofill/android/personal_data_manager_android.cc",
+      "autofill/android/personal_data_manager_android.h",
+      "dom_distiller/dom_distiller_service_factory_android.cc",
+      "dom_distiller/dom_distiller_service_factory_android.h",
+      "dom_distiller/tab_utils_android.cc",
+      "dom_distiller/tab_utils_android.h",
+      "download/download_request_infobar_delegate_android.cc",
+      "download/download_request_infobar_delegate_android.h",
+      "geolocation/geolocation_infobar_delegate_android.cc",
+      "geolocation/geolocation_infobar_delegate_android.h",
+      "invalidation/invalidation_service_factory_android.cc",
+      "invalidation/invalidation_service_factory_android.h",
+      "lifetime/application_lifetime_android.cc",
+      "lifetime/application_lifetime_android.h",
+      "media/android/cdm/media_drm_credential_manager.cc",
+      "media/android/cdm/media_drm_credential_manager.h",
+      "media/android/remote/record_cast_action.cc",
+      "media/android/remote/record_cast_action.h",
+      "media/android/remote/remote_media_player_bridge.cc",
+      "media/android/remote/remote_media_player_bridge.h",
+      "media/android/remote/remote_media_player_manager.cc",
+      "media/android/remote/remote_media_player_manager.h",
+      "media/android/router/media_router_android.cc",
+      "media/android/router/media_router_android.h",
+      "media/android/router/media_router_dialog_controller_android.cc",
+      "media/android/router/media_router_dialog_controller_android.h",
+      "media/media_stream_infobar_delegate_android.cc",
+      "media/media_stream_infobar_delegate_android.h",
+      "media/midi_permission_infobar_delegate_android.cc",
+      "media/midi_permission_infobar_delegate_android.h",
+      "media/protected_media_identifier_infobar_delegate_android.cc",
+      "media/protected_media_identifier_infobar_delegate_android.h",
+      "metrics/android_metrics_provider.cc",
+      "metrics/android_metrics_provider.h",
+      "metrics/page_load_metrics_provider.cc",
+      "metrics/page_load_metrics_provider.h",
+      "net/spdyproxy/data_reduction_promo_infobar_delegate_android.cc",
+      "net/spdyproxy/data_reduction_promo_infobar_delegate_android.h",
+      "net/spdyproxy/data_reduction_proxy_settings_android.cc",
+      "net/spdyproxy/data_reduction_proxy_settings_android.h",
+      "page_load_metrics/observers/android_page_load_metrics_observer.cc",
+      "page_load_metrics/observers/android_page_load_metrics_observer.h",
+      "password_manager/account_chooser_dialog_android.cc",
+      "password_manager/account_chooser_dialog_android.h",
+      "password_manager/auto_signin_first_run_dialog_android.cc",
+      "password_manager/auto_signin_first_run_dialog_android.h",
+      "password_manager/credential_android.cc",
+      "password_manager/credential_android.h",
+      "password_manager/generated_password_saved_infobar_delegate_android.cc",
+      "password_manager/generated_password_saved_infobar_delegate_android.h",
+      "password_manager/password_manager_infobar_delegate_android.cc",
+      "password_manager/password_manager_infobar_delegate_android.h",
+      "password_manager/save_password_infobar_delegate_android.cc",
+      "password_manager/save_password_infobar_delegate_android.h",
+      "password_manager/update_password_infobar_delegate_android.cc",
+      "password_manager/update_password_infobar_delegate_android.h",
+      "permissions/permission_queue_controller.cc",
+      "permissions/permission_queue_controller.h",
+      "platform_util_android.cc",
+      "precache/precache_manager_factory.cc",
+      "precache/precache_manager_factory.h",
+      "precache/precache_util.cc",
+      "precache/precache_util.h",
+      "prerender/external_prerender_handler_android.cc",
+      "prerender/external_prerender_handler_android.h",
+      "profiles/profile_android.cc",
+      "profiles/profile_android.h",
+      "search/contextual_search_policy_handler_android.cc",
+      "search/contextual_search_policy_handler_android.h",
+      "signin/oauth2_token_service_delegate_android.cc",
+      "signin/oauth2_token_service_delegate_android.h",
+      "ssl/ssl_add_certificate_android.cc",
+    ]
     deps += [
       ":client_discourse_context_proto",
       ":delta_file_proto",
@@ -1872,8 +3360,24 @@
   }
 
   if (is_win) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_win_sources, ".", "//chrome")
+    sources += [
+      "downgrade/user_data_downgrade.cc",
+      "downgrade/user_data_downgrade.h",
+      "first_run/try_chrome_dialog_view.cc",
+      "first_run/try_chrome_dialog_view.h",
+      "first_run/upgrade_util.cc",
+      "google/did_run_updater_win.cc",
+      "google/did_run_updater_win.h",
+      "hang_monitor/hang_crash_dump_win.cc",
+      "hang_monitor/hang_crash_dump_win.h",
+      "media/window_icon_util_win.cc",
+      "metrics/antivirus_metrics_provider_win.cc",
+      "metrics/antivirus_metrics_provider_win.h",
+      "password_manager/password_manager_util_win.cc",
+      "password_manager/password_manager_util_win.h",
+      "themes/theme_service_win.cc",
+      "themes/theme_service_win.h",
+    ]
     public_deps += [
       "//ui/views",
       "//ui/views/controls/webview",
@@ -1889,7 +3393,6 @@
       "//chrome_elf:dll_hash",
       "//components/browser_watcher",
       "//components/browser_watcher:browser_watcher_client",
-      "//components/startup_metric_utils/common",
       "//google_update",
       "//third_party/iaccessible2",
       "//third_party/isimpledom",
@@ -1909,8 +3412,10 @@
     }
   } else {
     # Non-Windows.
-    sources +=
-        rebase_path(gypi_values.chrome_browser_non_win_sources, ".", "//chrome")
+    sources += [
+      "profile_resetter/triggered_profile_resetter_stub.cc",
+      "profiles/profile_shortcut_manager_stub.cc",
+    ]
     if (toolkit_views) {
       deps += [
         "//ui/views",
@@ -1933,54 +3438,219 @@
   }
 
   if (is_linux || is_win) {
-    sources += rebase_path(gypi_values.chrome_browser_non_mac_desktop_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "renderer_context_menu/spelling_options_submenu_observer.cc",
+      "renderer_context_menu/spelling_options_submenu_observer.h",
+    ]
   }
 
   if (is_desktop_linux) {
-    sources += rebase_path(gypi_values.chrome_browser_linux_desktop_sources,
-                           ".",
-                           "//chrome")
+    # Desktop linux, doesn"t count ChromeOS.
+    sources += [
+      "first_run/upgrade_util.cc",
+      "first_run/upgrade_util_linux.cc",
+      "first_run/upgrade_util_linux.h",
+      "fullscreen_aurax11.cc",
+      "icon_loader_auralinux.cc",
+      "media/window_icon_util_x11.cc",
+      "password_manager/native_backend_kwallet_x.cc",
+      "password_manager/native_backend_kwallet_x.h",
+      "platform_util_linux.cc",
+      "shell_integration_linux.cc",
+      "shell_integration_linux.h",
+      "speech/tts_linux.cc",
+      "themes/theme_service_aurax11.cc",
+      "themes/theme_service_aurax11.h",
+      "web_applications/web_app_linux.cc",
+    ]
   }
   if (enable_plugin_installation) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_plugin_installation_sources,
-                    ".",
-                    "//chrome")
+    sources += [
+      "plugins/plugin_installer.cc",
+      "plugins/plugin_installer.h",
+      "plugins/plugin_installer_observer.cc",
+      "plugins/plugin_installer_observer.h",
+      "plugins/plugins_resource_service.cc",
+      "plugins/plugins_resource_service.h",
+    ]
   }
   if (enable_app_list) {
     deps += [ "//ui/app_list" ]
   }
   if (enable_supervised_users) {
-    sources += rebase_path(gypi_values.chrome_browser_supervised_user_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "content_settings/content_settings_supervised_provider.cc",
+      "content_settings/content_settings_supervised_provider.h",
+      "supervised_user/child_accounts/child_account_service.cc",
+      "supervised_user/child_accounts/child_account_service.h",
+      "supervised_user/child_accounts/child_account_service_factory.cc",
+      "supervised_user/child_accounts/child_account_service_factory.h",
+      "supervised_user/child_accounts/family_info_fetcher.cc",
+      "supervised_user/child_accounts/family_info_fetcher.h",
+      "supervised_user/child_accounts/permission_request_creator_apiary.cc",
+      "supervised_user/child_accounts/permission_request_creator_apiary.h",
+      "supervised_user/experimental/safe_search_url_reporter.cc",
+      "supervised_user/experimental/safe_search_url_reporter.h",
+      "supervised_user/experimental/supervised_user_async_url_checker.cc",
+      "supervised_user/experimental/supervised_user_async_url_checker.h",
+      "supervised_user/experimental/supervised_user_blacklist.cc",
+      "supervised_user/experimental/supervised_user_blacklist.h",
+      "supervised_user/experimental/supervised_user_filtering_switches.cc",
+      "supervised_user/experimental/supervised_user_filtering_switches.h",
+      "supervised_user/permission_request_creator.h",
+      "supervised_user/supervised_user_bookmarks_handler.cc",
+      "supervised_user/supervised_user_bookmarks_handler.h",
+      "supervised_user/supervised_user_constants.cc",
+      "supervised_user/supervised_user_constants.h",
+      "supervised_user/supervised_user_content_provider_android.cc",
+      "supervised_user/supervised_user_content_provider_android.h",
+      "supervised_user/supervised_user_features.cc",
+      "supervised_user/supervised_user_features.h",
+      "supervised_user/supervised_user_interstitial.cc",
+      "supervised_user/supervised_user_interstitial.h",
+      "supervised_user/supervised_user_navigation_observer.cc",
+      "supervised_user/supervised_user_navigation_observer.h",
+      "supervised_user/supervised_user_pref_store.cc",
+      "supervised_user/supervised_user_pref_store.h",
+      "supervised_user/supervised_user_resource_throttle.cc",
+      "supervised_user/supervised_user_resource_throttle.h",
+      "supervised_user/supervised_user_service.cc",
+      "supervised_user/supervised_user_service.h",
+      "supervised_user/supervised_user_service_factory.cc",
+      "supervised_user/supervised_user_service_factory.h",
+      "supervised_user/supervised_user_service_observer.h",
+      "supervised_user/supervised_user_settings_service.cc",
+      "supervised_user/supervised_user_settings_service.h",
+      "supervised_user/supervised_user_settings_service_factory.cc",
+      "supervised_user/supervised_user_settings_service_factory.h",
+      "supervised_user/supervised_user_site_list.cc",
+      "supervised_user/supervised_user_site_list.h",
+      "supervised_user/supervised_user_sync_data_type_controller.cc",
+      "supervised_user/supervised_user_sync_data_type_controller.h",
+      "supervised_user/supervised_user_url_filter.cc",
+      "supervised_user/supervised_user_url_filter.h",
+      "supervised_user/supervised_user_whitelist_service.cc",
+      "supervised_user/supervised_user_whitelist_service.h",
+      "supervised_user/supervised_users.h",
+    ]
   }
   if (enable_supervised_users && !is_android) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_supervised_user_legacy_sources,
-                    ".",
-                    "//chrome")
+    # TODO(bauerb): This code should be removed (on desktop) once child account
+    # support has launched (https://crbug.com/505443).
+    sources += [
+      "supervised_user/legacy/custodian_profile_downloader_service.cc",
+      "supervised_user/legacy/custodian_profile_downloader_service.h",
+      "supervised_user/legacy/custodian_profile_downloader_service_factory.cc",
+      "supervised_user/legacy/custodian_profile_downloader_service_factory.h",
+      "supervised_user/legacy/permission_request_creator_sync.cc",
+      "supervised_user/legacy/permission_request_creator_sync.h",
+      "supervised_user/legacy/supervised_user_pref_mapping_service.cc",
+      "supervised_user/legacy/supervised_user_pref_mapping_service.h",
+      "supervised_user/legacy/supervised_user_pref_mapping_service_factory.cc",
+      "supervised_user/legacy/supervised_user_pref_mapping_service_factory.h",
+      "supervised_user/legacy/supervised_user_refresh_token_fetcher.cc",
+      "supervised_user/legacy/supervised_user_refresh_token_fetcher.h",
+      "supervised_user/legacy/supervised_user_registration_utility.cc",
+      "supervised_user/legacy/supervised_user_registration_utility.h",
+      "supervised_user/legacy/supervised_user_registration_utility_stub.cc",
+      "supervised_user/legacy/supervised_user_registration_utility_stub.h",
+      "supervised_user/legacy/supervised_user_shared_settings_service.cc",
+      "supervised_user/legacy/supervised_user_shared_settings_service.h",
+      "supervised_user/legacy/supervised_user_shared_settings_service_factory.cc",
+      "supervised_user/legacy/supervised_user_shared_settings_service_factory.h",
+      "supervised_user/legacy/supervised_user_shared_settings_update.cc",
+      "supervised_user/legacy/supervised_user_shared_settings_update.h",
+      "supervised_user/legacy/supervised_user_sync_service.cc",
+      "supervised_user/legacy/supervised_user_sync_service.h",
+      "supervised_user/legacy/supervised_user_sync_service_factory.cc",
+      "supervised_user/legacy/supervised_user_sync_service_factory.h",
+      "supervised_user/legacy/supervised_user_sync_service_observer.h",
+    ]
   }
   if (enable_supervised_users && enable_themes) {
-    sources += rebase_path(
-            gypi_values.chrome_browser_supervised_user_and_themes_sources,
-            ".",
-            "//chrome")
+    sources += [
+      "supervised_user/supervised_user_theme.cc",
+      "supervised_user/supervised_user_theme.h",
+    ]
   }
   if (enable_webrtc) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_webrtc_sources, ".", "//chrome")
+    sources += [
+      # TODO(brettw) should webrtc_log_list.cc go here?
+      "media/audio_debug_recordings_handler.cc",
+      "media/audio_debug_recordings_handler.h",
+      "media/webrtc_event_log_handler.cc",
+      "media/webrtc_event_log_handler.h",
+      "media/webrtc_log_uploader.cc",
+      "media/webrtc_log_uploader.h",
+      "media/webrtc_log_util.cc",
+      "media/webrtc_log_util.h",
+      "media/webrtc_logging_handler_host.cc",
+      "media/webrtc_logging_handler_host.h",
+      "media/webrtc_rtp_dump_handler.cc",
+      "media/webrtc_rtp_dump_handler.h",
+      "media/webrtc_rtp_dump_writer.cc",
+      "media/webrtc_rtp_dump_writer.h",
+    ]
   }
   if (enable_service_discovery) {
-    sources += rebase_path(gypi_values.chrome_browser_service_discovery_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "local_discovery/endpoint_resolver.cc",
+      "local_discovery/endpoint_resolver.h",
+      "local_discovery/service_discovery_client.cc",
+      "local_discovery/service_discovery_client.h",
+      "local_discovery/service_discovery_client_mac.h",
+      "local_discovery/service_discovery_client_mac.mm",
+      "local_discovery/service_discovery_client_mac_factory.h",
+      "local_discovery/service_discovery_client_mac_factory.mm",
+      "local_discovery/service_discovery_device_lister.cc",
+      "local_discovery/service_discovery_device_lister.h",
+      "local_discovery/service_discovery_shared_client.cc",
+      "local_discovery/service_discovery_shared_client.h",
+      "printing/cloud_print/cloud_print_printer_list.cc",
+      "printing/cloud_print/cloud_print_printer_list.h",
+      "printing/cloud_print/device_description.cc",
+      "printing/cloud_print/device_description.h",
+      "printing/cloud_print/gcd_api_flow.cc",
+      "printing/cloud_print/gcd_api_flow.h",
+      "printing/cloud_print/gcd_api_flow_impl.cc",
+      "printing/cloud_print/gcd_api_flow_impl.h",
+      "printing/cloud_print/gcd_constants.cc",
+      "printing/cloud_print/gcd_constants.h",
+      "printing/cloud_print/privet_confirm_api_flow.cc",
+      "printing/cloud_print/privet_confirm_api_flow.h",
+      "printing/cloud_print/privet_constants.cc",
+      "printing/cloud_print/privet_constants.h",
+      "printing/cloud_print/privet_device_lister.cc",
+      "printing/cloud_print/privet_device_lister.h",
+      "printing/cloud_print/privet_device_lister_impl.cc",
+      "printing/cloud_print/privet_device_lister_impl.h",
+      "printing/cloud_print/privet_http.cc",
+      "printing/cloud_print/privet_http.h",
+      "printing/cloud_print/privet_http_asynchronous_factory.cc",
+      "printing/cloud_print/privet_http_asynchronous_factory.h",
+      "printing/cloud_print/privet_http_asynchronous_factory_impl.cc",
+      "printing/cloud_print/privet_http_asynchronous_factory_impl.h",
+      "printing/cloud_print/privet_http_impl.cc",
+      "printing/cloud_print/privet_http_impl.h",
+      "printing/cloud_print/privet_local_printer_lister.cc",
+      "printing/cloud_print/privet_local_printer_lister.h",
+      "printing/cloud_print/privet_notifications.cc",
+      "printing/cloud_print/privet_notifications.h",
+      "printing/cloud_print/privet_notifications_factory.cc",
+      "printing/cloud_print/privet_notifications_factory.h",
+      "printing/cloud_print/privet_url_fetcher.cc",
+      "printing/cloud_print/privet_url_fetcher.h",
+    ]
   }
   if (enable_mdns) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_mdns_sources, ".", "//chrome")
+    sources += [
+      "local_discovery/service_discovery_client_impl.cc",
+      "local_discovery/service_discovery_client_impl.h",
+      "local_discovery/service_discovery_client_mdns.cc",
+      "local_discovery/service_discovery_client_mdns.h",
+      "printing/cloud_print/privet_traffic_detector.cc",
+      "printing/cloud_print/privet_traffic_detector.h",
+    ]
   }
   if (is_android) {
     sources -= [
@@ -2019,8 +3689,178 @@
 if (android_java_ui) {
   # GYP version: chrome/chrome_browser.gypi:chrome_browser_jni_headers
   generate_jni("jni_headers") {
-    sources =
-        rebase_path(gypi_values.chrome_browser_jni_sources, ".", "//chrome")
+    sources = [
+      "../android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java",
+      "../android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java",
+      "../android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java",
+      "../android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java",
+      "../android/java/src/org/chromium/chrome/browser/ChromeApplication.java",
+      "../android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java",
+      "../android/java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java",
+      "../android/java/src/org/chromium/chrome/browser/DevToolsServer.java",
+      "../android/java/src/org/chromium/chrome/browser/IntentHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/JavaExceptionReporter.java",
+      "../android/java/src/org/chromium/chrome/browser/JavascriptAppModalDialog.java",
+      "../android/java/src/org/chromium/chrome/browser/PasswordUIView.java",
+      "../android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java",
+      "../android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java",
+      "../android/java/src/org/chromium/chrome/browser/ShortcutHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/TabState.java",
+      "../android/java/src/org/chromium/chrome/browser/TtsPlatformImpl.java",
+      "../android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java",
+      "../android/java/src/org/chromium/chrome/browser/WarmupManager.java",
+      "../android/java/src/org/chromium/chrome/browser/WebContentsFactory.java",
+      "../android/java/src/org/chromium/chrome/browser/accessibility/FontSizePrefs.java",
+      "../android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
+      "../android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
+      "../android/java/src/org/chromium/chrome/browser/blimp/BlimpClientContextFactory.java",
+      "../android/java/src/org/chromium/chrome/browser/blimp/ChromeBlimpClientContextDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/browsing_data/UrlFilterBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountFeedbackReporter.java",
+      "../android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/SceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java",
+      "../android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java",
+      "../android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java",
+      "../android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java",
+      "../android/java/src/org/chromium/chrome/browser/database/SQLiteCursor.java",
+      "../android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java",
+      "../android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java",
+      "../android/java/src/org/chromium/chrome/browser/document/DocumentWebContentsDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerServiceFactory.java",
+      "../android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerTabUtils.java",
+      "../android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerUIUtils.java",
+      "../android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/download/DownloadController.java",
+      "../android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java",
+      "../android/java/src/org/chromium/chrome/browser/download/ui/ThumbnailProviderImpl.java",
+      "../android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/favicon/LargeIconBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java",
+      "../android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
+      "../android/java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/historyreport/HistoryReportJniBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarDelegateAndroid.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBarDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/GeneratedPasswordSavedInfoBarDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/GroupedPermissionInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBarDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/SimpleConfirmInfoBarBuilder.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/TranslateInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java",
+      "../android/java/src/org/chromium/chrome/browser/invalidation/InvalidationServiceFactory.java",
+      "../android/java/src/org/chromium/chrome/browser/media/cdm/MediaDrmCredentialManager.java",
+      "../android/java/src/org/chromium/chrome/browser/media/remote/RecordCastAction.java",
+      "../android/java/src/org/chromium/chrome/browser/media/remote/RemoteMediaPlayerBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java",
+      "../android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java",
+      "../android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java",
+      "../android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java",
+      "../android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java",
+      "../android/java/src/org/chromium/chrome/browser/metrics/UmaUtils.java",
+      "../android/java/src/org/chromium/chrome/browser/metrics/VariationsSession.java",
+      "../android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java",
+      "../android/java/src/org/chromium/chrome/browser/net/qualityprovider/ExternalEstimateProviderAndroid.java",
+      "../android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java",
+      "../android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/ForeignSessionHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/LogoBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/NewTabPagePrefs.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/RecentlyClosedBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/omnibox/AnswersImage.java",
+      "../android/java/src/org/chromium/chrome/browser/omnibox/AutocompleteController.java",
+      "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java",
+      "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizer.java",
+      "../android/java/src/org/chromium/chrome/browser/omnibox/OmniboxViewUtil.java",
+      "../android/java/src/org/chromium/chrome/browser/pageinfo/CertificateViewer.java",
+      "../android/java/src/org/chromium/chrome/browser/pageinfo/ConnectionInfoPopup.java",
+      "../android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java",
+      "../android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java",
+      "../android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java",
+      "../android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java",
+      "../android/java/src/org/chromium/chrome/browser/password_manager/Credential.java",
+      "../android/java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
+      "../android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java",
+      "../android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java",
+      "../android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java",
+      "../android/java/src/org/chromium/chrome/browser/profiles/MostVisitedSites.java",
+      "../android/java/src/org/chromium/chrome/browser/profiles/Profile.java",
+      "../android/java/src/org/chromium/chrome/browser/profiles/ProfileDownloader.java",
+      "../android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java",
+      "../android/java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java",
+      "../android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java",
+      "../android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlService.java",
+      "../android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/AccountManagementScreenHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/SigninManager.java",
+      "../android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java",
+      "../android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java",
+      "../android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java",
+      "../android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java",
+      "../android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java",
+      "../android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java",
+      "../android/java/src/org/chromium/chrome/browser/tab/Tab.java",
+      "../android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java",
+      "../android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java",
+      "../android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java",
+      "../android/java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java",
+      "../android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java",
+      "../android/java/src/org/chromium/chrome/browser/util/PlatformUtil.java",
+      "../android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogHelper.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorFetcher.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java",
+      "../android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java",
+    ]
     jni_package = "chrome"
   }
 
@@ -2387,8 +4227,10 @@
 
 if (enable_rlz_support) {
   static_library("rlz") {
-    sources =
-        rebase_path(gypi_values.chrome_browser_rlz_sources, ".", "//chrome")
+    sources = [
+      "rlz/chrome_rlz_tracker_delegate.cc",
+      "rlz/chrome_rlz_tracker_delegate.h",
+    ]
     deps = [
       "//components/google/core/browser",
       "//components/omnibox/browser",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bdd12c64..c247b45 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2184,8 +2184,9 @@
 }
 
 void RecordUMAStatistics(flags_ui::FlagsStorage* flags_storage) {
-  std::set<std::string> flags = flags_storage->GetFlags();
-  ReportAboutFlagsHistogram("Launch.FlagsAtStartup", flags);
+  const std::set<std::string> switches =
+      FlagsStateSingleton::GetFlagsState()->GetSwitchesFromFlags(flags_storage);
+  ReportAboutFlagsHistogram("Launch.FlagsAtStartup", switches);
 }
 
 base::HistogramBase::Sample GetSwitchUMAId(const std::string& switch_name) {
diff --git a/chrome/browser/android/chrome_jni_registrar.cc b/chrome/browser/android/chrome_jni_registrar.cc
index 7e2d96e..a054ed5 100644
--- a/chrome/browser/android/chrome_jni_registrar.cc
+++ b/chrome/browser/android/chrome_jni_registrar.cc
@@ -44,6 +44,7 @@
 #include "chrome/browser/android/download/chrome_download_delegate.h"
 #include "chrome/browser/android/download/download_controller.h"
 #include "chrome/browser/android/download/download_manager_service.h"
+#include "chrome/browser/android/download/ui/thumbnail_provider.h"
 #include "chrome/browser/android/favicon_helper.h"
 #include "chrome/browser/android/feature_utilities.h"
 #include "chrome/browser/android/feedback/connectivity_checker.h"
@@ -357,6 +358,7 @@
     {"TabStripSceneLayer", RegisterTabStripSceneLayer},
     {"TabWebContentsDelegateAndroid", RegisterTabWebContentsDelegateAndroid},
     {"TemplateUrlServiceAndroid", TemplateUrlServiceAndroid::Register},
+    {"ThumbnailProvider", ThumbnailProvider::RegisterThumbnailProvider},
     {"ToolbarModelAndroid", ToolbarModelAndroid::RegisterToolbarModelAndroid},
     {"ToolbarSceneLayer", RegisterToolbarSceneLayer},
     {"TranslateInfoBarDelegate", RegisterTranslateInfoBarDelegate},
diff --git a/chrome/browser/android/download/ui/thumbnail_provider.cc b/chrome/browser/android/download/ui/thumbnail_provider.cc
new file mode 100644
index 0000000..6e28e99
--- /dev/null
+++ b/chrome/browser/android/download/ui/thumbnail_provider.cc
@@ -0,0 +1,168 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/download/ui/thumbnail_provider.h"
+
+#include "base/android/jni_string.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/image_decoder.h"
+#include "content/public/browser/browser_thread.h"
+#include "jni/ThumbnailProviderImpl_jni.h"
+#include "skia/ext/image_operations.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/android/java_bitmap.h"
+#include "ui/gfx/skbitmap_operations.h"
+
+class SkBitmap;
+
+using base::android::JavaParamRef;
+
+namespace {
+
+// Ignore image files that are too large to avoid long delays.
+const int64_t kMaxImageSize = 10 * 1024 * 1024;  // 10 MB
+
+class ImageThumbnailRequest : public ImageDecoder::ImageRequest {
+ public:
+  static void Create(int icon_size,
+                     const std::string& file_path,
+                     base::WeakPtr<ThumbnailProvider> weak_provider) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
+    ImageThumbnailRequest* request =
+        new ImageThumbnailRequest(icon_size, file_path, weak_provider);
+    request->Start();
+  }
+
+ protected:
+  void OnImageDecoded(const SkBitmap& decoded_image) override {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
+
+    SkBitmap thumbnail = decoded_image;
+    if (!decoded_image.drawsNothing()) {
+      // Shrink the image down so that its smallest dimension is equal to or
+      // smaller than the requested size.
+      int min_dimension =
+          std::min(decoded_image.width(), decoded_image.height());
+
+      if (min_dimension > icon_size_) {
+        uint64_t width = static_cast<uint64_t>(decoded_image.width());
+        uint64_t height = static_cast<uint64_t>(decoded_image.height());
+        thumbnail = skia::ImageOperations::Resize(
+            decoded_image, skia::ImageOperations::RESIZE_BEST,
+            width * icon_size_ / min_dimension,
+            height * icon_size_ / min_dimension);
+      }
+    }
+
+    FinishRequest(thumbnail);
+  }
+
+  void OnDecodeImageFailed() override {
+    LOG(ERROR) << "Failed to decode image: " << file_path_;
+    FinishRequest(SkBitmap());
+  }
+
+ private:
+  ImageThumbnailRequest(int icon_size,
+                        const std::string& file_path,
+                        base::WeakPtr<ThumbnailProvider> weak_provider)
+      : icon_size_(icon_size),
+        file_path_(file_path),
+        weak_provider_(weak_provider) {}
+
+  void Start() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
+
+    // Confirm that the file's size is within our threshold.
+    int64_t file_size;
+    base::FilePath path = base::FilePath::FromUTF8Unsafe(file_path_);
+    if (!base::GetFileSize(path, &file_size) || file_size > kMaxImageSize) {
+      LOG(ERROR) << "Unexpected file size: " << file_path_ << ", " << file_size;
+      FinishRequest(SkBitmap());
+    }
+
+    // Make sure the file isn't empty.
+    std::string data;
+    bool success = base::ReadFileToString(path, &data);
+    if (!success || data.empty()) {
+      LOG(ERROR) << "Failed to read file: " << file_path_;
+      FinishRequest(SkBitmap());
+    }
+
+    ImageDecoder::Start(this, data);
+  }
+
+  void FinishRequest(const SkBitmap& thumbnail) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
+
+    content::BrowserThread::PostTask(
+        content::BrowserThread::UI, FROM_HERE,
+        base::Bind(&ThumbnailProvider::OnThumbnailRetrieved,
+                   weak_provider_, file_path_, thumbnail));
+    task_runner()->DeleteSoon(FROM_HERE, this);
+  }
+
+  const int icon_size_;
+  std::string file_path_;
+  base::WeakPtr<ThumbnailProvider> weak_provider_;
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(ImageThumbnailRequest);
+};
+
+}  // namespace
+
+ThumbnailProvider::ThumbnailProvider(const JavaParamRef<jobject>& jobj)
+    : java_delegate_(jobj), weak_factory_(this) {}
+
+ThumbnailProvider::~ThumbnailProvider() {
+  java_delegate_.Reset();
+}
+
+void ThumbnailProvider::Destroy(JNIEnv* env,
+                                const JavaParamRef<jobject>& jobj) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  delete this;
+}
+
+void ThumbnailProvider::OnThumbnailRetrieved(const std::string& file_path,
+                                             const SkBitmap& thumbnail) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (java_delegate_.is_null())
+    return;
+
+  // Send the bitmap back to Java-land.
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_ThumbnailProviderImpl_onThumbnailRetrieved(
+      env, java_delegate_,
+      base::android::ConvertUTF8ToJavaString(env, file_path),
+      gfx::ConvertToJavaBitmap(&thumbnail));
+}
+
+void ThumbnailProvider::RetrieveThumbnail(JNIEnv* env,
+                                          const JavaParamRef<jobject>& jobj,
+                                          jstring jfile_path,
+                                          jint icon_size) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  // The ImageThumbnailRequest deletes itself on completion.  Don't track it
+  // because we don't (currently) cancel it.
+  std::string path = base::android::ConvertJavaStringToUTF8(env, jfile_path);
+  content::BrowserThread::PostTask(
+      content::BrowserThread::FILE, FROM_HERE,
+      base::Bind(&ImageThumbnailRequest::Create, icon_size, path,
+                 weak_factory_.GetWeakPtr()));
+}
+
+// static
+bool ThumbnailProvider::RegisterThumbnailProvider(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+// static
+static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& jobj) {
+  return reinterpret_cast<intptr_t>(new ThumbnailProvider(jobj));
+}
diff --git a/chrome/browser/android/download/ui/thumbnail_provider.h b/chrome/browser/android/download/ui/thumbnail_provider.h
new file mode 100644
index 0000000..dcdab20
--- /dev/null
+++ b/chrome/browser/android/download/ui/thumbnail_provider.h
@@ -0,0 +1,47 @@
+// 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 CHROME_BROWSER_ANDROID_DOWNLOAD_UI_THUMBNAIL_PROVIDER_H_
+#define CHROME_BROWSER_ANDROID_DOWNLOAD_UI_THUMBNAIL_PROVIDER_H_
+
+#include <string>
+
+#include "base/android/jni_android.h"
+#include "chrome/browser/image_decoder.h"
+
+// Kicks off asynchronous pipelines for creating thumbnails for local files.
+// The native-side ThumbnailProvider is owned by the Java-side and can be
+// safely destroyed while a request is being processed.
+class ThumbnailProvider {
+ public:
+  explicit ThumbnailProvider(const base::android::JavaParamRef<jobject>& jobj);
+
+  // Destroys the ThumbnailProvider.  Any currently running ImageRequest will
+  // delete itself when it has completed.
+  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj);
+
+  // Kicks off an asynchronous process to retrieve the thumbnail for the file
+  // located at |file_path| with a max size of |icon_size| in each dimension.
+  void RetrieveThumbnail(JNIEnv* env,
+                         const base::android::JavaParamRef<jobject>& jobj,
+                         jstring jfile_path,
+                         jint icon_size);
+
+  // Called when the thumbnail is ready.  |thumbnail| will be empty on failure.
+  void OnThumbnailRetrieved(const std::string& file_path,
+                            const SkBitmap& thumbnail);
+
+  // Registers the JNI bindings.
+  static bool RegisterThumbnailProvider(JNIEnv* env);
+
+ private:
+  ~ThumbnailProvider();
+
+  base::android::ScopedJavaGlobalRef<jobject> java_delegate_;
+  base::WeakPtrFactory<ThumbnailProvider> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThumbnailProvider);
+};
+
+#endif  // CHROME_BROWSER_ANDROID_DOWNLOAD_UI_THUMBNAIL_PROVIDER_H_
diff --git a/chrome/browser/android/service_tab_launcher.cc b/chrome/browser/android/service_tab_launcher.cc
index 02ae62c..92a8a1a2 100644
--- a/chrome/browser/android/service_tab_launcher.cc
+++ b/chrome/browser/android/service_tab_launcher.cc
@@ -43,8 +43,10 @@
                                    const content::OpenURLParams& params,
                                    const TabLaunchedCallback& callback) {
   WindowOpenDisposition disposition = params.disposition;
-  if (disposition != NEW_WINDOW && disposition != NEW_POPUP &&
-      disposition != NEW_FOREGROUND_TAB && disposition != NEW_BACKGROUND_TAB) {
+  if (disposition != WindowOpenDisposition::NEW_WINDOW &&
+      disposition != WindowOpenDisposition::NEW_POPUP &&
+      disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB &&
+      disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB) {
     // ServiceTabLauncher can currently only launch new tabs.
     NOTIMPLEMENTED();
     return;
@@ -66,7 +68,7 @@
 
   Java_ServiceTabLauncher_launchTab(env, GetApplicationContext(), request_id,
                                     browser_context->IsOffTheRecord(), url,
-                                    disposition, referrer_url,
+                                    static_cast<int>(disposition), referrer_url,
                                     params.referrer.policy, headers, post_data);
 }
 
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 463f277a..9c37c72 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -87,6 +87,7 @@
 #include "skia/ext/image_operations.h"
 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
 #include "ui/android/view_android.h"
+#include "ui/android/window_android.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/window_open_disposition.h"
 #include "ui/display/display.h"
@@ -214,11 +215,11 @@
   WindowOpenDisposition disposition = params->disposition;
   const GURL& url = params->url;
 
-  if (disposition == NEW_POPUP ||
-      disposition == NEW_FOREGROUND_TAB ||
-      disposition == NEW_BACKGROUND_TAB ||
-      disposition == NEW_WINDOW ||
-      disposition == OFF_THE_RECORD) {
+  if (disposition == WindowOpenDisposition::NEW_POPUP ||
+      disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_WINDOW ||
+      disposition == WindowOpenDisposition::OFF_THE_RECORD) {
     JNIEnv* env = AttachCurrentThread();
     ScopedJavaLocalRef<jobject> jobj = weak_java_tab_.get(env);
     ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString(env, url.spec()));
@@ -227,9 +228,9 @@
     ScopedJavaLocalRef<jobject> jpost_data;
     if (params->uses_post && params->post_data)
       jpost_data = params->post_data->ToJavaObject(env);
-    Java_Tab_openNewTab(env, jobj, jurl, jheaders, jpost_data, disposition,
-                        params->created_with_opener,
-                        params->is_renderer_initiated);
+    Java_Tab_openNewTab(
+        env, jobj, jurl, jheaders, jpost_data, static_cast<int>(disposition),
+        params->created_with_opener, params->is_renderer_initiated);
   } else {
     NOTIMPLEMENTED();
   }
@@ -423,13 +424,16 @@
 base::android::ScopedJavaLocalRef<jobject> TabAndroid::InitBlimpContents(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
-    const JavaParamRef<jobject>& j_profile) {
+    const JavaParamRef<jobject>& j_profile,
+    jlong window_android_ptr) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile.obj());
   DCHECK(!profile->IsOffTheRecord());
   blimp::client::BlimpClientContext* context =
       BlimpClientContextFactory::GetForBrowserContext(profile);
   DCHECK(context);
-  blimp_contents_ = context->CreateBlimpContents();
+  ui::WindowAndroid* window =
+      reinterpret_cast<ui::WindowAndroid*>(window_android_ptr);
+  blimp_contents_ = context->CreateBlimpContents(window);
   DCHECK(blimp_contents_);
 
   // Let's detach the layer from WebContents first, just to be sure.
diff --git a/chrome/browser/android/tab_android.h b/chrome/browser/android/tab_android.h
index 832d52d..766c4384 100644
--- a/chrome/browser/android/tab_android.h
+++ b/chrome/browser/android/tab_android.h
@@ -179,7 +179,8 @@
   base::android::ScopedJavaLocalRef<jobject> InitBlimpContents(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj,
-      const base::android::JavaParamRef<jobject>& j_profile);
+      const base::android::JavaParamRef<jobject>& j_profile,
+      jlong window_android_ptr);
   void UpdateDelegates(
         JNIEnv* env,
         const base::android::JavaParamRef<jobject>& obj,
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index 41507a3..fa9eb215 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -300,12 +300,12 @@
     WebContents* source,
     const content::OpenURLParams& params) {
   WindowOpenDisposition disposition = params.disposition;
-  if (!source || (disposition != CURRENT_TAB &&
-                  disposition != NEW_FOREGROUND_TAB &&
-                  disposition != NEW_BACKGROUND_TAB &&
-                  disposition != OFF_THE_RECORD &&
-                  disposition != NEW_POPUP &&
-                  disposition != NEW_WINDOW)) {
+  if (!source || (disposition != WindowOpenDisposition::CURRENT_TAB &&
+                  disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB &&
+                  disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB &&
+                  disposition != WindowOpenDisposition::OFF_THE_RECORD &&
+                  disposition != WindowOpenDisposition::NEW_POPUP &&
+                  disposition != WindowOpenDisposition::NEW_WINDOW)) {
     // We can't handle this here.  Give the parent a chance.
     return WebContentsDelegateAndroid::OpenURLFromTab(source, params);
   }
@@ -323,10 +323,10 @@
       PopupBlockerTabHelper::FromWebContents(source);
   DCHECK(popup_blocker_helper);
 
-  if ((params.disposition == NEW_POPUP ||
-       params.disposition == NEW_FOREGROUND_TAB ||
-       params.disposition == NEW_BACKGROUND_TAB ||
-       params.disposition == NEW_WINDOW) &&
+  if ((params.disposition == WindowOpenDisposition::NEW_POPUP ||
+       params.disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+       params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+       params.disposition == WindowOpenDisposition::NEW_WINDOW) &&
       !params.user_gesture &&
       !base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kDisablePopupBlocking)) {
@@ -336,7 +336,7 @@
     }
   }
 
-  if (disposition == CURRENT_TAB) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
     // Only prerender for a current-tab navigation to avoid session storage
     // namespace issues.
     nav_params.target_contents = source;
@@ -369,9 +369,9 @@
     bool user_gesture,
     bool* was_blocked) {
   // No code for this yet.
-  DCHECK_NE(disposition, SAVE_TO_DISK);
+  DCHECK_NE(disposition, WindowOpenDisposition::SAVE_TO_DISK);
   // Can't create a new contents for the current tab - invalid case.
-  DCHECK_NE(disposition, CURRENT_TAB);
+  DCHECK_NE(disposition, WindowOpenDisposition::CURRENT_TAB);
 
   TabHelpers::AttachTabHelpers(new_contents);
 
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm
index d9fc6b4..f6abb9f 100644
--- a/chrome/browser/app_controller_mac_browsertest.mm
+++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -642,7 +642,7 @@
   // Test that opening a new tab updates the handoff URL.
   GURL test_url2 = embedded_test_server()->GetURL("/title2.html");
   chrome::NavigateParams params(browser(), test_url2, ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   ui_test_utils::NavigateToURL(&params);
   EXPECT_EQ(g_handoff_url, test_url2);
 
@@ -657,7 +657,7 @@
   // Test that opening a new browser window updates the handoff URL.
   GURL test_url3 = embedded_test_server()->GetURL("/title3.html");
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(test_url3), NEW_WINDOW,
+      browser(), GURL(test_url3), WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(g_handoff_url, test_url3);
 
@@ -673,7 +673,7 @@
   // The URLs of incognito windows should not be passed to Handoff.
   GURL test_url4 = embedded_test_server()->GetURL("/simple.html");
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(test_url4), OFF_THE_RECORD,
+      browser(), GURL(test_url4), WindowOpenDisposition::OFF_THE_RECORD,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(g_handoff_url, GURL());
 
@@ -681,7 +681,7 @@
   EXPECT_EQ(2u, active_browser_list->size());
   Browser* browser3 = active_browser_list->get(1);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser3, test_url4, NEW_FOREGROUND_TAB,
+      browser3, test_url4, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
   EXPECT_EQ(g_handoff_url, GURL());
 
diff --git a/chrome/browser/apps/app_browsertest.cc b/chrome/browser/apps/app_browsertest.cc
index f513a78..b2ac59e 100644
--- a/chrome/browser/apps/app_browsertest.cc
+++ b/chrome/browser/apps/app_browsertest.cc
@@ -231,9 +231,9 @@
       return false;
     }
 
-    AppLaunchParams params(browser()->profile(), extension,
-                           extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                           extensions::SOURCE_TEST);
+    AppLaunchParams params(
+        browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST);
     params.command_line = command_line;
     params.current_directory = test_data_dir_;
     OpenApplication(params);
@@ -880,9 +880,9 @@
     content::WindowedNotificationObserver app_loaded_observer(
         content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
         content::NotificationService::AllSources());
-    OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                    LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                    extensions::SOURCE_TEST));
+    OpenApplication(AppLaunchParams(
+        browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
     app_loaded_observer.Wait();
     window = GetFirstAppWindow();
     ASSERT_TRUE(window);
@@ -1011,9 +1011,9 @@
   ASSERT_TRUE(should_install.seen());
 
   ExtensionTestMessageListener launched_listener("Launched", false);
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
 
   ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
 }
@@ -1034,9 +1034,9 @@
   ASSERT_TRUE(extension);
 
   ExtensionTestMessageListener launched_listener("Launched", false);
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
 
   ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
   ASSERT_FALSE(should_not_install.seen());
@@ -1072,9 +1072,9 @@
   ASSERT_TRUE(should_install.seen());
 
   ExtensionTestMessageListener launched_listener("Launched", false);
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
 
   ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
 }
@@ -1097,9 +1097,9 @@
 
   {
     ExtensionTestMessageListener launched_listener("Launched", false);
-    OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                    LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                    extensions::SOURCE_TEST));
+    OpenApplication(AppLaunchParams(
+        browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
     ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
   }
 
@@ -1244,8 +1244,8 @@
   registry->AddObserver(this);
 
   OpenApplication(CreateAppLaunchParamsUserContainer(
-      incognito_profile, file_manager, NEW_FOREGROUND_TAB,
-      extensions::SOURCE_TEST));
+      incognito_profile, file_manager,
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, extensions::SOURCE_TEST));
 
   while (!base::ContainsKey(opener_app_ids_, file_manager->id())) {
     content::RunAllPendingInMessageLoop();
diff --git a/chrome/browser/apps/app_browsertest_util.cc b/chrome/browser/apps/app_browsertest_util.cc
index 5f698e46..86b2c8d 100644
--- a/chrome/browser/apps/app_browsertest_util.cc
+++ b/chrome/browser/apps/app_browsertest_util.cc
@@ -121,14 +121,15 @@
 }
 
 void PlatformAppBrowserTest::LaunchPlatformApp(const Extension* extension) {
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
 }
 
 void PlatformAppBrowserTest::LaunchHostedApp(const Extension* extension) {
   OpenApplication(CreateAppLaunchParamsUserContainer(
-      browser()->profile(), extension, NEW_FOREGROUND_TAB,
+      browser()->profile(), extension,
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       extensions::SOURCE_COMMAND_LINE));
 }
 
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
index 61269fe..940270c 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
+++ b/chrome/browser/apps/app_shim/extension_app_shim_handler_mac.cc
@@ -216,7 +216,7 @@
       extension_misc::APP_LAUNCH_CMD_LINE_APP, extension->GetType());
   if (extension->is_hosted_app()) {
     OpenApplication(CreateAppLaunchParamsUserContainer(
-        profile, extension, NEW_FOREGROUND_TAB,
+        profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         extensions::SOURCE_COMMAND_LINE));
     return;
   }
diff --git a/chrome/browser/apps/app_window_browsertest.cc b/chrome/browser/apps/app_window_browsertest.cc
index b85606b5e..2dc8f4c 100644
--- a/chrome/browser/apps/app_window_browsertest.cc
+++ b/chrome/browser/apps/app_window_browsertest.cc
@@ -218,9 +218,9 @@
       test_data_dir_.AppendASCII("platform_apps").AppendASCII("window_api"));
   EXPECT_TRUE(extension);
 
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
 
   ExtensionTestMessageListener geometry_listener("ListenGeometryChange", true);
 
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index 791e2a5..fb18949 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -1939,9 +1939,8 @@
   ExtensionTestMessageListener load_listener("WebViewTest.LOADSTOP", false);
 
   // Navigating to a file URL is forbidden inside a <webview>.
-  content::OpenURLParams params(GURL("file://foo"),
-                                content::Referrer(),
-                                CURRENT_TAB,
+  content::OpenURLParams params(GURL("file://foo"), content::Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
                                 true /* is_renderer_initiated */);
   GetGuestWebContents()->GetDelegate()->OpenURLFromTab(
@@ -1964,9 +1963,9 @@
   ExtensionTestMessageListener load_listener("WebViewTest.LOADSTOP", false);
 
   GURL test_url("http://www.google.com");
-  content::OpenURLParams params(test_url, content::Referrer(), CURRENT_TAB,
-                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                false /* is_renderer_initiated */);
+  content::OpenURLParams params(
+      test_url, content::Referrer(), WindowOpenDisposition::CURRENT_TAB,
+      ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initiated */);
   GetGuestWebContents()->GetDelegate()->OpenURLFromTab(GetGuestWebContents(),
                                                        params);
 
@@ -1984,9 +1983,8 @@
       "WebViewTest.NEWWINDOW", false);
 
   // Navigating to a file URL is forbidden inside a <webview>.
-  content::OpenURLParams params(GURL("file://foo"),
-                                content::Referrer(),
-                                NEW_BACKGROUND_TAB,
+  content::OpenURLParams params(GURL("file://foo"), content::Referrer(),
+                                WindowOpenDisposition::NEW_BACKGROUND_TAB,
                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
                                 true /* is_renderer_initiated */);
   GetGuestWebContents()->GetDelegate()->OpenURLFromTab(
diff --git a/chrome/browser/apps/install_chrome_app.cc b/chrome/browser/apps/install_chrome_app.cc
index 0f5fc2f..06b33d0 100644
--- a/chrome/browser/apps/install_chrome_app.cc
+++ b/chrome/browser/apps/install_chrome_app.cc
@@ -83,11 +83,9 @@
   Browser* browser = BrowserList::GetInstance()->get(0);
   DCHECK(browser);
 
-  content::OpenURLParams params(GetAppInstallUrl(app_id),
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                false);
+  content::OpenURLParams params(GetAppInstallUrl(app_id), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
   browser->OpenURL(params);
 
   ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index 23dcaf3d..46de9bd 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -178,7 +178,7 @@
     GURL url = embedded_test_server()->GetURL("/autofill/" + filename);
     chrome::NavigateParams params(browser(), url,
                                   ui::PAGE_TRANSITION_LINK);
-    params.disposition = NEW_FOREGROUND_TAB;
+    params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     ui_test_utils::NavigateToURL(&params);
 
     std::unique_ptr<WindowedPersonalDataManagerObserver> observer;
diff --git a/chrome/browser/autofill/content_autofill_driver_browsertest.cc b/chrome/browser/autofill/content_autofill_driver_browsertest.cc
index 3174bcb..d2a6bdd 100644
--- a/chrome/browser/autofill/content_autofill_driver_browsertest.cc
+++ b/chrome/browser/autofill/content_autofill_driver_browsertest.cc
@@ -136,16 +136,12 @@
   scoped_refptr<content::MessageLoopRunner> runner =
       new content::MessageLoopRunner;
   nav_entry_committed_callback_ = runner->QuitClosure();
-  browser()->OpenURL(content::OpenURLParams(GURL(chrome::kChromeUIBookmarksURL),
-                                            content::Referrer(),
-                                            CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
-  browser()->OpenURL(content::OpenURLParams(GURL(chrome::kChromeUIAboutURL),
-                                            content::Referrer(),
-                                            CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(
+      GURL(chrome::kChromeUIBookmarksURL), content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(content::OpenURLParams(
+      GURL(chrome::kChromeUIAboutURL), content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   runner->Run();
   nav_entry_committed_callback_.Reset();
 }
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc
index d14ac59..b8c9aa2 100644
--- a/chrome/browser/background/background_mode_manager.cc
+++ b/chrome/browser/background/background_mode_manager.cc
@@ -400,7 +400,8 @@
     Profile* profile,
     const Extension* extension) {
   OpenApplication(CreateAppLaunchParamsUserContainer(
-      profile, extension, NEW_FOREGROUND_TAB, extensions::SOURCE_BACKGROUND));
+      profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      extensions::SOURCE_BACKGROUND));
 }
 
 // static
diff --git a/chrome/browser/browser_commands_unittest.cc b/chrome/browser/browser_commands_unittest.cc
index 644b870..5b7dae4 100644
--- a/chrome/browser/browser_commands_unittest.cc
+++ b/chrome/browser/browser_commands_unittest.cc
@@ -164,8 +164,9 @@
   // Navigate to a url.
   GURL url1("http://foo/1");
   AddTab(browser(), url1);
-  browser()->OpenURL(OpenURLParams(
-      url1, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(OpenURLParams(url1, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
 
   chrome::BookmarkCurrentPageAllowingExtensionOverrides(browser());
 
@@ -184,7 +185,7 @@
   NavigateAndCommitActiveTab(url2);
 
   // Go back in a new background tab.
-  chrome::GoBack(browser(), NEW_BACKGROUND_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::NEW_BACKGROUND_TAB);
   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
   ASSERT_EQ(2, browser()->tab_strip_model()->count());
 
@@ -210,7 +211,7 @@
   // (to test both codepaths).
   CommitPendingLoad(&first->GetController());
   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
-  chrome::GoForward(browser(), NEW_BACKGROUND_TAB);
+  chrome::GoForward(browser(), WindowOpenDisposition::NEW_BACKGROUND_TAB);
 
   // The previous tab should be unchanged and still in the foreground.
   EXPECT_EQ(url1, first->GetLastCommittedURL());
@@ -232,7 +233,7 @@
   browser()->tab_strip_model()->ActivateTabAt(2, true);
   // TODO(brettw) bug 11055: see the comment above about why we need this.
   CommitPendingLoad(&second->GetController());
-  chrome::GoBack(browser(), NEW_FOREGROUND_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::NEW_FOREGROUND_TAB);
   ASSERT_EQ(3, browser()->tab_strip_model()->active_index());
   ASSERT_EQ(url1,
             browser()->tab_strip_model()->GetActiveWebContents()->
@@ -242,7 +243,7 @@
   // TODO(brettw) bug 11055: see the comment above about why we need this.
   CommitPendingLoad(&
       browser()->tab_strip_model()->GetActiveWebContents()->GetController());
-  chrome::GoForward(browser(), NEW_FOREGROUND_TAB);
+  chrome::GoForward(browser(), WindowOpenDisposition::NEW_FOREGROUND_TAB);
   ASSERT_EQ(4, browser()->tab_strip_model()->active_index());
   ASSERT_EQ(url2,
             browser()->tab_strip_model()->GetActiveWebContents()->
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 375261fb..da6b10c 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -64,6 +64,7 @@
         <structure name="IDR_CUSTOM_ELEMENTS_OOBE_JS" file="resources\chromeos\login\custom_elements_oobe.js" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_CUSTOM_ELEMENTS_LOCK_HTML" file="resources\chromeos\login\custom_elements_lock.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_CUSTOM_ELEMENTS_LOCK_JS" file="resources\chromeos\login\custom_elements_lock.js" flattenhtml="true" type="chrome_html" />
+        <structure name="IDR_CUSTOM_ELEMENTS_USER_POD_HTML" file="resources\chromeos\login\custom_elements_user_pod.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_HTML" file="resources\chromeos\login\custom_elements_login.html" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_CUSTOM_ELEMENTS_LOGIN_JS" file="resources\chromeos\login\custom_elements_login.js" flattenhtml="true" type="chrome_html" />
         <structure name="IDR_CUSTOM_ELEMENTS_PIN_KEYBOARD_HTML" file="resources\chromeos\quick_unlock\pin_keyboard.html" flattenhtml="true" allowexternalscript="true" type="chrome_html" />
diff --git a/chrome/browser/captive_portal/captive_portal_browsertest.cc b/chrome/browser/captive_portal/captive_portal_browsertest.cc
index 5809e90aa..40b82a00 100644
--- a/chrome/browser/captive_portal/captive_portal_browsertest.cc
+++ b/chrome/browser/captive_portal/captive_portal_browsertest.cc
@@ -1250,10 +1250,9 @@
 
   MultiNavigationObserver navigation_observer;
   CaptivePortalObserver portal_observer(browser->profile());
-  ui_test_utils::NavigateToURLWithDisposition(browser,
-                                              GURL(kMockHttpsUrl),
-                                              CURRENT_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, GURL(kMockHttpsUrl), WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
 
   portal_observer.WaitForResults(1);
 
@@ -1371,10 +1370,9 @@
 
   MultiNavigationObserver navigation_observer;
   CaptivePortalObserver portal_observer(browser->profile());
-  ui_test_utils::NavigateToURLWithDisposition(browser,
-                                              hanging_url,
-                                              CURRENT_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, hanging_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   portal_observer.WaitForResults(expected_portal_checks);
 
   if (expect_open_login_tab) {
@@ -1460,10 +1458,9 @@
 
   MultiNavigationObserver navigation_observer;
   CaptivePortalObserver portal_observer(browser->profile());
-  ui_test_utils::NavigateToURLWithDisposition(browser,
-                                              error_url,
-                                              CURRENT_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, error_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
 
   if (delay_portal_response_until_interstital) {
     EXPECT_EQ(CaptivePortalTabReloader::STATE_NONE,
@@ -1519,10 +1516,9 @@
   RespondToProbeRequests(false);
 
   SSLInterstitialTimerObserver interstitial_timer_observer(broken_tab_contents);
-  ui_test_utils::NavigateToURLWithDisposition(browser,
-                                              cert_error_url,
-                                              CURRENT_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, cert_error_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   interstitial_timer_observer.WaitForTimerStarted();
 
   // The tab should be in loading state, waiting for the interstitial timer to
@@ -1775,11 +1771,9 @@
   // so waiting for PortalObserver to see that request prevents it from
   // confusing the MultiNavigationObservers used later.
   tab_strip_model->ActivateTabAt(0, true);
-  browser->OpenURL(content::OpenURLParams(timeout_url,
-                                          content::Referrer(),
-                                          CURRENT_TAB,
-                                          ui::PAGE_TRANSITION_TYPED,
-                                          false));
+  browser->OpenURL(content::OpenURLParams(timeout_url, content::Referrer(),
+                                          WindowOpenDisposition::CURRENT_TAB,
+                                          ui::PAGE_TRANSITION_TYPED, false));
   portal_observer.WaitForResults(1);
   EXPECT_FALSE(CheckPending(browser));
   EXPECT_EQ(1, NumLoadingTabs());
@@ -2120,7 +2114,7 @@
   // Page appears loading. Reloading it cancels the page load. Since the load is
   // stopped, no cert error occurs and SSLErrorHandler isn't instantiated.
   MultiNavigationObserver test_navigation_observer;
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   test_navigation_observer.WaitForNavigations(2);
 
   // Make sure that the |ssl_error_handler| is deleted.
@@ -2179,10 +2173,8 @@
   // a load stop notification before starting a new navigation.
   MultiNavigationObserver test_navigation_observer;
   browser()->OpenURL(content::OpenURLParams(
-      URLRequestMockHTTPJob::GetMockUrl("title2.html"),
-      content::Referrer(),
-      CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+      URLRequestMockHTTPJob::GetMockUrl("title2.html"), content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   // Expect two navigations: First one for stopping the hanging page, second one
   // for completing the load of the above navigation.
   test_navigation_observer.WaitForNavigations(2);
@@ -2249,7 +2241,7 @@
   CaptivePortalObserver portal_observer(browser()->profile());
   MultiNavigationObserver test_navigation_observer;
   browser()->OpenURL(content::OpenURLParams(cert_error_url, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
   // Expect two navigations: First one for stopping the hanging page, second one
   // for completing the load of the above navigation.
@@ -2298,7 +2290,7 @@
   CaptivePortalObserver portal_observer(browser()->profile());
   MultiNavigationObserver test_navigation_observer;
   browser()->OpenURL(content::OpenURLParams(cert_error_url, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
   // Expect three navigations:
   // 1- For stopping the hanging page.
@@ -2413,9 +2405,8 @@
   MultiNavigationObserver navigation_observer;
   CaptivePortalObserver portal_observer(browser()->profile());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      URLRequestMockHTTPJob::GetMockUrl("title2.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), URLRequestMockHTTPJob::GetMockUrl("title2.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   TabStripModel* tab_strip_model = browser()->tab_strip_model();
@@ -2546,7 +2537,7 @@
   // Activate the error page tab again and go back.
   TabStripModel* tab_strip_model = browser()->tab_strip_model();
   tab_strip_model->ActivateTabAt(0, true);
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   navigation_observer.WaitForNavigations(1);
 
   EXPECT_EQ(1, navigation_observer.NumNavigationsForTab(
@@ -2581,7 +2572,7 @@
   // Go to the error page.
   MultiNavigationObserver navigation_observer;
   CaptivePortalObserver portal_observer(browser()->profile());
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
 
   // Wait for the check triggered by the broken tab and for the login tab to
   // stop loading.
@@ -2700,7 +2691,7 @@
   chrome::NavigateParams params(inactive_browser,
                                 GURL(kMockHttpsQuickTimeoutUrl),
                                 ui::PAGE_TRANSITION_TYPED);
-  params.disposition = NEW_BACKGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   params.window_action = chrome::NavigateParams::NO_ACTION;
   ui_test_utils::NavigateToURL(&params);
   navigation_observer.WaitForNavigations(2);
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 725fdaaf..c04d3b5 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -30,6 +30,7 @@
 #include "base/path_service.h"
 #include "base/profiler/scoped_tracker.h"
 #include "base/run_loop.h"
+#include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
@@ -198,24 +199,21 @@
 
 #if defined(OS_WIN)
 #include "base/trace_event/trace_event_etw_export_win.h"
+#include "base/win/registry.h"
 #include "base/win/win_util.h"
 #include "base/win/windows_version.h"
-#include "chrome/app/file_pre_reader_win.h"
 #include "chrome/browser/chrome_browser_main_win.h"
 #include "chrome/browser/component_updater/sw_reporter_installer_win.h"
 #include "chrome/browser/downgrade/user_data_downgrade.h"
 #include "chrome/browser/first_run/try_chrome_dialog_view.h"
 #include "chrome/browser/first_run/upgrade_util_win.h"
-#include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/ui/network_profile_bubble.h"
 #include "chrome/browser/win/browser_util.h"
 #include "chrome/browser/win/chrome_select_file_dialog_factory.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/helper.h"
 #include "chrome/installer/util/install_util.h"
-#include "chrome/installer/util/module_util_win.h"
 #include "chrome/installer/util/shell_util.h"
-#include "components/startup_metric_utils/common/pre_read_field_trial_utils_win.h"
 #include "ui/base/l10n/l10n_util_win.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 #endif  // defined(OS_WIN)
@@ -739,35 +737,6 @@
 
 namespace chrome_browser {
 
-#if defined(OS_WIN)
-// Helper function to setup the pre-read field trial. This function is defined
-// outside of the anonymous namespace to allow it to be friend with
-// ChromeMetricsServiceAccessor.
-void SetupPreReadFieldTrial() {
-  const base::string16 registry_path =
-      BrowserDistribution::GetDistribution()->GetRegistryPath();
-
-  // Register a synthetic field trial with the PreRead group used during the
-  // current startup. This must be done before the first metric log
-  // (metrics::MetricLog) is created. Otherwise, UMA metrics generated during
-  // startup won't be correctly annotated. The current function is always called
-  // before the first metric log is created, as part of
-  // ChromeBrowserMainParts::PreMainMessageLoopRun().
-  startup_metric_utils::RegisterPreReadSyntheticFieldTrial(
-      registry_path,
-      base::Bind(&ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial));
-
-  // Initialize the PreRead options for the current process.
-  startup_metric_utils::InitializePreReadOptions(registry_path);
-
-  // After startup is complete, update the PreRead group in the registry. The
-  // group written in the registry will be used for the next startup.
-  BrowserThread::PostAfterStartupTask(
-      FROM_HERE, content::BrowserThread::GetBlockingPool(),
-      base::Bind(&startup_metric_utils::UpdatePreReadOptions, registry_path));
-}
-#endif  // defined(OS_WIN)
-
 // This error message is not localized because we failed to load the
 // localization data files.
 #if defined(OS_WIN)
@@ -953,7 +922,14 @@
 #endif
 
 #if defined(OS_WIN)
-  chrome_browser::SetupPreReadFieldTrial();
+  // Cleanup the PreRead field trial registry key.
+  // TODO(fdoray): Remove this when M56 hits stable.
+  const base::string16 pre_read_field_trial_registry_path =
+      BrowserDistribution::GetDistribution()->GetRegistryPath() +
+      L"\\PreReadFieldTrial";
+  base::win::RegKey(HKEY_CURRENT_USER,
+                    pre_read_field_trial_registry_path.c_str(), KEY_SET_VALUE)
+      .DeleteKey(L"");
 #endif  // defined(OS_WIN)
 }
 
@@ -1551,18 +1527,6 @@
   const base::TimeTicks start_time_step1 = base::TimeTicks::Now();
 
 #if defined(OS_WIN)
-  // Pre-read chrome_child.dll.
-  const startup_metric_utils::PreReadOptions pre_read_options =
-      startup_metric_utils::GetPreReadOptions();
-  if (pre_read_options.pre_read &&
-      pre_read_options.pre_read_chrome_child_in_browser) {
-    BrowserThread::PostTask(
-        BrowserThread::FILE_USER_BLOCKING, FROM_HERE,
-        base::Bind(&PreReadFile,
-                   installer::GetModulePath(installer::kChromeChildDll),
-                   pre_read_options));
-  }
-
   // Windows parental controls calls can be slow, so we do an early init here
   // that calculates this value off of the UI thread.
   IncognitoModePrefs::InitializePlatformParentalControls();
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc
index 10050c6..7c63c33 100644
--- a/chrome/browser/chrome_content_browser_client_unittest.cc
+++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -89,11 +89,9 @@
                   GURL("https://www.chromium.org") };
 
   for (const GURL& url : urls) {
-    content::OpenURLParams params(url,
-                                  content::Referrer(),
-                                  NEW_FOREGROUND_TAB,
-                                  ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                  false);
+    content::OpenURLParams params(url, content::Referrer(),
+                                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                  ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
     // TODO(peter): We should have more in-depth browser tests for the window
     // opening functionality, which also covers Android. This test can currently
     // only be ran on platforms where OpenURL is implemented synchronously.
diff --git a/chrome/browser/chromeos/app_mode/startup_app_launcher.cc b/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
index 00be024..7b697a2 100644
--- a/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
+++ b/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
@@ -464,9 +464,9 @@
   }
 
   // Always open the app in a window.
-  OpenApplication(AppLaunchParams(profile_, extension,
-                                  extensions::LAUNCH_CONTAINER_WINDOW,
-                                  NEW_WINDOW, extensions::SOURCE_KIOSK));
+  OpenApplication(AppLaunchParams(
+      profile_, extension, extensions::LAUNCH_CONTAINER_WINDOW,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_KIOSK));
   KioskAppManager::Get()->InitSession(profile_, app_id_);
 
   user_manager::UserManager::Get()->SessionStarted();
diff --git a/chrome/browser/chromeos/arc/arc_auth_service.cc b/chrome/browser/chromeos/arc/arc_auth_service.cc
index 99750711..20c6bde 100644
--- a/chrome/browser/chromeos/arc/arc_auth_service.cc
+++ b/chrome/browser/chromeos/arc/arc_auth_service.cc
@@ -518,7 +518,8 @@
                          ArcSupportHost::kHostAppId, profile_));
 
   OpenApplication(CreateAppLaunchParamsUserContainer(
-      profile_, extension, NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
+      profile_, extension, WindowOpenDisposition::NEW_WINDOW,
+      extensions::SOURCE_CHROME_INTERNAL));
 }
 
 void ArcAuthService::OnContextReady() {
diff --git a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
index 6f15f127..6d15d02 100644
--- a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
+++ b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
@@ -143,7 +143,7 @@
         Profile::FromBrowserContext(web_contents()->GetBrowserContext());
     chrome::NavigateParams params(
         profile, learn_more_url, ui::PAGE_TRANSITION_LINK);
-    params.disposition = SINGLETON_TAB;
+    params.disposition = WindowOpenDisposition::SINGLETON_TAB;
     chrome::Navigate(&params);
   } else {
     chrome::ShowSingletonTab(browser, learn_more_url);
diff --git a/chrome/browser/chromeos/enrollment_dialog_view.cc b/chrome/browser/chromeos/enrollment_dialog_view.cc
index 4d219df..f63fbee 100644
--- a/chrome/browser/chromeos/enrollment_dialog_view.cc
+++ b/chrome/browser/chromeos/enrollment_dialog_view.cc
@@ -135,7 +135,7 @@
     return;
   chrome::NavigateParams params(profile_, GURL(target_uri_),
                                 ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/chromeos/eol_notification.cc b/chrome/browser/chromeos/eol_notification.cc
index 692494d..f246ac4e 100644
--- a/chrome/browser/chromeos/eol_notification.cc
+++ b/chrome/browser/chromeos/eol_notification.cc
@@ -80,7 +80,7 @@
 void EolNotificationDelegate::OpenMoreInfoPage() {
   chrome::NavigateParams params(profile_, GURL(chrome::kEolNotificationURL),
                                 ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/chromeos/extensions/echo_private_api.cc b/chrome/browser/chromeos/extensions/echo_private_api.cc
index 7af780e..7027a338 100644
--- a/chrome/browser/chromeos/extensions/echo_private_api.cc
+++ b/chrome/browser/chromeos/extensions/echo_private_api.cc
@@ -207,7 +207,7 @@
       GetProfile(), GURL(kMoreInfoLink), ui::PAGE_TRANSITION_LINK);
   // Open the link in a new window. The echo dialog is modal, so the current
   // window is useless until the dialog is closed.
-  params.disposition = NEW_WINDOW;
+  params.disposition = WindowOpenDisposition::NEW_WINDOW;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/chromeos/extensions/input_method_api.cc b/chrome/browser/chromeos/extensions/input_method_api.cc
index 7c947e106..54ba0915 100644
--- a/chrome/browser/chromeos/extensions/input_method_api.cc
+++ b/chrome/browser/chromeos/extensions/input_method_api.cc
@@ -289,8 +289,8 @@
     if (!options_page_url.is_empty()) {
       Browser* browser = chrome::FindBrowserWithWebContents(web_contents);
       content::OpenURLParams url_params(options_page_url, content::Referrer(),
-                                        SINGLETON_TAB, ui::PAGE_TRANSITION_LINK,
-                                        false);
+                                        WindowOpenDisposition::SINGLETON_TAB,
+                                        ui::PAGE_TRANSITION_LINK, false);
       browser->OpenURL(url_params);
     }
   }
diff --git a/chrome/browser/chromeos/extensions/wallpaper_manager_util.cc b/chrome/browser/chromeos/extensions/wallpaper_manager_util.cc
index 46ed021..7f8a499 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_manager_util.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_manager_util.cc
@@ -32,9 +32,9 @@
   if (!extension)
     return;
 
-  OpenApplication(
-      AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
-                      NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
+  OpenApplication(AppLaunchParams(
+      profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
 }
 
 }  // namespace wallpaper_manager_util
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc
index 35a5a31..33e7dad 100644
--- a/chrome/browser/chromeos/first_run/first_run.cc
+++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -45,9 +45,9 @@
   if (!extension)
     return;
 
-  OpenApplication(
-      AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
-                      NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
+  OpenApplication(AppLaunchParams(
+      profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
   profile->GetPrefs()->SetBoolean(prefs::kFirstRunTutorialShown, true);
 }
 
diff --git a/chrome/browser/chromeos/input_method/textinput_browsertest.cc b/chrome/browser/chromeos/input_method/textinput_browsertest.cc
index 6ba6f32..12df4c0 100644
--- a/chrome/browser/chromeos/input_method/textinput_browsertest.cc
+++ b/chrome/browser/chromeos/input_method/textinput_browsertest.cc
@@ -294,10 +294,8 @@
   GURL new_url = ui_test_utils::GetTestUrl(
       base::FilePath(FILE_PATH_LITERAL("textinput")),
       base::FilePath(FILE_PATH_LITERAL("focus_input_on_load.html")));
-  ui_test_utils::NavigateToURLWithDisposition(browser(),
-                                              new_url,
-                                              NEW_FOREGROUND_TAB,
-                                              0);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), new_url, WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
   content::WebContents* new_tab =
       browser()->tab_strip_model()->GetActiveWebContents();
   EXPECT_NE(base_tab, new_tab);
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc b/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc
index 57c9553..77a7d43 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_app_launcher.cc
@@ -94,9 +94,10 @@
                                 false,
                                 chromeos::network_handler::ErrorCallback());
 
-  OpenApplication(
-      AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
-                      NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL, true));
+  OpenApplication(AppLaunchParams(profile, extension,
+                                  extensions::LAUNCH_CONTAINER_WINDOW,
+                                  WindowOpenDisposition::NEW_WINDOW,
+                                  extensions::SOURCE_CHROME_INTERNAL, true));
   KioskAppManager::Get()->InitSession(profile, extension_id);
 
   user_manager::UserManager::Get()->SessionStarted();
diff --git a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
index 6bfc632..7525f895 100644
--- a/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
+++ b/chrome/browser/chromeos/login/quick_unlock/quick_unlock_notification_controller.cc
@@ -118,7 +118,7 @@
   chrome::NavigateParams params(profile_,
                                 GURL(kChromeAuthenticationSettingsURL),
                                 ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 
diff --git a/chrome/browser/chromeos/login/screens/error_screen.cc b/chrome/browser/chromeos/login/screens/error_screen.cc
index 145c9129..d73e70c6 100644
--- a/chrome/browser/chromeos/login/screens/error_screen.cc
+++ b/chrome/browser/chromeos/login/screens/error_screen.cc
@@ -278,9 +278,9 @@
 
   const extensions::Extension* extension =
       extension_service->GetExtensionById(extension_id, true);
-  OpenApplication(
-      AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
-                      NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
+  OpenApplication(AppLaunchParams(
+      profile, extension, extensions::LAUNCH_CONTAINER_WINDOW,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
   KioskAppManager::Get()->InitSession(profile, extension_id);
 
   user_manager::UserManager::Get()->SessionStarted();
diff --git a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
index a854914..f7d81e96 100644
--- a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
+++ b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
@@ -722,9 +722,8 @@
   Browser* browser =
       FindOrCreateVisibleBrowser(profile());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser,
-      fake_google_page_url_,
-      CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      browser, fake_google_page_url_, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
 
   // Wait until we get send merge session request.
   WaitForMergeSessionToStart();
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
index caa1f27c..20ea73b 100644
--- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
+++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -65,7 +65,7 @@
 namespace {
 
 // Install attributes for tests.
-EnterpriseInstallAttributes* g_testing_install_attributes = NULL;
+EnterpriseInstallAttributes* g_testing_install_attributes = nullptr;
 
 // Helper that returns a new SequencedTaskRunner backed by the blocking pool.
 // Each SequencedTaskRunner returned is independent from the others.
@@ -79,12 +79,12 @@
 }  // namespace
 
 BrowserPolicyConnectorChromeOS::BrowserPolicyConnectorChromeOS()
-    : device_cloud_policy_manager_(NULL),
-      global_user_cloud_policy_provider_(NULL),
+    : device_cloud_policy_manager_(nullptr),
+      global_user_cloud_policy_provider_(nullptr),
       weak_ptr_factory_(this) {
   if (g_testing_install_attributes) {
     install_attributes_.reset(g_testing_install_attributes);
-    g_testing_install_attributes = NULL;
+    g_testing_install_attributes = nullptr;
   }
 
   // SystemSaltGetter or DBusThreadManager may be uninitialized on unit tests.
@@ -271,7 +271,7 @@
 void BrowserPolicyConnectorChromeOS::RemoveInstallAttributesForTesting() {
   if (g_testing_install_attributes) {
     delete g_testing_install_attributes;
-    g_testing_install_attributes = NULL;
+    g_testing_install_attributes = nullptr;
   }
 }
 
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
index 1d154ff9..d51fe88 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.cc
@@ -73,7 +73,13 @@
       device_store_(device_store),
       manager_(manager),
       attestation_flow_(std::move(attestation_flow)),
-      signing_service_(async_method_caller) {}
+      signing_service_(base::MakeUnique<TpmEnrollmentKeySigningService>(
+          async_method_caller)) {}
+
+void DeviceCloudPolicyInitializer::SetSigningServiceForTesting(
+    std::unique_ptr<policy::SigningService> signing_service) {
+  signing_service_ = std::move(signing_service);
+}
 
 DeviceCloudPolicyInitializer::~DeviceCloudPolicyInitializer() {
   DCHECK(!is_initialized_);
@@ -257,7 +263,7 @@
       DeviceCloudPolicyManagerChromeOS::GetMachineID(),
       DeviceCloudPolicyManagerChromeOS::GetMachineModel(),
       kPolicyVerificationKeyHash, device_management_service,
-      g_browser_process->system_request_context(), &signing_service_);
+      g_browser_process->system_request_context(), signing_service_.get());
 }
 
 void DeviceCloudPolicyInitializer::TryToCreateClient() {
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
index 30dfe31..ff6725c1 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_initializer.h
@@ -11,6 +11,7 @@
 
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
+#include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h"
@@ -97,8 +98,12 @@
   void OnStoreLoaded(CloudPolicyStore* store) override;
   void OnStoreError(CloudPolicyStore* store) override;
 
+  // Allows testing code to set a signing service tailored to its needs.
+  void SetSigningServiceForTesting(
+      std::unique_ptr<policy::SigningService> signing_service);
+
  private:
-  // Signing class implemting the policy::SigningService interface to
+  // Signing class implementing the policy::SigningService interface to
   // sign data using the enrollment certificate's TPM-bound key.
   class TpmEnrollmentKeySigningService : public policy::SigningService {
    public:
@@ -148,7 +153,7 @@
   ServerBackedStateKeysBroker::Subscription state_keys_update_subscription_;
 
   // Our signing service.
-  TpmEnrollmentKeySigningService signing_service_;
+  std::unique_ptr<SigningService> signing_service_;
 
   DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyInitializer);
 };
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc
index 4f7089dd..1d6ba8b7 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos_unittest.cc
@@ -46,6 +46,7 @@
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/core/common/cloud/cloud_policy_core.h"
 #include "components/policy/core/common/cloud/mock_device_management_service.h"
+#include "components/policy/core/common/cloud/mock_signing_service.h"
 #include "components/policy/core/common/external_data_fetcher.h"
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/core/common/schema_registry.h"
@@ -124,7 +125,7 @@
     chromeos::system::StatisticsProvider::SetTestProvider(NULL);
   }
 
-  virtual bool ShouldRegisterWitCert() const { return false; }
+  virtual bool ShouldRegisterWithCert() const { return false; }
 
   void SetUp() override {
     DeviceSettingsTestBase::SetUp();
@@ -168,7 +169,7 @@
   CreateAttestationFlow() {
     StrictMock<chromeos::attestation::MockAttestationFlow>* mock =
         new StrictMock<chromeos::attestation::MockAttestationFlow>();
-    if (ShouldRegisterWitCert()) {
+    if (ShouldRegisterWithCert()) {
       EXPECT_CALL(*mock, GetCertificate(_, _, _, _, _))
           .WillOnce(WithArgs<4>(Invoke(CertCallbackSuccess)));
     }
@@ -211,6 +212,8 @@
         base::ThreadTaskRunnerHandle::Get(), install_attributes_.get(),
         &state_keys_broker_, store_, manager_.get(),
         cryptohome::AsyncMethodCaller::GetInstance(), std::move(unique_flow)));
+    initializer_->SetSigningServiceForTesting(
+        base::MakeUnique<FakeSigningService>());
     initializer_->Init();
   }
 
@@ -394,7 +397,8 @@
 }
 
 class DeviceCloudPolicyManagerChromeOSEnrollmentTest
-    : public DeviceCloudPolicyManagerChromeOSTest {
+    : public DeviceCloudPolicyManagerChromeOSTest,
+      public testing::WithParamInterface<bool> {
  public:
   void Done(EnrollmentStatus status) {
     status_ = status;
@@ -459,7 +463,7 @@
   }
 
   void RunTest() {
-    const bool with_cert = ShouldRegisterWitCert();
+    const bool with_cert = ShouldRegisterWithCert();
     // Trigger enrollment.
     MockDeviceManagementJob* register_job = NULL;
     EXPECT_CALL(
@@ -598,6 +602,28 @@
     ReloadDeviceSettings();
   }
 
+  bool ShouldRegisterWithCert() const override { return GetParam(); }
+
+  const std::unique_ptr<em::DeviceRegisterRequest> GetDeviceRegisterRequest() {
+    auto req = base::MakeUnique<em::DeviceRegisterRequest>();
+    if (ShouldRegisterWithCert()) {
+      em::CertificateBasedDeviceRegistrationData data;
+      const em::SignedData& signed_request =
+          register_request_.cert_based_register_request().signed_request();
+      EXPECT_TRUE(data.ParseFromString(signed_request.data().substr(
+          0,
+          signed_request.data().size() - signed_request.extra_data_bytes())));
+      EXPECT_EQ(em::CertificateBasedDeviceRegistrationData::
+                    ENTERPRISE_ENROLLMENT_CERTIFICATE,
+                data.certificate_type());
+      req->CopyFrom(data.device_register_request());
+    } else {
+      req->CopyFrom(
+          register_request_.register_request());
+    }
+    return req;
+  }
+
   DeviceManagementStatus register_status_;
   em::DeviceManagementResponse register_response_;
 
@@ -620,43 +646,34 @@
   DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyManagerChromeOSEnrollmentTest);
 };
 
-// TODO(drcrash): Handle cert-based tests (http://crbug.com/641447).
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Reenrollment) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Success) {
+  RunTest();
+  ExpectSuccessfulEnrollment();
+}
+
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, Reenrollment) {
   LockDevice();
   RunTest();
   ExpectSuccessfulEnrollment();
-  EXPECT_TRUE(register_request_.register_request().reregister());
+  EXPECT_TRUE(GetDeviceRegisterRequest()->reregister());
   EXPECT_EQ(PolicyBuilder::kFakeDeviceId, client_id_);
 }
 
-class ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest
-    : public DeviceCloudPolicyManagerChromeOSEnrollmentTest,
-      public testing::WithParamInterface<bool> {
- protected:
-  bool ShouldRegisterWitCert() const override { return GetParam(); }
-};
-
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, Success) {
-  RunTest();
-  ExpectSuccessfulEnrollment();
-}
-
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       RegistrationFailed) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, RegistrationFailed) {
   register_status_ = DM_STATUS_REQUEST_FAILED;
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_REGISTRATION_FAILED);
   EXPECT_EQ(DM_STATUS_REQUEST_FAILED, status_.client_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest,
        RobotAuthCodeFetchFailed) {
   robot_auth_fetch_status_ = DM_STATUS_REQUEST_FAILED;
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_AUTH_FETCH_FAILED);
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest,
        RobotRefreshTokenFetchResponseCodeFailed) {
   url_fetcher_response_code_ = 400;
   RunTest();
@@ -664,14 +681,14 @@
   EXPECT_EQ(400, status_.http_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest,
        RobotRefreshTokenFetchResponseStringFailed) {
   url_fetcher_response_string_ = "invalid response json";
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_FETCH_FAILED);
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest,
        RobotRefreshEncryptionFailed) {
   // The encryption lib is a noop for tests, but empty results from encryption
   // is an error, so we simulate an encryption error by returning an empty
@@ -683,16 +700,14 @@
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_STORE_FAILED);
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       PolicyFetchFailed) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, PolicyFetchFailed) {
   policy_fetch_status_ = DM_STATUS_REQUEST_FAILED;
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_POLICY_FETCH_FAILED);
   EXPECT_EQ(DM_STATUS_REQUEST_FAILED, status_.client_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       ValidationFailed) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, ValidationFailed) {
   device_policy_.policy().set_policy_data_signature("bad");
   policy_fetch_response_.clear_policy_response();
   policy_fetch_response_.mutable_policy_response()->add_response()->CopyFrom(
@@ -703,8 +718,7 @@
             status_.validation_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       StoreError) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, StoreError) {
   store_result_ = false;
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_STORE_ERROR);
@@ -712,7 +726,7 @@
             status_.store_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, LoadError) {
   loaded_blob_.clear();
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_STORE_ERROR);
@@ -720,8 +734,7 @@
             status_.store_status());
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       UnregisterSucceeds) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, UnregisterSucceeds) {
   // Enroll first.
   RunTest();
   ExpectSuccessfulEnrollment();
@@ -741,8 +754,7 @@
       base::Unretained(this)));
 }
 
-TEST_P(ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
-       UnregisterFails) {
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentTest, UnregisterFails) {
   // Enroll first.
   RunTest();
   ExpectSuccessfulEnrollment();
@@ -770,16 +782,20 @@
   }
 };
 
-TEST_F(DeviceCloudPolicyManagerChromeOSEnrollmentBlankSystemSaltTest,
+TEST_P(DeviceCloudPolicyManagerChromeOSEnrollmentBlankSystemSaltTest,
        RobotRefreshSaveFailed) {
   // Without the system salt, the robot token can't be stored.
   RunTest();
   ExpectFailedEnrollment(EnrollmentStatus::STATUS_ROBOT_REFRESH_STORE_FAILED);
 }
 
+INSTANTIATE_TEST_CASE_P(Cert,
+                        DeviceCloudPolicyManagerChromeOSEnrollmentTest,
+                        ::testing::Values(false, true));
+
 INSTANTIATE_TEST_CASE_P(
     Cert,
-    ParameterizedDeviceCloudPolicyManagerChromeOSEnrollmentTest,
+    DeviceCloudPolicyManagerChromeOSEnrollmentBlankSystemSaltTest,
     ::testing::Values(false, true));
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index a84a3747c..939631f 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -1565,9 +1565,9 @@
 
   // Start the platform app, causing it to open a window.
   run_loop_.reset(new base::RunLoop);
-  OpenApplication(AppLaunchParams(profile, app,
-                                  extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      profile, app, extensions::LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
   run_loop_->Run();
   EXPECT_EQ(1U, app_window_registry->app_windows().size());
 
diff --git a/chrome/browser/command_updater.cc b/chrome/browser/command_updater.cc
index e93a729..63e5030 100644
--- a/chrome/browser/command_updater.cc
+++ b/chrome/browser/command_updater.cc
@@ -41,7 +41,7 @@
 }
 
 bool CommandUpdater::ExecuteCommand(int id) {
-  return ExecuteCommandWithDisposition(id, CURRENT_TAB);
+  return ExecuteCommandWithDisposition(id, WindowOpenDisposition::CURRENT_TAB);
 }
 
 bool CommandUpdater::ExecuteCommandWithDisposition(
diff --git a/chrome/browser/component_updater/pepper_flash_component_installer.cc b/chrome/browser/component_updater/pepper_flash_component_installer.cc
index 2a84cefd..4f5225b 100644
--- a/chrome/browser/component_updater/pepper_flash_component_installer.cc
+++ b/chrome/browser/component_updater/pepper_flash_component_installer.cc
@@ -28,6 +28,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_content_client.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pepper_flash.h"
@@ -113,10 +114,19 @@
 
   std::vector<content::WebPluginInfo> plugins;
   PluginService::GetInstance()->GetInternalPlugins(&plugins);
+  base::FilePath placeholder_path =
+      base::FilePath::FromUTF8Unsafe(ChromeContentClient::kNotPresent);
   for (const auto& plugin : plugins) {
     if (!plugin.is_pepper_plugin() || plugin.name != web_plugin.name)
       continue;
 
+    if (plugin.path == placeholder_path) {
+      // This is the Flash placeholder; replace it regardless of version or
+      // other considerations.
+      PluginService::GetInstance()->UnregisterInternalPlugin(plugin.path);
+      break;
+    }
+
     Version registered_version(base::UTF16ToUTF8(plugin.version));
 
     // If lower version, never register.
diff --git a/chrome/browser/crash_recovery_browsertest.cc b/chrome/browser/crash_recovery_browsertest.cc
index e7ca591..d9702e6 100644
--- a/chrome/browser/crash_recovery_browsertest.cc
+++ b/chrome/browser/crash_recovery_browsertest.cc
@@ -39,9 +39,9 @@
   content::WindowedNotificationObserver observer(
       content::NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
       content::NotificationService::AllSources());
-  browser->OpenURL(OpenURLParams(
-      GURL(content::kChromeUICrashURL), Referrer(), CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+  browser->OpenURL(OpenURLParams(GURL(content::kChromeUICrashURL), Referrer(),
+                                 WindowOpenDisposition::CURRENT_TAB,
+                                 ui::PAGE_TRANSITION_TYPED, false));
   observer.Wait();
 }
 
@@ -99,7 +99,7 @@
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_before_crash));
   SimulateRendererCrash(browser());
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(GetActiveWebContents());
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_after_crash));
@@ -125,7 +125,7 @@
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_before_crash));
   SimulateRendererCrash(browser());
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(GetActiveWebContents());
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_after_crash));
@@ -151,7 +151,7 @@
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_before_crash));
   SimulateRendererCrash(browser());
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(GetActiveWebContents());
   ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(),
                                                 &title_after_crash));
@@ -167,11 +167,11 @@
 
   SimulateRendererCrash(browser());
 
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(GetActiveWebContents());
   ASSERT_EQ(url, GetActiveWebContents()->GetVisibleURL());
 
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(GetActiveWebContents());
   ASSERT_EQ(url, GetActiveWebContents()->GetVisibleURL());
 }
diff --git a/chrome/browser/data_saver/data_saver_browsertest.cc b/chrome/browser/data_saver/data_saver_browsertest.cc
index f5f9aef..3953ed30 100644
--- a/chrome/browser/data_saver/data_saver_browsertest.cc
+++ b/chrome/browser/data_saver/data_saver_browsertest.cc
@@ -100,7 +100,7 @@
   // Reload the webpage and expect the main and the subresources will get the
   // correct save-data header.
   expected_save_data_header_ = "on";
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
 
@@ -108,7 +108,7 @@
   // will get no save-data header.
   EnableDataSaver(false);
   expected_save_data_header_ = "";
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
 }
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 53aa07c..3a35c5b 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -125,7 +125,7 @@
 ChromeDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
   chrome::NavigateParams params(ProfileManager::GetLastUsedProfile(),
       url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
   if (!params.target_contents)
     return nullptr;
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 8769583..f002b75f 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -1197,7 +1197,7 @@
     ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL));
     crash_observer.Wait();
     content::TestNavigationObserver navigation_observer(GetInspectedTab(), 1);
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     navigation_observer.Wait();
   }
 };
@@ -1448,7 +1448,7 @@
   chrome::DuplicateTab(browser());
   chrome::SelectPreviousTab(browser());
   ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   RunTestFunction(window, "testWindowInitializedOnNavigateBack");
 
   DevToolsWindowTesting::CloseDevToolsWindowSync(window);
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 6626adb..aaf0cfb 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -214,9 +214,9 @@
 }
 
 void DefaultBindingsDelegate::OpenInNewTab(const std::string& url) {
-  content::OpenURLParams params(
-      GURL(url), content::Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false);
+  content::OpenURLParams params(GURL(url), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   Browser* browser = FindBrowser(web_contents_);
   browser->OpenURL(params);
 }
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index ba7670b5..0102c9d 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -1134,9 +1134,9 @@
 }
 
 void DevToolsWindow::OpenInNewTab(const std::string& url) {
-  content::OpenURLParams params(
-      GURL(url), content::Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false);
+  content::OpenURLParams params(GURL(url), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   WebContents* inspected_web_contents = GetInspectedWebContents();
   if (!inspected_web_contents || !inspected_web_contents->OpenURL(params)) {
     chrome::ScopedTabbedBrowserDisplayer displayer(profile_);
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 4080513..a1c9ef8 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -495,10 +495,8 @@
   }
   content::OpenURLParams params(
       net::FilePathToFileURL(download->GetTargetFilePath()),
-      content::Referrer(),
-      NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK,
-      false);
+      content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false);
 
   if (download->GetMimeType() == "application/x-x509-user-cert")
     chrome::ShowSettingsSubPage(browser, "certificates");
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index 6cc0c23..8c22b417 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -605,9 +605,7 @@
   void DownloadAndWait(Browser* browser,
                        const GURL& url) {
     DownloadAndWaitWithDisposition(
-        browser,
-        url,
-        CURRENT_TAB,
+        browser, url, WindowOpenDisposition::CURRENT_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   }
 
@@ -733,9 +731,7 @@
     // separate tab.
     GURL finish_url(net::URLRequestSlowDownloadJob::kFinishDownloadUrl);
     ui_test_utils::NavigateToURLWithDisposition(
-        browser,
-        finish_url,
-        NEW_FOREGROUND_TAB,
+        browser, finish_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     observer->WaitForFinished();
     EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
@@ -1450,9 +1446,8 @@
 
   // Download a file in the on-record browser and check that it was downloaded
   // correctly.
-  DownloadAndWaitWithDisposition(browser(),
-                                 url,
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(browser(), url,
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_NONE);
   GetDownloads(browser(), &download_items);
   ASSERT_EQ(1UL, download_items.size());
@@ -1480,9 +1475,8 @@
 
   // Download a file in the incognito browser and check that it was downloaded
   // correctly.
-  DownloadAndWaitWithDisposition(incognito,
-                                 url,
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(incognito, url,
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_NONE);
   GetDownloads(incognito, &download_items);
   ASSERT_EQ(1UL, download_items.size());
@@ -1501,9 +1495,7 @@
 
   // Open a web page and wait.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      url,
-      NEW_BACKGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // We should have two tabs now.
@@ -1517,11 +1509,8 @@
   // Download a file in a new background tab and wait.  The tab is automatically
   // closed when the download begins.
   GURL url(URLRequestMockHTTPJob::GetMockUrl(kDownloadTest1Path));
-  DownloadAndWaitWithDisposition(
-      browser(),
-      url,
-      NEW_BACKGROUND_TAB,
-      0);
+  DownloadAndWaitWithDisposition(browser(), url,
+                                 WindowOpenDisposition::NEW_BACKGROUND_TAB, 0);
 
   // When the download finishes, we should still have one tab.
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
@@ -1546,9 +1535,8 @@
 
   // Download a file in a new tab and wait (via Javascript).
   base::FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
-  DownloadAndWaitWithDisposition(browser(),
-                                 GURL("javascript:openNew()"),
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(browser(), GURL("javascript:openNew()"),
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // When the download finishes, we should have two tabs.
@@ -1573,18 +1561,16 @@
 
   // Open a new tab and wait.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("javascript:openNew()"),
-      CURRENT_TAB,
+      browser(), GURL("javascript:openNew()"),
+      WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
 
   // Download a file and wait.
   GURL url(URLRequestMockHTTPJob::GetMockUrl(kDownloadTest1Path));
-  DownloadAndWaitWithDisposition(browser(),
-                                 url,
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(browser(), url,
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_NONE);
 
   // When the download finishes, we should have two tabs.
@@ -1611,9 +1597,8 @@
   // Download a file and wait.
   // The file to download is "download-test1.lib".
   base::FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
-  DownloadAndWaitWithDisposition(browser(),
-                                 GURL("javascript:openNew()"),
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(browser(), GURL("javascript:openNew()"),
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // When the download finishes, we should still have one tab.
@@ -1642,9 +1627,8 @@
   // The file to download is "download-test1.lib".
   base::FilePath file(FILE_PATH_LITERAL("download-test1.lib"));
   DownloadAndWaitWithDisposition(
-      browser(),
-      GURL("javascript:document.getElementById('form').submit()"),
-      CURRENT_TAB,
+      browser(), GURL("javascript:document.getElementById('form').submit()"),
+      WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // When the download finishes, we should still have one tab.
@@ -2909,9 +2893,8 @@
   ASSERT_TRUE(download_items.empty());
 
   // Download a file.
-  DownloadAndWaitWithDisposition(browser(),
-                                 url,
-                                 CURRENT_TAB,
+  DownloadAndWaitWithDisposition(browser(), url,
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui_test_utils::BROWSER_TEST_NONE);
   GetDownloads(browser(), &download_items);
   ASSERT_EQ(1UL, download_items.size());
@@ -2983,7 +2966,8 @@
 
   // Start downloading a file, wait for it to be created.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), file_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      browser(), file_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   progress_waiter->WaitForFinished();
   EXPECT_EQ(1u, progress_waiter->NumDownloadsSeenInState(
       DownloadItem::IN_PROGRESS));
@@ -3233,10 +3217,9 @@
           content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT));
   std::unique_ptr<content::DownloadTestObserver> in_progress_observer(
       new DisableSafeBrowsingOnInProgressDownload(browser()));
-  ui_test_utils::NavigateToURLWithDisposition(browser(),
-                                              download_url,
-                                              NEW_BACKGROUND_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), download_url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   in_progress_observer->WaitForFinished();
 
   // SafeBrowsing should have been disabled by our observer.
@@ -3267,10 +3250,9 @@
       DangerousDownloadWaiter(
           browser(), 1,
           content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT));
-  ui_test_utils::NavigateToURLWithDisposition(browser(),
-                                              download_url,
-                                              NEW_BACKGROUND_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), download_url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   dangerous_observer->WaitForFinished();
 
   std::vector<DownloadItem*> downloads;
@@ -3311,9 +3293,7 @@
           DownloadManagerForBrowser(browser()), 1,
           content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(download_url),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL(download_url), WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
   observer->WaitForFinished();
 
@@ -3520,7 +3500,8 @@
 #endif
 
   // Download a file in a new window and wait.
-  DownloadAndWaitWithDisposition(browser(), url, NEW_WINDOW,
+  DownloadAndWaitWithDisposition(browser(), url,
+                                 WindowOpenDisposition::NEW_WINDOW,
                                  ui_test_utils::BROWSER_TEST_NONE);
 
   // When the download finishes, the download shelf SHOULD NOT be visible in
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc
index 728bae4..21a618c8 100644
--- a/chrome/browser/download/download_commands.cc
+++ b/chrome/browser/download/download_commands.cc
@@ -342,7 +342,8 @@
     case LEARN_MORE_INTERRUPTED:
       GetBrowser()->OpenURL(content::OpenURLParams(
           GetLearnMoreURLForInterruptedDownload(), content::Referrer(),
-          NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, false));
+          WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+          false));
       break;
     case PAUSE:
       download_item_->Pause();
diff --git a/chrome/browser/download/download_danger_prompt_browsertest.cc b/chrome/browser/download/download_danger_prompt_browsertest.cc
index 645322d..49eeccfd 100644
--- a/chrome/browser/download/download_danger_prompt_browsertest.cc
+++ b/chrome/browser/download/download_danger_prompt_browsertest.cc
@@ -65,9 +65,9 @@
   void OpenNewTab() {
     ui_test_utils::NavigateToURLWithDisposition(
         browser(), GURL("about:blank"),
-        NEW_FOREGROUND_TAB,
+        WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+            ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   }
 
   void SetUpExpectations(
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc
index 11e933d..095d346 100644
--- a/chrome/browser/download/notification/download_item_notification.cc
+++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -252,7 +252,7 @@
           UserMetricsAction("DownloadNotification.Click_Stopped"));
       GetBrowser()->OpenURL(content::OpenURLParams(
           GURL(chrome::kChromeUIDownloadsURL), content::Referrer(),
-          NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+          WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
           false /* is_renderer_initiated */));
       CloseNotificationByUser();
       break;
diff --git a/chrome/browser/download/save_page_browsertest.cc b/chrome/browser/download/save_page_browsertest.cc
index 322a15e..c0e69ef 100644
--- a/chrome/browser/download/save_page_browsertest.cc
+++ b/chrome/browser/download/save_page_browsertest.cc
@@ -579,7 +579,8 @@
 
   // Navigate, unblocking with new tab.
   GURL url = URLRequestMockHTTPJob::GetMockUrl("save_page/b.htm");
-  NavigateToURLWithDisposition(incognito, url, NEW_FOREGROUND_TAB,
+  NavigateToURLWithDisposition(incognito, url,
+                               WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // Save the page before completion.
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
index c4637b8..f4b3aa3 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc
@@ -185,7 +185,8 @@
       nullptr /* no WebContents */);
   navigation_observer.StartWatchingNewWebContents();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), https_server.GetURL("client-cert"), NEW_FOREGROUND_TAB,
+      browser(), https_server.GetURL("client-cert"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
 
   content::WebContents* const https_contents =
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 008ea54f..8e3b075 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -497,7 +497,8 @@
         CreateDownloadObserver(1));
     GURL finish_url(net::URLRequestSlowDownloadJob::kFinishDownloadUrl);
     ui_test_utils::NavigateToURLWithDisposition(
-        current_browser(), finish_url, NEW_FOREGROUND_TAB,
+        current_browser(), finish_url,
+        WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     observer->WaitForFinished();
     EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::COMPLETE));
@@ -4035,8 +4036,7 @@
     ui_test_utils::NavigateToURLWithDisposition(
         current_browser(),
         GURL(net::URLRequestSlowDownloadJob::kUnknownSizeUrl),
-        CURRENT_TAB,
-        ui_test_utils::BROWSER_TEST_NONE);
+        WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
     observer->WaitForFinished();
     EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
     DownloadManager::DownloadVector items;
@@ -4075,7 +4075,7 @@
   ui_test_utils::NavigateToURLWithDisposition(
       current_browser(),
       GURL(net::URLRequestSlowDownloadJob::kErrorDownloadUrl),
-      NEW_BACKGROUND_TAB,
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Errors caught before filename determination are delayed until after
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index 4bd372c..a8f61c9 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -765,7 +765,7 @@
   // Open a new web popup window.
   chrome::NavigateParams params(browser(), GURL("http://www.google.com/"),
                                 ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   ui_test_utils::NavigateToURL(&params);
   Browser* popup_browser = params.browser;
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 3e922668..35b9de58 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
@@ -97,10 +97,10 @@
         content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
         content::NotificationService::AllSources());
     // Open a new window.
-    new_browser = chrome::FindBrowserWithWebContents(
-        browser()->OpenURL(content::OpenURLParams(
-            GURL("about:"), content::Referrer(), NEW_WINDOW,
-            ui::PAGE_TRANSITION_TYPED, false)));
+    new_browser = chrome::FindBrowserWithWebContents(browser()->OpenURL(
+        content::OpenURLParams(GURL("about:"), content::Referrer(),
+                               WindowOpenDisposition::NEW_WINDOW,
+                               ui::PAGE_TRANSITION_TYPED, false)));
     // Hide all the buttons to test that it opens even when the browser action
     // is in the overflow bucket.
     ToolbarActionsModel::Get(profile())->SetVisibleIconCount(0);
@@ -378,7 +378,7 @@
 
   // Create a new browser window to prevent the message loop from terminating.
   browser()->OpenURL(content::OpenURLParams(GURL("about:"), content::Referrer(),
-                                            NEW_WINDOW,
+                                            WindowOpenDisposition::NEW_WINDOW,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   // Forcibly closing the browser HWND should not cause a crash.
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index 27f2b5f..93cc4a0da 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -179,9 +179,10 @@
   // returned.
   extensions::LaunchContainer launch_container =
       GetLaunchContainer(extensions::ExtensionPrefs::Get(context), extension);
-  OpenApplication(AppLaunchParams(
-      Profile::FromBrowserContext(context), extension, launch_container,
-      NEW_FOREGROUND_TAB, extensions::SOURCE_MANAGEMENT_API));
+  OpenApplication(AppLaunchParams(Profile::FromBrowserContext(context),
+                                  extension, launch_container,
+                                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                  extensions::SOURCE_MANAGEMENT_API));
   extensions::RecordAppLaunchType(extension_misc::APP_LAUNCH_EXTENSION_API,
                                   extension->GetType());
 }
diff --git a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc
index e51dd43..285c8be 100644
--- a/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc
+++ b/chrome/browser/extensions/api/media_galleries/media_galleries_apitest.cc
@@ -304,9 +304,9 @@
   ASSERT_TRUE(extension);
 
   extensions::ResultCatcher catcher;
-  AppLaunchParams params(browser()->profile(), extension,
-                         extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                         extensions::SOURCE_TEST);
+  AppLaunchParams params(
+      browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST);
   params.command_line = *base::CommandLine::ForCurrentProcess();
   OpenApplication(params);
 
diff --git a/chrome/browser/extensions/api/omnibox/omnibox_api.cc b/chrome/browser/extensions/api/omnibox/omnibox_api.cc
index 5a780124..cfcb119 100644
--- a/chrome/browser/extensions/api/omnibox/omnibox_api.cc
+++ b/chrome/browser/extensions/api/omnibox/omnibox_api.cc
@@ -152,9 +152,9 @@
 
   std::unique_ptr<base::ListValue> args(new base::ListValue());
   args->Set(0, new base::StringValue(input));
-  if (disposition == NEW_FOREGROUND_TAB)
+  if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB)
     args->Set(1, new base::StringValue(kForegroundTabDisposition));
-  else if (disposition == NEW_BACKGROUND_TAB)
+  else if (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)
     args->Set(1, new base::StringValue(kBackgroundTabDisposition));
   else
     args->Set(1, new base::StringValue(kCurrentTabDisposition));
diff --git a/chrome/browser/extensions/api/omnibox/omnibox_api_browsertest.cc b/chrome/browser/extensions/api/omnibox/omnibox_api_browsertest.cc
index f33ce975..c32c60e 100644
--- a/chrome/browser/extensions/api/omnibox/omnibox_api_browsertest.cc
+++ b/chrome/browser/extensions/api/omnibox/omnibox_api_browsertest.cc
@@ -177,7 +177,7 @@
       ASCIIToUTF16("keyword command"), base::string16::npos, std::string(),
       GURL(), OmniboxEventProto::NTP, true, false, true, true, false,
       ChromeAutocompleteSchemeClassifier(profile)));
-  omnibox_view->model()->AcceptInput(CURRENT_TAB, false);
+  omnibox_view->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false);
   WaitForAutocompleteDone(autocomplete_controller);
   EXPECT_TRUE(autocomplete_controller->done());
   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
@@ -192,7 +192,8 @@
       ASCIIToUTF16("keyword newtab"), base::string16::npos, std::string(),
       GURL(), OmniboxEventProto::NTP, true, false, true, true, false,
       ChromeAutocompleteSchemeClassifier(profile)));
-  omnibox_view->model()->AcceptInput(NEW_FOREGROUND_TAB, false);
+  omnibox_view->model()->AcceptInput(WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                     false);
   WaitForAutocompleteDone(autocomplete_controller);
   EXPECT_TRUE(autocomplete_controller->done());
   EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
diff --git a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
index 3d73adf..c741ee0 100644
--- a/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
+++ b/chrome/browser/extensions/api/runtime/chrome_runtime_api_delegate.cc
@@ -262,7 +262,7 @@
 
   chrome::NavigateParams params(
       browser, uninstall_url, ui::PAGE_TRANSITION_CLIENT_REDIRECT);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.user_gesture = false;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/extensions/api/sessions/sessions_api.cc b/chrome/browser/extensions/api/sessions/sessions_api.cc
index e308528..3534890 100644
--- a/chrome/browser/extensions/api/sessions/sessions_api.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_api.cc
@@ -472,7 +472,8 @@
       BrowserLiveTabContext::FindContextForWebContents(
           browser->tab_strip_model()->GetActiveWebContents());
   std::vector<sessions::LiveTab*> restored_tabs =
-      tab_restore_service->RestoreEntryById(context, session_id.id(), UNKNOWN);
+      tab_restore_service->RestoreEntryById(context, session_id.id(),
+                                            WindowOpenDisposition::UNKNOWN);
   // If the ID is invalid, restored_tabs will be empty.
   if (restored_tabs.empty()) {
     SetInvalidIdError(session_id.ToString());
@@ -514,8 +515,8 @@
     content::WebContents* contents = tab_strip->GetActiveWebContents();
 
     content::WebContents* tab_contents =
-        SessionRestore::RestoreForeignSessionTab(contents, *tab,
-                                                 NEW_FOREGROUND_TAB);
+        SessionRestore::RestoreForeignSessionTab(
+            contents, *tab, WindowOpenDisposition::NEW_FOREGROUND_TAB);
     SetResultRestoredTab(tab_contents);
     return true;
   }
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index 580b1cd8..ffd167bf 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -240,7 +240,7 @@
   EXPECT_TRUE(listener.WaitUntilSatisfied());
 
   content::OpenURLParams params(GURL("about:blank"), content::Referrer(),
-                                NEW_FOREGROUND_TAB,
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents = browser()->OpenURL(params);
 
@@ -276,7 +276,7 @@
   // Open a new tab and make sure capture is denied.
   EXPECT_TRUE(before_open_tab.WaitUntilSatisfied());
   content::OpenURLParams params(GURL("http://google.com"), content::Referrer(),
-                                NEW_FOREGROUND_TAB,
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents = browser()->OpenURL(params);
   before_open_tab.Reply("");
@@ -356,7 +356,7 @@
 
   // Open a tab on a chrome:// page and make sure we can capture.
   content::OpenURLParams params(GURL("chrome://version"), content::Referrer(),
-                                NEW_FOREGROUND_TAB,
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents = browser()->OpenURL(params);
   const Extension* extension = ExtensionRegistry::Get(
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index f4d7aa5..5f2410c 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -638,7 +638,7 @@
   for (const GURL& url : urls) {
     chrome::NavigateParams navigate_params(new_window, url,
                                            ui::PAGE_TRANSITION_LINK);
-    navigate_params.disposition = NEW_FOREGROUND_TAB;
+    navigate_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     navigate_params.source_site_instance =
         render_frame_host()->GetSiteInstance();
     chrome::Navigate(&navigate_params);
@@ -1597,7 +1597,8 @@
     // This does as same as Browser::ReloadInternal.
     NavigationEntry* entry = web_contents->GetController().GetVisibleEntry();
     GURL reload_url = entry ? entry->GetURL() : GURL(url::kAboutBlankURL);
-    OpenURLParams params(reload_url, Referrer(), CURRENT_TAB,
+    OpenURLParams params(reload_url, Referrer(),
+                         WindowOpenDisposition::CURRENT_TAB,
                          ui::PAGE_TRANSITION_RELOAD, false);
     GetCurrentBrowser()->OpenURL(params);
   } else if (bypass_cache) {
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc
index eb4cc8b..75d3585 100644
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -1134,11 +1134,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTab) {
-  content::OpenURLParams params(GURL(url::kAboutBlankURL),
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  content::OpenURLParams params(GURL(url::kAboutBlankURL), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents = browser()->OpenURL(params);
   int tab_id = ExtensionTabUtil::GetTabId(web_contents);
   int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents);
@@ -1178,11 +1176,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DuplicateTabNoPermission) {
-  content::OpenURLParams params(GURL(url::kAboutBlankURL),
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  content::OpenURLParams params(GURL(url::kAboutBlankURL), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents = browser()->OpenURL(params);
   int tab_id = ExtensionTabUtil::GetTabId(web_contents);
   int window_id = ExtensionTabUtil::GetWindowIdOfTab(web_contents);
@@ -1322,8 +1318,8 @@
 
   // Create two aditional tabs.
   content::OpenURLParams params(GURL(url::kAboutBlankURL), content::Referrer(),
-                                NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_LINK,
-                                false);
+                                WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents_a = browser()->OpenURL(params);
   content::WebContents* web_contents_b = browser()->OpenURL(params);
 
@@ -1440,9 +1436,10 @@
 
 // Tests chrome.tabs.discard(tabId).
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardWithId) {
-  // Create an aditional tab.
+  // Create an additional tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(url::kAboutBlankURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetWebContentsAt(1);
@@ -1480,9 +1477,10 @@
 
 // Tests chrome.tabs.discard(invalidId).
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardWithInvalidId) {
-  // Create an aditional tab.
+  // Create an additional tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(url::kAboutBlankURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Set up the function with an extension.
@@ -1511,9 +1509,10 @@
 
 // Tests chrome.tabs.discard().
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardWithoutId) {
-  // Create an aditional tab.
+  // Create an additional tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(url::kAboutBlankURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetWebContentsAt(1);
@@ -1545,9 +1544,10 @@
 
 // Tests chrome.tabs.discard() without disabling protection time.
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DiscardNoTabProtection) {
-  // Create an aditional tab.
+  // Create an additional tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(url::kAboutBlankURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Make sure protection time isn't disabled.
@@ -1577,8 +1577,8 @@
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, AutoDiscardableProperty) {
   // Create two aditional tabs.
   content::OpenURLParams params(GURL(url::kAboutBlankURL), content::Referrer(),
-                                NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_LINK,
-                                false);
+                                WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   content::WebContents* web_contents_a = browser()->OpenURL(params);
   content::WebContents* web_contents_b = browser()->OpenURL(params);
 
@@ -1868,9 +1868,7 @@
 content::WebContents* ExtensionTabsZoomTest::OpenUrlAndWaitForLoad(
     const GURL& url) {
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      url,
-      NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   return  browser()->tab_strip_model()->GetActiveWebContents();
 }
@@ -1882,11 +1880,9 @@
 }
 
 content::OpenURLParams GetOpenParams(const char* url) {
-  return content::OpenURLParams(GURL(url),
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  return content::OpenURLParams(GURL(url), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
 }
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
index 9e72eca..c15439b 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc
@@ -374,12 +374,12 @@
 
   // We only send the onCreatedNavigationTarget if we end up creating a new
   // window.
-  if (disposition != SINGLETON_TAB &&
-      disposition != NEW_FOREGROUND_TAB &&
-      disposition != NEW_BACKGROUND_TAB &&
-      disposition != NEW_POPUP &&
-      disposition != NEW_WINDOW &&
-      disposition != OFF_THE_RECORD)
+  if (disposition != WindowOpenDisposition::SINGLETON_TAB &&
+      disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB &&
+      disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB &&
+      disposition != WindowOpenDisposition::NEW_POPUP &&
+      disposition != WindowOpenDisposition::NEW_WINDOW &&
+      disposition != WindowOpenDisposition::OFF_THE_RECORD)
     return;
 
   helpers::DispatchOnCreatedNavigationTarget(web_contents(),
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 563881a2..a0ea8893 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -542,7 +542,7 @@
   const std::string kHost = "example.com";
   GURL url = embedded_test_server()->GetURL(kHost, "/empty.html");
   chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   ui_test_utils::NavigateToURL(&params);
 
   content::WebContents* web_contents =
diff --git a/chrome/browser/extensions/app_background_page_apitest.cc b/chrome/browser/extensions/app_background_page_apitest.cc
index aadf4523..3c134afe 100644
--- a/chrome/browser/extensions/app_background_page_apitest.cc
+++ b/chrome/browser/extensions/app_background_page_apitest.cc
@@ -304,8 +304,7 @@
   UnloadExtension(extension->id());
 }
 
-// TODO(crbug.com/642482) Disabled test for flakyness.
-IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, DISABLED_NoJsBackgroundPage) {
+IN_PROC_BROWSER_TEST_F(AppBackgroundPageApiTest, NoJsBackgroundPage) {
   // Keep the task manager up through this test to verify that a crash doesn't
   // happen when window.open creates a background page that switches
   // RenderViewHosts. See http://crbug.com/165138.
diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc
index 04fc9ba..e3693b3e 100644
--- a/chrome/browser/extensions/app_process_apitest.cc
+++ b/chrome/browser/extensions/app_process_apitest.cc
@@ -87,7 +87,8 @@
     // processes, but they have no elevated privileges and thus should not
     // have WebUI bindings.
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
+        browser(), base_url.Resolve("path1/empty.html"),
+        WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     LOG(INFO) << "Nav 1.";
     EXPECT_TRUE(process_map->Contains(
@@ -162,7 +163,8 @@
   // it.  Either way, app tabs should be considered extension processes, but
   // they have no elevated privileges and thus should not have WebUI bindings.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
+      browser(), base_url.Resolve("path1/empty.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_TRUE(process_map->Contains(
       browser()->tab_strip_model()->GetWebContentsAt(1)->
@@ -171,7 +173,8 @@
   LOG(INFO) << "Nav 1.";
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), base_url.Resolve("path2/empty.html"), NEW_FOREGROUND_TAB,
+      browser(), base_url.Resolve("path2/empty.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_TRUE(process_map->Contains(
       browser()->tab_strip_model()->GetWebContentsAt(2)->
@@ -316,7 +319,8 @@
   // it.  Either way, bookmark app tabs should be considered normal processes
   // with no elevated privileges and no WebUI bindings.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB,
+      browser(), base_url.Resolve("path1/empty.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_FALSE(process_map->Contains(
       browser()->tab_strip_model()->GetWebContentsAt(1)->
@@ -499,7 +503,7 @@
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
   LOG(INFO) << "Reloading.";
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   reload_observer.Wait();
   LOG(INFO) << "Reloading - done.";
   EXPECT_TRUE(process_map->Contains(
@@ -515,7 +519,7 @@
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
   LOG(INFO) << "Reloading.";
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   reload_observer2.Wait();
   LOG(INFO) << "Reloading - done.";
   EXPECT_FALSE(process_map->Contains(
@@ -807,7 +811,7 @@
       content::Source<NavigationController>(
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
       contents,
diff --git a/chrome/browser/extensions/chrome_extension_function.cc b/chrome/browser/extensions/chrome_extension_function.cc
index 07c3006d..395a2b3d 100644
--- a/chrome/browser/extensions/chrome_extension_function.cc
+++ b/chrome/browser/extensions/chrome_extension_function.cc
@@ -20,8 +20,8 @@
 using content::RenderViewHost;
 using content::WebContents;
 
-ChromeUIThreadExtensionFunction::ChromeUIThreadExtensionFunction() {
-}
+ChromeUIThreadExtensionFunction::ChromeUIThreadExtensionFunction()
+    : chrome_details_(this) {}
 
 Profile* ChromeUIThreadExtensionFunction::GetProfile() const {
   return Profile::FromBrowserContext(context_);
@@ -29,66 +29,17 @@
 
 // TODO(stevenjb): Replace this with GetExtensionWindowController().
 Browser* ChromeUIThreadExtensionFunction::GetCurrentBrowser() {
-  // If the delegate has an associated browser, return it.
-  if (dispatcher()) {
-    extensions::WindowController* window_controller =
-        dispatcher()->GetExtensionWindowController();
-    if (window_controller) {
-      Browser* browser = window_controller->GetBrowser();
-      if (browser)
-        return browser;
-    }
-  }
-
-  // Otherwise, try to default to a reasonable browser. If |include_incognito_|
-  // is true, we will also search browsers in the incognito version of this
-  // profile. Note that the profile may already be incognito, in which case
-  // we will search the incognito version only, regardless of the value of
-  // |include_incognito|. Look only for browsers on the active desktop as it is
-  // preferable to pretend no browser is open then to return a browser on
-  // another desktop.
-  content::WebContents* web_contents = GetSenderWebContents();
-  Profile* profile = Profile::FromBrowserContext(
-      web_contents ? web_contents->GetBrowserContext() : browser_context());
-  Browser* browser = chrome::FindAnyBrowser(profile, include_incognito_);
-  if (browser)
-    return browser;
-
-  // NOTE(rafaelw): This can return NULL in some circumstances. In particular,
-  // a background_page onload chrome.tabs api call can make it into here
-  // before the browser is sufficiently initialized to return here, or
-  // all of this profile's browser windows may have been closed.
-  // A similar situation may arise during shutdown.
-  // TODO(rafaelw): Delay creation of background_page until the browser
-  // is available. http://code.google.com/p/chromium/issues/detail?id=13284
-  return NULL;
+  return chrome_details_.GetCurrentBrowser();
 }
 
 extensions::WindowController*
 ChromeUIThreadExtensionFunction::GetExtensionWindowController() {
-  // If the delegate has an associated window controller, return it.
-  if (dispatcher()) {
-    extensions::WindowController* window_controller =
-        dispatcher()->GetExtensionWindowController();
-    if (window_controller)
-      return window_controller;
-  }
-
-  return extensions::WindowControllerList::GetInstance()
-      ->CurrentWindowForFunction(this);
+  return chrome_details_.GetExtensionWindowController();
 }
 
 content::WebContents*
 ChromeUIThreadExtensionFunction::GetAssociatedWebContents() {
-  content::WebContents* web_contents =
-      UIThreadExtensionFunction::GetAssociatedWebContents();
-  if (web_contents)
-    return web_contents;
-
-  Browser* browser = GetCurrentBrowser();
-  if (!browser)
-    return NULL;
-  return browser->tab_strip_model()->GetActiveWebContents();
+  return chrome_details_.GetAssociatedWebContents();
 }
 
 ChromeUIThreadExtensionFunction::~ChromeUIThreadExtensionFunction() {
diff --git a/chrome/browser/extensions/chrome_extension_function.h b/chrome/browser/extensions/chrome_extension_function.h
index fefcda9..dede716c 100644
--- a/chrome/browser/extensions/chrome_extension_function.h
+++ b/chrome/browser/extensions/chrome_extension_function.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_EXTENSIONS_CHROME_EXTENSION_FUNCTION_H_
 #define CHROME_BROWSER_EXTENSIONS_CHROME_EXTENSION_FUNCTION_H_
 
+#include "chrome/browser/extensions/chrome_extension_function_details.h"
 #include "extensions/browser/extension_function.h"
 
 class Browser;
@@ -59,6 +60,9 @@
 
  protected:
   ~ChromeUIThreadExtensionFunction() override;
+
+ private:
+  ChromeExtensionFunctionDetails chrome_details_;
 };
 
 // A chrome specific analog to AsyncExtensionFunction. This has access to a
diff --git a/chrome/browser/extensions/chrome_extension_function_details.cc b/chrome/browser/extensions/chrome_extension_function_details.cc
index 7ebed14..daccbc4c 100644
--- a/chrome/browser/extensions/chrome_extension_function_details.cc
+++ b/chrome/browser/extensions/chrome_extension_function_details.cc
@@ -56,14 +56,14 @@
   // |include_incognito|. Look only for browsers on the active desktop as it is
   // preferable to pretend no browser is open then to return a browser on
   // another desktop.
-  if (function_->render_frame_host()) {
-    Profile* profile = Profile::FromBrowserContext(
-        function_->render_frame_host()->GetProcess()->GetBrowserContext());
-    Browser* browser =
-        chrome::FindAnyBrowser(profile, function_->include_incognito());
-    if (browser)
-      return browser;
-  }
+  content::WebContents* web_contents = function_->GetSenderWebContents();
+  Profile* profile = Profile::FromBrowserContext(
+      web_contents ? web_contents->GetBrowserContext()
+                   : function_->browser_context());
+  Browser* browser =
+      chrome::FindAnyBrowser(profile, function_->include_incognito());
+  if (browser)
+    return browser;
 
   // NOTE(rafaelw): This can return NULL in some circumstances. In particular,
   // a background_page onload chrome.tabs api call can make it into here
@@ -91,9 +91,12 @@
 
 content::WebContents*
 ChromeExtensionFunctionDetails::GetAssociatedWebContents() {
-  content::WebContents* web_contents = function_->GetAssociatedWebContents();
-  if (web_contents)
-    return web_contents;
+  if (function_->dispatcher()) {
+    content::WebContents* web_contents =
+        function_->dispatcher()->GetAssociatedWebContents();
+    if (web_contents)
+      return web_contents;
+  }
 
   Browser* browser = GetCurrentBrowser();
   if (!browser)
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc
index c8d4428..126beb51e 100644
--- a/chrome/browser/extensions/content_script_apitest.cc
+++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -421,7 +421,8 @@
   // listening for.
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), extension->GetResourceURL("fire_event.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   EXPECT_TRUE(catcher.GetNextResult());
 }
 
@@ -474,10 +475,8 @@
 
   // Navigate! Both extensions will try to inject.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      embedded_test_server()->GetURL("/empty.html"),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), embedded_test_server()->GetURL("/empty.html"),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
 
   run_loop.Run();
   // Right now, the alert dialog is showing and blocking injection of anything
@@ -499,9 +498,8 @@
   // We're going to close a tab in this test, so make a new one (to ensure
   // we don't close the browser).
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      embedded_test_server()->GetURL("/empty.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), embedded_test_server()->GetURL("/empty.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Set up the same as the previous test case.
@@ -529,10 +527,8 @@
 
   // Navitate!
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      embedded_test_server()->GetURL("/empty.html"),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), embedded_test_server()->GetURL("/empty.html"),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
 
   // Now, instead of closing the dialog, just close the tab. Later scripts
   // should never get a chance to run (and we shouldn't crash).
@@ -566,10 +562,8 @@
 
   // Navigate!
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      embedded_test_server()->GetURL("/empty.html"),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), embedded_test_server()->GetURL("/empty.html"),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
 
   run_loop.Run();
 
@@ -612,7 +606,8 @@
 
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("/empty.html"),
-      CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(listener.was_satisfied());
 }
diff --git a/chrome/browser/extensions/crx_installer_browsertest.cc b/chrome/browser/extensions/crx_installer_browsertest.cc
index 165daa5..aa508eb 100644
--- a/chrome/browser/extensions/crx_installer_browsertest.cc
+++ b/chrome/browser/extensions/crx_installer_browsertest.cc
@@ -373,7 +373,8 @@
           download_manager, kNumDownloadsExpected,
           content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT));
   LOG(ERROR) << "PackAndInstallExtension: Navigating to URL";
-  ui_test_utils::NavigateToURLWithDisposition(browser(), url, CURRENT_TAB,
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
 
   EXPECT_TRUE(WaitForCrxInstallerDone());
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc
index 2f14cdda..177ac9bc 100644
--- a/chrome/browser/extensions/extension_apitest.cc
+++ b/chrome/browser/extensions/extension_apitest.cc
@@ -340,9 +340,9 @@
     else
       ui_test_utils::NavigateToURL(browser(), url);
   } else if (launch_platform_app) {
-    AppLaunchParams params(browser()->profile(), extension,
-                           extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                           extensions::SOURCE_TEST);
+    AppLaunchParams params(
+        browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST);
     params.command_line = *base::CommandLine::ForCurrentProcess();
     OpenApplication(params);
   }
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc
index b1eff5f5..4590b770 100644
--- a/chrome/browser/extensions/extension_browsertest.cc
+++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -318,7 +318,8 @@
       content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
       content::NotificationService::AllSources());
   AppLaunchParams params(profile(), app, extensions::LAUNCH_CONTAINER_NONE,
-                         NEW_WINDOW, extensions::SOURCE_TEST);
+                         WindowOpenDisposition::NEW_WINDOW,
+                         extensions::SOURCE_TEST);
   params.command_line = *base::CommandLine::ForCurrentProcess();
   OpenApplication(params);
   app_loaded_observer.Wait();
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc
index 2755e9d..773a28b 100644
--- a/chrome/browser/extensions/extension_context_menu_model.cc
+++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -244,7 +244,8 @@
   switch (command_id) {
     case NAME: {
       content::OpenURLParams params(ManifestURL::GetHomepageURL(extension),
-                                    content::Referrer(), NEW_FOREGROUND_TAB,
+                                    content::Referrer(),
+                                    WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                     ui::PAGE_TRANSITION_LINK, false);
       browser_->OpenURL(params);
       break;
diff --git a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc
index 12145f3..2ea243a7 100644
--- a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc
+++ b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc
@@ -554,7 +554,7 @@
         content::Source<NavigationController>(
             &browser()->tab_strip_model()->GetActiveWebContents()->
                 GetController()));
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
   // Extension should now be loaded.
diff --git a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
index a50ad814..7b4fff1 100644
--- a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
+++ b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
@@ -194,7 +194,7 @@
   GURL url = extension->GetResourceURL("");
   int starting_tab_count = browser()->tab_strip_model()->count();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   int tab_count = browser()->tab_strip_model()->count();
   EXPECT_EQ(starting_tab_count + 1, tab_count);
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc
index 616c6f856..9b933a5 100644
--- a/chrome/browser/extensions/extension_message_bubble_controller.cc
+++ b/chrome/browser/extensions/extension_message_bubble_controller.cc
@@ -228,12 +228,10 @@
   // perform our cleanup here before opening the new tab.
   OnClose();
   if (!g_should_ignore_learn_more_for_testing) {
-    browser_->OpenURL(
-        content::OpenURLParams(delegate_->GetLearnMoreUrl(),
-                               content::Referrer(),
-                               NEW_FOREGROUND_TAB,
-                               ui::PAGE_TRANSITION_LINK,
-                               false));
+    browser_->OpenURL(content::OpenURLParams(
+        delegate_->GetLearnMoreUrl(), content::Referrer(),
+        WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+        false));
   }
   // Warning: |this| may be deleted here!
 }
diff --git a/chrome/browser/extensions/extension_storage_monitor_browsertest.cc b/chrome/browser/extensions/extension_storage_monitor_browsertest.cc
index bdb10b1..b9671a8 100644
--- a/chrome/browser/extensions/extension_storage_monitor_browsertest.cc
+++ b/chrome/browser/extensions/extension_storage_monitor_browsertest.cc
@@ -160,7 +160,8 @@
         GetNotificationId(extension->id()));
 
     OpenApplication(AppLaunchParams(profile(), extension, LAUNCH_CONTAINER_NONE,
-                                    NEW_WINDOW, extensions::SOURCE_TEST));
+                                    WindowOpenDisposition::NEW_WINDOW,
+                                    extensions::SOURCE_TEST));
     ASSERT_TRUE(launched_listener.WaitUntilSatisfied());
 
     // Instruct the app to write |num_bytes| of data.
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index cfd503c..07372150 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -242,8 +242,9 @@
     add_types |= TabStripModel::ADD_PINNED;
   chrome::NavigateParams navigate_params(
       browser, url, ui::PAGE_TRANSITION_LINK);
-  navigate_params.disposition =
-      active ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
+  navigate_params.disposition = active
+                                    ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                                    : WindowOpenDisposition::NEW_BACKGROUND_TAB;
   navigate_params.tabstrip_index = index;
   navigate_params.tabstrip_add_types = add_types;
   chrome::Navigate(&navigate_params);
@@ -595,7 +596,7 @@
   // among other things, whether the location bar gets displayed.
   // TODO(mpcomplete): This seems wrong. What if the extension content is hosted
   // in a tab?
-  if (disposition == NEW_POPUP)
+  if (disposition == WindowOpenDisposition::NEW_POPUP)
     params.extension_app_id = extension_id;
 
   params.disposition = disposition;
diff --git a/chrome/browser/extensions/extension_tab_util_browsertest.cc b/chrome/browser/extensions/extension_tab_util_browsertest.cc
index c245550..4362f4e76 100644
--- a/chrome/browser/extensions/extension_tab_util_browsertest.cc
+++ b/chrome/browser/extensions/extension_tab_util_browsertest.cc
@@ -83,9 +83,7 @@
   // If the user navigates to the options page e.g. by typing in the url, it
   // should not override the currently-open tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      options_url,
-      NEW_FOREGROUND_TAB,
+      browser(), options_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(4, browser()->tab_strip_model()->count());
   EXPECT_EQ(options_url, GetActiveUrl(browser()));
diff --git a/chrome/browser/extensions/extension_uninstall_dialog.cc b/chrome/browser/extensions/extension_uninstall_dialog.cc
index d302b51..b561870 100644
--- a/chrome/browser/extensions/extension_uninstall_dialog.cc
+++ b/chrome/browser/extensions/extension_uninstall_dialog.cc
@@ -195,7 +195,7 @@
       profile_,
       extension_urls::GetWebstoreReportAbuseUrl(extension_->id(), kReferrerId),
       ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/extensions/extension_view_host.cc b/chrome/browser/extensions/extension_view_host.cc
index d36b3d00..615e13c 100644
--- a/chrome/browser/extensions/extension_view_host.cc
+++ b/chrome/browser/extensions/extension_view_host.cc
@@ -148,13 +148,13 @@
     const OpenURLParams& params) {
   // Whitelist the dispositions we will allow to be opened.
   switch (params.disposition) {
-    case SINGLETON_TAB:
-    case NEW_FOREGROUND_TAB:
-    case NEW_BACKGROUND_TAB:
-    case NEW_POPUP:
-    case NEW_WINDOW:
-    case SAVE_TO_DISK:
-    case OFF_THE_RECORD: {
+    case WindowOpenDisposition::SINGLETON_TAB:
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
+    case WindowOpenDisposition::NEW_BACKGROUND_TAB:
+    case WindowOpenDisposition::NEW_POPUP:
+    case WindowOpenDisposition::NEW_WINDOW:
+    case WindowOpenDisposition::SAVE_TO_DISK:
+    case WindowOpenDisposition::OFF_THE_RECORD: {
       // Only allow these from hosts that are bound to a browser (e.g. popups).
       // Otherwise they are not driven by a user gesture.
       Browser* browser = view_->GetBrowser();
diff --git a/chrome/browser/extensions/fetch_apitest.cc b/chrome/browser/extensions/fetch_apitest.cc
index c35ad6e..cc7d937f 100644
--- a/chrome/browser/extensions/fetch_apitest.cc
+++ b/chrome/browser/extensions/fetch_apitest.cc
@@ -64,7 +64,7 @@
   // its WebContents.
   content::WebContents* CreateAndNavigateTab(const GURL& url) {
     chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
-    params.disposition = NEW_FOREGROUND_TAB;
+    params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     ui_test_utils::NavigateToURL(&params);
     return browser()->tab_strip_model()->GetActiveWebContents();
   }
diff --git a/chrome/browser/extensions/isolated_app_browsertest.cc b/chrome/browser/extensions/isolated_app_browsertest.cc
index b68b9b6..5834c54 100644
--- a/chrome/browser/extensions/isolated_app_browsertest.cc
+++ b/chrome/browser/extensions/isolated_app_browsertest.cc
@@ -159,9 +159,9 @@
   // If bug fixed, we cannot go back anymore.
   // If not fixed, we will redirect back to app2 and can go back again.
   EXPECT_TRUE(chrome::CanGoBack(browser()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_TRUE(chrome::CanGoBack(browser()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_FALSE(chrome::CanGoBack(browser()));
 
   // We also need to test script-initialized navigation (document.location.href)
@@ -170,7 +170,8 @@
   // the previous history entry.
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("non_app/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   WebContents* tab0 = browser()->tab_strip_model()->GetWebContentsAt(1);
 
@@ -189,7 +190,7 @@
 
   // This kind of navigation should not replace previous navigation entry.
   EXPECT_TRUE(chrome::CanGoBack(browser()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_FALSE(chrome::CanGoBack(browser()));
 }
 
@@ -216,10 +217,12 @@
   ui_test_utils::NavigateToURL(browser(), base_url.Resolve("app1/main.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("app2/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("non_app/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ASSERT_EQ(3, browser()->tab_strip_model()->count());
 
@@ -285,7 +288,7 @@
       content::Source<NavigationController>(
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
   EXPECT_TRUE(HasCookie(tab0, "app1=3"));
   EXPECT_FALSE(HasCookie(tab0, "app2"));
@@ -308,10 +311,12 @@
   ui_test_utils::NavigateToURL(browser(), base_url.Resolve("app1/main.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("app2/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("non_app/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ASSERT_EQ(3, browser()->tab_strip_model()->count());
 
@@ -395,7 +400,8 @@
   ASSERT_FALSE(GetInstalledApp(tab0));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("app1/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   WebContents* tab1 = browser()->tab_strip_model()->GetWebContentsAt(1);
   ASSERT_TRUE(GetInstalledApp(tab1));
 
@@ -425,8 +431,8 @@
 
   // Also create a non-app tab to ensure no new cookies were set in that jar.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), root_url,
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      browser(), root_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   WebContents* tab2 = browser()->tab_strip_model()->GetWebContentsAt(2);
   EXPECT_FALSE(HasCookie(tab2, "nonAppMedia=1"));
   EXPECT_FALSE(HasCookie(tab2, "app1Media=1"));
@@ -462,7 +468,8 @@
   ui_test_utils::NavigateToURL(browser(), base_url.Resolve("app1/main.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("app1/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   // For the third tab, use window.open to keep it in process with an opener.
   OpenWindow(browser()->tab_strip_model()->GetWebContentsAt(0),
              base_url.Resolve("app1/main.html"), true, NULL);
diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc
index f8b3777..5d4facc 100644
--- a/chrome/browser/extensions/process_management_browsertest.cc
+++ b/chrome/browser/extensions/process_management_browsertest.cc
@@ -84,31 +84,39 @@
       browser(), base_url.Resolve("isolated_apps/app1/main.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("hosted_app/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("test_file.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("isolated_apps/app2/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("api_test/app_process/path1/empty.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("test_file_with_body.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Load another copy of isolated app 1.
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), base_url.Resolve("isolated_apps/app1/main.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Load another extension.
   const extensions::Extension* extension2 = LoadExtension(
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc
index 2a49f87..cadb4ec 100644
--- a/chrome/browser/extensions/process_manager_browsertest.cc
+++ b/chrome/browser/extensions/process_manager_browsertest.cc
@@ -281,9 +281,7 @@
 
   // Load a page from the test host in a new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      url,
-      NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Sanity check that there's no bleeding between the extension and the tab.
@@ -328,7 +326,7 @@
   EXPECT_EQ(0u, pm->GetRenderFrameHostsForExtension(extension->id()).size());
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), extension_url, NEW_FOREGROUND_TAB,
+      browser(), extension_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(1u, pm->GetRenderFrameHostsForExtension(extension->id()).size());
 }
@@ -475,7 +473,7 @@
 
   // Now load an extension page and a non-extension page...
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), kExt1EmptyUrl, NEW_BACKGROUND_TAB,
+      browser(), kExt1EmptyUrl, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   NavigateToURL(embedded_test_server()->GetURL("/two_iframes.html"));
   EXPECT_EQ(1u, pm->GetAllFrames().size());
diff --git a/chrome/browser/extensions/renderer_initialization_browsertest.cc b/chrome/browser/extensions/renderer_initialization_browsertest.cc
index 63fbe88..139e939 100644
--- a/chrome/browser/extensions/renderer_initialization_browsertest.cc
+++ b/chrome/browser/extensions/renderer_initialization_browsertest.cc
@@ -23,9 +23,9 @@
       LoadExtension(test_data_dir_.AppendASCII("simple_with_file"));
   ASSERT_TRUE(extension);
   GURL url = extension->GetResourceURL("file.html");
-  browser()->OpenURL(content::OpenURLParams(url, content::Referrer(),
-                                            NEW_FOREGROUND_TAB,
-                                            ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(content::OpenURLParams(
+      url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_TYPED, false));
   // Without waiting for the tab to finish, unload the extension.
   extension_service()->UnloadExtension(extension->id(),
                                        UnloadedExtensionInfo::REASON_TERMINATE);
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 2c9e0eef1..9a83e812 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -51,7 +51,7 @@
 content::WebContents* AddTab(Browser* browser, const GURL& url) {
   int starting_tab_count = browser->tab_strip_model()->count();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser, url, NEW_FOREGROUND_TAB,
+      browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   int tab_count = browser->tab_strip_model()->count();
   EXPECT_EQ(starting_tab_count + 1, tab_count);
@@ -129,7 +129,7 @@
   // returns it.
   content::WebContents* Navigate(const GURL& url) {
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url, NEW_FOREGROUND_TAB,
+        browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     content::WebContents* web_contents =
         browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/extensions/webstore_inline_installer.cc b/chrome/browser/extensions/webstore_inline_installer.cc
index 86a7848..85861ec 100644
--- a/chrome/browser/extensions/webstore_inline_installer.cc
+++ b/chrome/browser/extensions/webstore_inline_installer.cc
@@ -160,7 +160,8 @@
             GURL(redirect_url),
             content::Referrer(web_contents()->GetURL(),
                               blink::WebReferrerPolicyDefault)),
-        NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
+        WindowOpenDisposition::NEW_FOREGROUND_TAB,
+        ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
     *error = kInlineInstallSupportedError;
     return false;
   }
diff --git a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
index a2a25b7..91ad7cf 100644
--- a/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
+++ b/chrome/browser/extensions/webstore_inline_installer_browsertest.cc
@@ -357,7 +357,8 @@
   int old_tab_index = browser()->tab_strip_model()->active_index();
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), GenerateTestServerUrl(kAppDomain, "both_listeners.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   DCHECK_NE(old_tab_index, browser()->tab_strip_model()->active_index());
   browser()->tab_strip_model()->CloseWebContentsAt(old_tab_index,
                                                    TabStripModel::CLOSE_NONE);
diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc
index f7d9d92..6608957f 100644
--- a/chrome/browser/extensions/window_open_apitest.cc
+++ b/chrome/browser/extensions/window_open_apitest.cc
@@ -191,12 +191,12 @@
                         ->GetURL(popup_app_contents_path + "open_popup.html")
                         .ReplaceComponents(replace_host);
 
-  browser()->OpenURL(OpenURLParams(
-      open_tab, Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED,
-      false));
-  browser()->OpenURL(OpenURLParams(
-      open_popup, Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(OpenURLParams(open_tab, Referrer(),
+                                   WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(OpenURLParams(open_popup, Referrer(),
+                                   WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
 
   EXPECT_TRUE(WaitForTabsAndPopups(browser(), 3, 1));
 }
diff --git a/chrome/browser/fast_shutdown_browsertest.cc b/chrome/browser/fast_shutdown_browsertest.cc
index fda079b3..b5dfb65 100644
--- a/chrome/browser/fast_shutdown_browsertest.cc
+++ b/chrome/browser/fast_shutdown_browsertest.cc
@@ -53,7 +53,8 @@
       chrome::NOTIFICATION_BROWSER_WINDOW_READY,
       content::NotificationService::AllSources());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   window_observer.Wait();
 
   // Close the new window, removing the one and only beforeunload handler.
diff --git a/chrome/browser/favicon/content_favicon_driver_browsertest.cc b/chrome/browser/favicon/content_favicon_driver_browsertest.cc
index a1f2675..44bb338 100644
--- a/chrome/browser/favicon/content_favicon_driver_browsertest.cc
+++ b/chrome/browser/favicon/content_favicon_driver_browsertest.cc
@@ -217,7 +217,8 @@
   {
     PendingTaskWaiter waiter(web_contents(), this);
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+        browser(), url, WindowOpenDisposition::CURRENT_TAB,
+        ui_test_utils::BROWSER_TEST_NONE);
     waiter.Wait();
   }
   ASSERT_TRUE(delegate->was_requested());
@@ -231,7 +232,8 @@
   {
     PendingTaskWaiter waiter(web_contents(), this);
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+        browser(), url, WindowOpenDisposition::CURRENT_TAB,
+        ui_test_utils::BROWSER_TEST_NONE);
     waiter.Wait();
   }
   EXPECT_FALSE(delegate->bypassed_cache());
diff --git a/chrome/browser/history/history_browsertest.cc b/chrome/browser/history/history_browsertest.cc
index c5cc496f..b74e364 100644
--- a/chrome/browser/history/history_browsertest.cc
+++ b/chrome/browser/history/history_browsertest.cc
@@ -384,10 +384,10 @@
   Browser* browser2 = CreateBrowser(browser()->profile());
   ui_test_utils::NavigateToURL(browser2, url2);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser2, url3, NEW_FOREGROUND_TAB,
+      browser2, url3, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser2, url4, NEW_FOREGROUND_TAB,
+      browser2, url4, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   std::vector<GURL> urls(GetHistoryContents());
@@ -448,7 +448,7 @@
 
   ui_test_utils::NavigateToURL(browser(), url1);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2, NEW_BACKGROUND_TAB,
+      browser(), url2, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   std::vector<GURL> urls(GetHistoryContents());
@@ -478,7 +478,7 @@
 
   content::WebContents* tab =
       browser()->tab_strip_model()->GetActiveWebContents();
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(tab);
 
   std::vector<GURL> urls(GetHistoryContents());
@@ -486,7 +486,7 @@
   ASSERT_EQ(url1, urls[0]);
   ASSERT_EQ(url2, urls[1]);
 
-  chrome::GoForward(browser(), CURRENT_TAB);
+  chrome::GoForward(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(tab);
   urls = GetHistoryContents();
   ASSERT_EQ(2u, urls.size());
@@ -534,9 +534,8 @@
   EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   chrome::ExecuteCommand(browser(), IDC_SHOW_HISTORY);
 
diff --git a/chrome/browser/history/redirect_browsertest.cc b/chrome/browser/history/redirect_browsertest.cc
index d1ae3db5..b1e8d2d0 100644
--- a/chrome/browser/history/redirect_browsertest.cc
+++ b/chrome/browser/history/redirect_browsertest.cc
@@ -282,13 +282,15 @@
   content::TestNavigationObserver observer(web_contents, 2);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), first_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      browser(), first_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   // We don't sleep here - the first navigation won't have been committed yet
   // because we told the server to wait a minute. This means the browser has
   // started it's provisional load for the client redirect destination page but
   // hasn't completed. Our time is now!
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), final_url, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
+      browser(), final_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
   observer.Wait();
 
   // Check to make sure the navigation did in fact take place and we are
diff --git a/chrome/browser/infobars/infobar_service.cc b/chrome/browser/infobars/infobar_service.cc
index 71b9251..5d0ef271 100644
--- a/chrome/browser/infobars/infobar_service.cc
+++ b/chrome/browser/infobars/infobar_service.cc
@@ -119,8 +119,10 @@
   // A normal user click on an infobar URL will result in a CURRENT_TAB
   // disposition; turn that into a NEW_FOREGROUND_TAB so that we don't end up
   // smashing the page the user is looking at.
-  web_contents()->OpenURL(content::OpenURLParams(
-      url, content::Referrer(),
-      (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
-      ui::PAGE_TRANSITION_LINK, false));
+  web_contents()->OpenURL(
+      content::OpenURLParams(url, content::Referrer(),
+                             (disposition == WindowOpenDisposition::CURRENT_TAB)
+                                 ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                                 : disposition,
+                             ui::PAGE_TRANSITION_LINK, false));
 }
diff --git a/chrome/browser/infobars/infobars_browsertest.cc b/chrome/browser/infobars/infobars_browsertest.cc
index 07a78e88..090f91b 100644
--- a/chrome/browser/infobars/infobars_browsertest.cc
+++ b/chrome/browser/infobars/infobars_browsertest.cc
@@ -67,7 +67,8 @@
 
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("/simple.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WindowedNotificationObserver infobar_added_2(
         chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
         content::NotificationService::AllSources());
diff --git a/chrome/browser/interstitials/chrome_controller_client.cc b/chrome/browser/interstitials/chrome_controller_client.cc
index 1c7e74b..98d33838 100644
--- a/chrome/browser/interstitials/chrome_controller_client.cc
+++ b/chrome/browser/interstitials/chrome_controller_client.cc
@@ -164,7 +164,8 @@
 }
 
 void ChromeControllerClient::OpenUrlInCurrentTab(const GURL& url) {
-  content::OpenURLParams params(url, Referrer(), CURRENT_TAB,
+  content::OpenURLParams params(url, Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   web_contents_->OpenURL(params);
 }
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
index 143c805..e536bca4 100644
--- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc
+++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
@@ -245,9 +245,8 @@
     content::DownloadTestObserverInProgress observer(
         content::BrowserContext::GetDownloadManager(browser->profile()), 1);
     ui_test_utils::NavigateToURLWithDisposition(
-        browser,
-        GURL(net::URLRequestSlowDownloadJob::kKnownSizeUrl),
-        NEW_BACKGROUND_TAB,
+        browser, GURL(net::URLRequestSlowDownloadJob::kKnownSizeUrl),
+        WindowOpenDisposition::NEW_BACKGROUND_TAB,
         ui_test_utils::BROWSER_TEST_NONE);
     observer.WaitForFinished();
     EXPECT_EQ(
@@ -343,11 +342,9 @@
       ->CloseWebContentsAt(1, TabStripModel::CLOSE_USER_GESTURE);
   content::TestNavigationObserver navigation_observer(
       browser()->tab_strip_model()->GetActiveWebContents(), 1);
-  ASSERT_NO_FATAL_FAILURE(
-      NavigateToURLWithDisposition(browser(),
-                                   GURL(chrome::kChromeUIVersionURL),
-                                   CURRENT_TAB,
-                                   ui_test_utils::BROWSER_TEST_NONE));
+  ASSERT_NO_FATAL_FAILURE(NavigateToURLWithDisposition(
+      browser(), GURL(chrome::kChromeUIVersionURL),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE));
   ASSERT_NO_FATAL_FAILURE(AcceptClose());
   navigation_observer.Wait();
 
@@ -890,9 +887,7 @@
       1,
       content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_QUIT);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(download_url),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL(download_url), WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
   observer.WaitForFinished();
 
diff --git a/chrome/browser/media/defer_background_media_browsertest.cc b/chrome/browser/media/defer_background_media_browsertest.cc
index d30178c..e6b4dd1 100644
--- a/chrome/browser/media/defer_background_media_browsertest.cc
+++ b/chrome/browser/media/defer_background_media_browsertest.cc
@@ -29,7 +29,8 @@
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), content::GetFileUrlWithQuery(
                      media::GetTestDataFilePath("bear-640x360.webm"), ""),
-      NEW_BACKGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ASSERT_EQ(2, browser()->tab_strip_model()->count());
   content::WebContents* background_contents =
diff --git a/chrome/browser/memory/tab_manager_browsertest.cc b/chrome/browser/memory/tab_manager_browsertest.cc
index b181335..d24585d 100644
--- a/chrome/browser/memory/tab_manager_browsertest.cc
+++ b/chrome/browser/memory/tab_manager_browsertest.cc
@@ -59,7 +59,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open1);
   load1.Wait();
 
@@ -67,7 +68,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
-                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open2);
   load2.Wait();
 
@@ -75,7 +77,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open3(GURL(chrome::kChromeUITermsURL), content::Referrer(),
-                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open3);
   load3.Wait();
 
@@ -88,7 +91,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open4(GURL(chrome::kChromeUIVersionURL), content::Referrer(),
-                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open4);
   load4.Wait();
 
@@ -96,7 +100,8 @@
   WindowedNotificationObserver load5(
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
-  OpenURLParams open5(GURL("chrome://dns"), content::Referrer(), CURRENT_TAB,
+  OpenURLParams open5(GURL("chrome://dns"), content::Referrer(),
+                      WindowOpenDisposition::CURRENT_TAB,
                       ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open5);
   load5.Wait();
@@ -168,14 +173,14 @@
   WindowedNotificationObserver back1(
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   back1.Wait();
   EXPECT_TRUE(chrome::CanGoBack(browser()));
   EXPECT_TRUE(chrome::CanGoForward(browser()));
   WindowedNotificationObserver back2(
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   back2.Wait();
   EXPECT_FALSE(chrome::CanGoBack(browser()));
   EXPECT_TRUE(chrome::CanGoForward(browser()));
@@ -198,7 +203,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open1);
   load1.Wait();
 
@@ -206,7 +212,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
-                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open2);
   load2.Wait();
   EXPECT_FALSE(tab_manager->recent_tab_discard());
@@ -249,7 +256,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open1);
   load1.Wait();
 
@@ -257,7 +265,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
-                      NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open2);
 
   ASSERT_EQ(2, browser()->tab_strip_model()->count());
@@ -286,7 +295,7 @@
 
   GURL url2(chrome::kChromeUIAboutURL);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2, NEW_FOREGROUND_TAB,
+      browser(), url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // No discarding should be possible as the only background tab is displaying a
@@ -315,7 +324,8 @@
   // Open 2 tabs, the second one being in the background.
   ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUIAboutURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(chrome::kChromeUIAboutURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, tsm->count());
 
@@ -363,7 +373,8 @@
   // Open 2 tabs, the second one being in the background.
   ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUIAboutURL), NEW_BACKGROUND_TAB,
+      browser(), GURL(chrome::kChromeUIAboutURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   auto* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
@@ -404,7 +415,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open1);
   load1.Wait();
 
@@ -412,7 +424,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
-                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   browser()->OpenURL(open2);
   load2.Wait();
 
diff --git a/chrome/browser/memory/tab_manager_observer_browsertest.cc b/chrome/browser/memory/tab_manager_observer_browsertest.cc
index 403b6da..d8a1749d 100644
--- a/chrome/browser/memory/tab_manager_observer_browsertest.cc
+++ b/chrome/browser/memory/tab_manager_observer_browsertest.cc
@@ -88,11 +88,13 @@
 
   // Open two tabs.
   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                      NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   int index_1 = GetIndex(browser()->OpenURL(open1));
 
   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
-                      NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                      WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false);
   int index_2 = GetIndex(browser()->OpenURL(open2));
 
   // Subscribe observer to TabManager's observer list.
@@ -150,7 +152,8 @@
 
   // Open two tabs.
   OpenURLParams open(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
-                     NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false);
+                     WindowOpenDisposition::NEW_BACKGROUND_TAB,
+                     ui::PAGE_TRANSITION_TYPED, false);
   WebContents* contents = browser()->OpenURL(open);
 
   // Subscribe observer to TabManager's observer list.
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h
index 333cd12..0b0b881 100644
--- a/chrome/browser/metrics/chrome_metrics_service_accessor.h
+++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -30,10 +30,6 @@
 }
 }
 
-namespace chrome_browser {
-void SetupPreReadFieldTrial();
-}
-
 namespace component_updater {
 class ComponentUpdateService;
 }
@@ -87,7 +83,6 @@
   friend class ArcSupportHost;
   friend class BrowserProcessImpl;
   friend void chrome::AttemptRestart();
-  friend void chrome_browser::SetupPreReadFieldTrial();
   friend class chrome::android::ExternalDataUseObserverBridge;
   friend class ChromeMetricsServicesManagerClient;
   friend class ChromeRenderMessageFilter;
diff --git a/chrome/browser/metrics/metrics_service_browsertest.cc b/chrome/browser/metrics/metrics_service_browsertest.cc
index 2ba8c021..2167d5a 100644
--- a/chrome/browser/metrics/metrics_service_browsertest.cc
+++ b/chrome/browser/metrics/metrics_service_browsertest.cc
@@ -46,17 +46,13 @@
 
     base::FilePath page1_path = test_directory.AppendASCII("title2.html");
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(),
-        net::FilePathToFileURL(page1_path),
-        NEW_FOREGROUND_TAB,
-        kBrowserTestFlags);
+        browser(), net::FilePathToFileURL(page1_path),
+        WindowOpenDisposition::NEW_FOREGROUND_TAB, kBrowserTestFlags);
 
     base::FilePath page2_path = test_directory.AppendASCII("iframe.html");
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(),
-        net::FilePathToFileURL(page2_path),
-        NEW_FOREGROUND_TAB,
-        kBrowserTestFlags);
+        browser(), net::FilePathToFileURL(page2_path),
+        WindowOpenDisposition::NEW_FOREGROUND_TAB, kBrowserTestFlags);
   }
 };
 
diff --git a/chrome/browser/metrics/thread_watcher.cc b/chrome/browser/metrics/thread_watcher.cc
index 84a00ae..5fc44a1 100644
--- a/chrome/browser/metrics/thread_watcher.cc
+++ b/chrome/browser/metrics/thread_watcher.cc
@@ -79,12 +79,11 @@
   DCHECK(WatchDogThread::CurrentlyOnWatchDogThread());
 
   // Create a new thread watcher object for the given thread and activate it.
-  ThreadWatcher* watcher = new ThreadWatcher(params);
+  std::unique_ptr<ThreadWatcher> watcher(new ThreadWatcher(params));
 
-  DCHECK(watcher);
   // If we couldn't register the thread watcher object, we are shutting down,
-  // then don't activate thread watching.
-  if (!ThreadWatcherList::IsRegistered(params.thread_id))
+  // so don't activate thread watching.
+  if (!ThreadWatcherList::Register(std::move(watcher)))
     return;
   watcher->ActivateThreadWatching();
 }
@@ -224,7 +223,6 @@
 
 void ThreadWatcher::Initialize() {
   DCHECK(WatchDogThread::CurrentlyOnWatchDogThread());
-  ThreadWatcherList::Register(this);
 
   const std::string response_time_histogram_name =
       "ThreadWatcher.ResponseTime." + thread_name_;
@@ -382,18 +380,14 @@
 }
 
 // static
-void ThreadWatcherList::Register(ThreadWatcher* watcher) {
+bool ThreadWatcherList::Register(std::unique_ptr<ThreadWatcher> watcher) {
   DCHECK(WatchDogThread::CurrentlyOnWatchDogThread());
   if (!g_thread_watcher_list_)
-    return;
-  DCHECK(!g_thread_watcher_list_->Find(watcher->thread_id()));
-  g_thread_watcher_list_->registered_[watcher->thread_id()] = watcher;
-}
-
-// static
-bool ThreadWatcherList::IsRegistered(const BrowserThread::ID thread_id) {
-  DCHECK(WatchDogThread::CurrentlyOnWatchDogThread());
-  return nullptr != ThreadWatcherList::Find(thread_id);
+    return false;
+  content::BrowserThread::ID thread_id = watcher->thread_id();
+  DCHECK(g_thread_watcher_list_->registered_.count(thread_id) == 0);
+  g_thread_watcher_list_->registered_[thread_id] = watcher.release();
+  return true;
 }
 
 // static
@@ -886,25 +880,30 @@
 void StartupTimeBomb::Disarm() {
   DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
   if (startup_watchdog_) {
-    startup_watchdog_->Disarm();
-    startup_watchdog_->Cleanup();
-    DeleteStartupWatchdog();
+    base::Watchdog* startup_watchdog = startup_watchdog_;
+    startup_watchdog_ = nullptr;
+
+    startup_watchdog->Disarm();
+    startup_watchdog->Cleanup();
+    DeleteStartupWatchdog(thread_id_, startup_watchdog);
   }
 }
 
-void StartupTimeBomb::DeleteStartupWatchdog() {
-  DCHECK_EQ(thread_id_, base::PlatformThread::CurrentId());
-  if (startup_watchdog_->IsJoinable()) {
+// static
+void StartupTimeBomb::DeleteStartupWatchdog(
+    const base::PlatformThreadId thread_id,
+    base::Watchdog* startup_watchdog) {
+  DCHECK_EQ(thread_id, base::PlatformThread::CurrentId());
+  if (startup_watchdog->IsJoinable()) {
     // Allow the watchdog thread to shutdown on UI. Watchdog thread shutdowns
     // very fast.
     base::ThreadRestrictions::ScopedAllowIO allow_io;
-    delete startup_watchdog_;
-    startup_watchdog_ = nullptr;
+    delete startup_watchdog;
     return;
   }
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, base::Bind(&StartupTimeBomb::DeleteStartupWatchdog,
-                            base::Unretained(this)),
+      FROM_HERE, base::Bind(&StartupTimeBomb::DeleteStartupWatchdog, thread_id,
+                            base::Unretained(startup_watchdog)),
       base::TimeDelta::FromSeconds(10));
 }
 
diff --git a/chrome/browser/metrics/thread_watcher.h b/chrome/browser/metrics/thread_watcher.h
index 6bf8d15c..a2ecc674 100644
--- a/chrome/browser/metrics/thread_watcher.h
+++ b/chrome/browser/metrics/thread_watcher.h
@@ -78,10 +78,10 @@
   // base::Bind supports methods with up to 6 parameters. WatchingParams is used
   // as a workaround that limitation for invoking ThreadWatcher::StartWatching.
   struct WatchingParams {
-    const content::BrowserThread::ID& thread_id;
-    const std::string& thread_name;
-    const base::TimeDelta& sleep_time;
-    const base::TimeDelta& unresponsive_time;
+    content::BrowserThread::ID thread_id;
+    std::string thread_name;
+    base::TimeDelta sleep_time;
+    base::TimeDelta unresponsive_time;
     uint32_t unresponsive_threshold;
     bool crash_on_hang;
     uint32_t live_threads_threshold;
@@ -102,6 +102,8 @@
           live_threads_threshold(live_threads_threshold_in) {}
   };
 
+  virtual ~ThreadWatcher();
+
   // This method starts performing health check on the given |thread_id|. It
   // will create ThreadWatcher object for the given |thread_id|, |thread_name|.
   // |sleep_time| is the wait time between ping messages. |unresponsive_time| is
@@ -144,8 +146,6 @@
   // ping message is sent, to check if we have received pong message or not.
   explicit ThreadWatcher(const WatchingParams& params);
 
-  virtual ~ThreadWatcher();
-
   // This method activates the thread watching which starts ping/pong messaging.
   virtual void ActivateThreadWatching();
 
@@ -394,10 +394,8 @@
   static void StopWatchingAll();
 
   // Register() stores a pointer to the given ThreadWatcher in a global map.
-  static void Register(ThreadWatcher* watcher);
-
-  // This method returns true if the ThreadWatcher object is registerd.
-  static bool IsRegistered(const content::BrowserThread::ID thread_id);
+  // Returns true if it was successfully registered.
+  static bool Register(std::unique_ptr<ThreadWatcher> watcher);
 
   // This method returns number of responsive and unresponsive watched threads.
   static void GetStatusOfThreads(uint32_t* responding_thread_count,
@@ -626,9 +624,10 @@
   static void DisarmStartupTimeBomb();
 
  private:
-  // Deletes |startup_watchdog_| if it is joinable. If |startup_watchdog_| is
-  // not joinable, then it will post a delayed task to try again.
-  void DeleteStartupWatchdog();
+  // Deletes the watchdog thread if it is joinable; otherwise it posts a delayed
+  // task to try again.
+  static void DeleteStartupWatchdog(const base::PlatformThreadId thread_id,
+                                    base::Watchdog* startup_watchdog);
 
   // The singleton of this class.
   static StartupTimeBomb* g_startup_timebomb_;
diff --git a/chrome/browser/metrics/thread_watcher_unittest.cc b/chrome/browser/metrics/thread_watcher_unittest.cc
index 4aca262..c5ee923 100644
--- a/chrome/browser/metrics/thread_watcher_unittest.cc
+++ b/chrome/browser/metrics/thread_watcher_unittest.cc
@@ -279,13 +279,19 @@
     thread_watcher_list_ = new ThreadWatcherList();
 
     // Create thread watcher object for the IO thread.
-    io_watcher_ = new CustomThreadWatcher(BrowserThread::IO, kIOThreadName,
-                                          kSleepTime, kUnresponsiveTime);
+    std::unique_ptr<CustomThreadWatcher> io_watcher(
+        new CustomThreadWatcher(BrowserThread::IO, kIOThreadName,
+                                kSleepTime, kUnresponsiveTime));
+    io_watcher_ = io_watcher.get();
+    ASSERT_TRUE(ThreadWatcherList::Register(std::move(io_watcher)));
     EXPECT_EQ(io_watcher_, thread_watcher_list_->Find(BrowserThread::IO));
 
     // Create thread watcher object for the DB thread.
-    db_watcher_ = new CustomThreadWatcher(BrowserThread::DB, kDBThreadName,
-                                          kSleepTime, kUnresponsiveTime);
+    std::unique_ptr<CustomThreadWatcher> db_watcher(
+        new CustomThreadWatcher(BrowserThread::DB, kDBThreadName,
+                                kSleepTime, kUnresponsiveTime));
+    db_watcher_ = db_watcher.get();
+    ASSERT_TRUE(ThreadWatcherList::Register(std::move(db_watcher)));
     EXPECT_EQ(db_watcher_, thread_watcher_list_->Find(BrowserThread::DB));
 
     {
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc
index e489c93..2c9eff56 100644
--- a/chrome/browser/net/errorpage_browsertest.cc
+++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -485,9 +485,9 @@
         browser()->tab_strip_model()->GetActiveWebContents(),
         num_navigations);
     if (direction == HISTORY_NAVIGATE_BACK) {
-      chrome::GoBack(browser(), CURRENT_TAB);
+      chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
     } else if (direction == HISTORY_NAVIGATE_FORWARD) {
-      chrome::GoForward(browser(), CURRENT_TAB);
+      chrome::GoForward(browser(), WindowOpenDisposition::CURRENT_TAB);
     } else {
       FAIL();
     }
diff --git a/chrome/browser/notifications/extension_welcome_notification.cc b/chrome/browser/notifications/extension_welcome_notification.cc
index 9c4fbaf..dee0e47 100644
--- a/chrome/browser/notifications/extension_welcome_notification.cc
+++ b/chrome/browser/notifications/extension_welcome_notification.cc
@@ -88,7 +88,7 @@
         profile_,
         GURL(chrome::kNotificationWelcomeLearnMoreURL),
         ui::PAGE_TRANSITION_LINK);
-    params.disposition = NEW_FOREGROUND_TAB;
+    params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     params.window_action = chrome::NavigateParams::SHOW_WINDOW;
     chrome::Navigate(&params);
   }
diff --git a/chrome/browser/notifications/notification_interactive_uitest.cc b/chrome/browser/notifications/notification_interactive_uitest.cc
index 1d6466b1..f1b87e8 100644
--- a/chrome/browser/notifications/notification_interactive_uitest.cc
+++ b/chrome/browser/notifications/notification_interactive_uitest.cc
@@ -696,9 +696,7 @@
   // Test crashing renderer does not close or crash notification.
   AllowAllOrigins();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("about:blank"),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL("about:blank"), WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
   browser()->tab_strip_model()->ActivateTabAt(0, true);
   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
diff --git a/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.cc
new file mode 100644
index 0000000..adc54ab
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.cc
@@ -0,0 +1,26 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.h"
+
+#include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
+#include "third_party/WebKit/public/platform/WebLoadingBehaviorFlag.h"
+
+CssScanningMetricsObserver::CssScanningMetricsObserver() {}
+
+CssScanningMetricsObserver::~CssScanningMetricsObserver() {}
+
+void CssScanningMetricsObserver::OnFirstMeaningfulPaint(
+    const page_load_metrics::PageLoadTiming& timing,
+    const page_load_metrics::PageLoadExtraInfo& info) {
+  if (info.metadata.behavior_flags &
+          blink::WebLoadingBehaviorFlag::WebLoadingBehaviorCSSPreloadFound &&
+      WasStartedInForegroundOptionalEventInForeground(
+          timing.first_meaningful_paint, info)) {
+    PAGE_LOAD_HISTOGRAM(
+        "PageLoad.Clients.CssScanner.Experimental.PaintTiming"
+        "ParseStartToFirstMeaningfulPaint",
+        timing.first_meaningful_paint.value() - timing.parse_start.value());
+  }
+}
diff --git a/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.h
new file mode 100644
index 0000000..3cf6b07
--- /dev/null
+++ b/chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.h
@@ -0,0 +1,26 @@
+// 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 CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_CSS_SCANNING_PAGE_LOAD_METRICS_OBSERVER_H_
+#define CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_CSS_SCANNING_PAGE_LOAD_METRICS_OBSERVER_H_
+
+#include "base/macros.h"
+#include "chrome/browser/page_load_metrics/page_load_metrics_observer.h"
+
+class CssScanningMetricsObserver
+    : public page_load_metrics::PageLoadMetricsObserver {
+ public:
+  CssScanningMetricsObserver();
+  ~CssScanningMetricsObserver() override;
+
+  // page_load_metrics::PageLoadMetricsObserver:
+  void OnFirstMeaningfulPaint(
+      const page_load_metrics::PageLoadTiming& timing,
+      const page_load_metrics::PageLoadExtraInfo& info) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CssScanningMetricsObserver);
+};
+
+#endif  // CHROME_BROWSER_PAGE_LOAD_METRICS_OBSERVERS_CSS_SCANNING_PAGE_LOAD_METRICS_OBSERVER_H_
diff --git a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc
index d920c17..87e1782c 100644
--- a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc
@@ -80,7 +80,8 @@
     base::TimeTicks start = base::TimeTicks::Now();
     ui_test_utils::NavigateToURL(browser(), url);
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), GURL(chrome::kChromeUIVersionURL), NEW_FOREGROUND_TAB,
+        browser(), GURL(chrome::kChromeUIVersionURL),
+        WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     base::TimeDelta upper_bound_delta = base::TimeTicks::Now() - start;
 
@@ -103,7 +104,7 @@
   void NavigateInBackgroundAndClose(GURL url) {
     ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url, NEW_BACKGROUND_TAB,
+        browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
     // Make sure the correct tab is in the foreground.
@@ -124,7 +125,7 @@
   base::TimeDelta NavigateInBackgroundAndCloseInForegroundWithTiming(GURL url) {
     ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url, NEW_BACKGROUND_TAB,
+        browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
     // Make sure the correct tab is in the foreground.
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
index fd460c8..cc17f4c 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -12,6 +12,7 @@
 #endif  // OS_ANDROID
 #include "chrome/browser/page_load_metrics/observers/aborts_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/core_page_load_metrics_observer.h"
+#include "chrome/browser/page_load_metrics/observers/css_scanning_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/data_reduction_proxy_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/document_write_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer.h"
@@ -76,6 +77,7 @@
   tracker->AddObserver(
       base::WrapUnique(new HttpsEngagementPageLoadMetricsObserver(
           web_contents_->GetBrowserContext())));
+  tracker->AddObserver(base::WrapUnique(new CssScanningMetricsObserver()));
 #if defined(OS_ANDROID)
   tracker->AddObserver(
       base::WrapUnique(new AndroidPageLoadMetricsObserver(web_contents_)));
diff --git a/chrome/browser/password_manager/account_chooser_dialog_android.cc b/chrome/browser/password_manager/account_chooser_dialog_android.cc
index 54a1638..4c7feea 100644
--- a/chrome/browser/password_manager/account_chooser_dialog_android.cc
+++ b/chrome/browser/password_manager/account_chooser_dialog_android.cc
@@ -199,8 +199,8 @@
     const JavaParamRef<jobject>& obj) {
   web_contents_->OpenURL(content::OpenURLParams(
       GURL(password_manager::kPasswordManagerHelpCenterSmartLock),
-      content::Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
-      false /* is_renderer_initiated */));
+      content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false /* is_renderer_initiated */));
 }
 
 void AccountChooserDialogAndroid::WebContentsDestroyed() {
diff --git a/chrome/browser/password_manager/auto_signin_first_run_dialog_android.cc b/chrome/browser/password_manager/auto_signin_first_run_dialog_android.cc
index 157ebc3..caff964 100644
--- a/chrome/browser/password_manager/auto_signin_first_run_dialog_android.cc
+++ b/chrome/browser/password_manager/auto_signin_first_run_dialog_android.cc
@@ -100,8 +100,8 @@
 void AutoSigninFirstRunDialogAndroid::OnLinkClicked(JNIEnv* env, jobject obj) {
   web_contents_->OpenURL(content::OpenURLParams(
       GURL(password_manager::kPasswordManagerHelpCenterSmartLock),
-      content::Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
-      false /* is_renderer_initiated */));
+      content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false /* is_renderer_initiated */));
 }
 
 void AutoSigninFirstRunDialogAndroid::WebContentsDestroyed() {
diff --git a/chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.cc b/chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.cc
index fdaeecc..e8c061a 100644
--- a/chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.cc
+++ b/chrome/browser/password_manager/generated_password_saved_infobar_delegate_android.cc
@@ -25,11 +25,11 @@
 
 void GeneratedPasswordSavedInfoBarDelegateAndroid::OnInlineLinkClicked() {
   if (smart_lock_branding_enabled_) {
-    InfoBarService::WebContentsFromInfoBar(infobar())
-        ->OpenURL(content::OpenURLParams(
+    InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL(
+        content::OpenURLParams(
             GURL(password_manager::kPasswordManagerAccountDashboardURL),
-            content::Referrer(), NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
-            false));
+            content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+            ui::PAGE_TRANSITION_LINK, false));
   } else {
     chrome::android::ChromeApplication::ShowPasswordSettings();
   }
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index c5d05d39..6d23c5c 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -1290,9 +1290,8 @@
   // WebContents, but don't wait for navigation, which only finishes after
   // authentication.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      embedded_test_server()->GetURL("/basic_auth"),
-      NEW_FOREGROUND_TAB,
+      browser(), embedded_test_server()->GetURL("/basic_auth"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   content::NavigationController* nav_controller =
@@ -2586,8 +2585,8 @@
       &WebContents()->GetController();
   WindowedAuthNeededObserver auth_needed_observer(nav_controller);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), embedded_test_server()->GetURL("/basic_auth"), CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), embedded_test_server()->GetURL("/basic_auth"),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   auth_needed_observer.Wait();
 
   // The auth dialog caused a query to PasswordStore, make sure it was
@@ -2746,13 +2745,15 @@
 // browser.
 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTestBase, InternalsPage) {
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL("chrome://password-manager-internals"), CURRENT_TAB,
+      browser(), GURL("chrome://password-manager-internals"),
+      WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* internals_web_contents = WebContents();
 
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("/password/password_form.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   std::string find_renderer_logs =
       "var text = document.getElementById('log-entries').innerText;"
diff --git a/chrome/browser/platform_util_chromeos.cc b/chrome/browser/platform_util_chromeos.cc
index 6d62b2e..2af6878ea 100644
--- a/chrome/browser/platform_util_chromeos.cc
+++ b/chrome/browser/platform_util_chromeos.cc
@@ -108,7 +108,7 @@
   //     "Browser::EmailPageLocation" (to name only one).
   // As such we should keep this code here.
   chrome::NavigateParams params(profile, url, ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
 
   if (url.SchemeIs("mailto")) {
     std::string string_url = kGmailComposeUrl;
diff --git a/chrome/browser/plugins/plugin_info_message_filter.cc b/chrome/browser/plugins/plugin_info_message_filter.cc
index 1305a77..d47cc7d4 100644
--- a/chrome/browser/plugins/plugin_info_message_filter.cc
+++ b/chrome/browser/plugins/plugin_info_message_filter.cc
@@ -412,7 +412,9 @@
   matching_plugins.erase(
       std::remove_if(
           matching_plugins.begin(), matching_plugins.end(),
-          [&](const WebPluginInfo& info) { return info.path == not_present; }),
+          [&not_present](const WebPluginInfo& info) {
+            return info.path == not_present;
+          }),
       matching_plugins.end());
 #endif  // defined(GOOGLE_CHROME_BUILD)
   if (matching_plugins.empty()) {
diff --git a/chrome/browser/plugins/plugin_installer.cc b/chrome/browser/plugins/plugin_installer.cc
index 710ae5d..68edf89 100644
--- a/chrome/browser/plugins/plugin_installer.cc
+++ b/chrome/browser/plugins/plugin_installer.cc
@@ -131,10 +131,10 @@
                                       content::WebContents* web_contents) {
   DCHECK_EQ(INSTALLER_STATE_IDLE, state_);
   web_contents->OpenURL(content::OpenURLParams(
-      plugin_url,
-      content::Referrer(web_contents->GetURL(),
-                        blink::WebReferrerPolicyDefault),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED, false));
+      plugin_url, content::Referrer(web_contents->GetURL(),
+                                    blink::WebReferrerPolicyDefault),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED,
+      false));
   FOR_EACH_OBSERVER(PluginInstallerObserver, observers_, DownloadFinished());
 }
 
diff --git a/chrome/browser/plugins/plugin_observer.cc b/chrome/browser/plugins/plugin_observer.cc
index f7f41611..3abca97c 100644
--- a/chrome/browser/plugins/plugin_observer.cc
+++ b/chrome/browser/plugins/plugin_observer.cc
@@ -441,13 +441,14 @@
 #endif  // defined(ENABLE_PLUGIN_INSTALLATION)
 
 void PluginObserver::OnOpenAboutPlugins() {
-  web_contents()->OpenURL(OpenURLParams(
-      GURL(chrome::kChromeUIPluginsURL),
-      content::Referrer::SanitizeForRequest(
-          GURL(chrome::kChromeUIPluginsURL),
-          content::Referrer(web_contents()->GetURL(),
-                            blink::WebReferrerPolicyDefault)),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
+  web_contents()->OpenURL(
+      OpenURLParams(GURL(chrome::kChromeUIPluginsURL),
+                    content::Referrer::SanitizeForRequest(
+                        GURL(chrome::kChromeUIPluginsURL),
+                        content::Referrer(web_contents()->GetURL(),
+                                          blink::WebReferrerPolicyDefault)),
+                    WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                    ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
 }
 
 void PluginObserver::OnCouldNotLoadPlugin(const base::FilePath& plugin_path) {
diff --git a/chrome/browser/plugins/plugin_power_saver_browsertest.cc b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
index 50855c62..5cf4e7e0 100644
--- a/chrome/browser/plugins/plugin_power_saver_browsertest.cc
+++ b/chrome/browser/plugins/plugin_power_saver_browsertest.cc
@@ -313,7 +313,8 @@
     embedded_test_server()->RegisterRequestHandler(
         base::Bind(&RespondWithHTML, html));
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), embedded_test_server()->base_url(), NEW_BACKGROUND_TAB,
+        browser(), embedded_test_server()->base_url(),
+        WindowOpenDisposition::NEW_BACKGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
     int index = browser()->tab_strip_model()->GetIndexOfLastWebContentsOpenedBy(
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 94e0a495..0ae062c 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -2545,9 +2545,9 @@
   // Launch an app that tries to open a fullscreen window.
   TestAddAppWindowObserver add_window_observer(
       extensions::AppWindowRegistry::Get(browser()->profile()));
-  OpenApplication(AppLaunchParams(browser()->profile(), extension,
-                                  extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                                  extensions::SOURCE_TEST));
+  OpenApplication(AppLaunchParams(
+      browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
   extensions::AppWindow* window = add_window_observer.WaitForAppWindow();
   ASSERT_TRUE(window);
 
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 4208e6c..0370414 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -1182,7 +1182,7 @@
   }
 
   void NavigateToDestURL() const {
-    NavigateToDestURLWithDisposition(CURRENT_TAB, true);
+    NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, true);
   }
 
   // Opens the url in a new tab, with no opener.
@@ -1196,7 +1196,8 @@
   }
 
   void NavigateToURL(const std::string& dest_html_file) const {
-    NavigateToURLWithDisposition(dest_html_file, CURRENT_TAB, true);
+    NavigateToURLWithDisposition(dest_html_file,
+                                 WindowOpenDisposition::CURRENT_TAB, true);
   }
 
   void NavigateToURLWithDisposition(const std::string& dest_html_file,
@@ -1279,7 +1280,7 @@
   // Navigates back through the history to the prerendered page.
   void GoBackToPrerender() {
     TestNavigationObserver back_nav_observer(GetActiveWebContents());
-    chrome::GoBack(current_browser(), CURRENT_TAB);
+    chrome::GoBack(current_browser(), WindowOpenDisposition::CURRENT_TAB);
     back_nav_observer.Wait();
     bool original_prerender_page = false;
     ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
@@ -1297,7 +1298,7 @@
     ASSERT_TRUE(tab);
     EXPECT_FALSE(tab->IsLoading());
     TestNavigationObserver back_nav_observer(tab);
-    chrome::GoBack(current_browser(), CURRENT_TAB);
+    chrome::GoBack(current_browser(), WindowOpenDisposition::CURRENT_TAB);
     back_nav_observer.Wait();
     bool js_result;
     ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
@@ -1627,7 +1628,7 @@
     // occur.
     // TODO(davidben): The only handles CURRENT_TAB navigations, which is the
     // only case tested or prerendered right now.
-    CHECK_EQ(CURRENT_TAB, params.disposition);
+    CHECK_EQ(WindowOpenDisposition::CURRENT_TAB, params.disposition);
     NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(),
                                            GetActiveWebContents());
     WebContents* target_web_contents = current_browser()->OpenURL(params);
@@ -1755,7 +1756,7 @@
   NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(),
                                          GetActiveWebContents());
   ui_test_utils::NavigateToURLWithDisposition(
-      current_browser(), prerender_page_url, CURRENT_TAB,
+      current_browser(), prerender_page_url, WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
   swap_observer.Wait();
 
@@ -1921,7 +1922,7 @@
   prerender_start_loop.Run();
 
   // Navigate to the URL, but assume the contents won't be swapped in.
-  NavigateToDestURLWithDisposition(CURRENT_TAB, false);
+  NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that client redirects don't add alias URLs until after they commit.
@@ -1942,7 +1943,8 @@
   prerender_start_loop.Run();
 
   // Navigating to the second URL should not swap.
-  NavigateToURLWithDisposition(kNoCommitUrl, CURRENT_TAB, false);
+  NavigateToURLWithDisposition(kNoCommitUrl, WindowOpenDisposition::CURRENT_TAB,
+                               false);
 }
 
 // Checks that the prerendering of a page is canceled correctly when a
@@ -2135,9 +2137,9 @@
   NavigationOrSwapObserver swap_observer(
       current_browser()->tab_strip_model(),
       GetActiveWebContents(), 2);
-  current_browser()->OpenURL(OpenURLParams(
-      navigate_url, Referrer(), CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+  current_browser()->OpenURL(OpenURLParams(navigate_url, Referrer(),
+                                           WindowOpenDisposition::CURRENT_TAB,
+                                           ui::PAGE_TRANSITION_TYPED, false));
   swap_observer.Wait();
 
   EXPECT_TRUE(DidDisplayPass(GetActiveWebContents()));
@@ -2648,7 +2650,7 @@
   PrerenderTestURL("/prerender/no_prerender_page.html",
                    FINAL_STATUS_APP_TERMINATING, 1);
   NavigateToURLWithDisposition("/prerender/no_prerender_page.html#fragment",
-                               CURRENT_TAB, false);
+                               WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that we do not use a prerendered page when we prerender a fragment
@@ -2657,8 +2659,8 @@
                        PrerenderFragmentNavigatePage) {
   PrerenderTestURL("/prerender/no_prerender_page.html#fragment",
                    FINAL_STATUS_APP_TERMINATING, 1);
-  NavigateToURLWithDisposition("/prerender/no_prerender_page.html", CURRENT_TAB,
-                               false);
+  NavigateToURLWithDisposition("/prerender/no_prerender_page.html",
+                               WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that we do not use a prerendered page when we prerender a fragment
@@ -2668,7 +2670,7 @@
   PrerenderTestURL("/prerender/no_prerender_page.html#other_fragment",
                    FINAL_STATUS_APP_TERMINATING, 1);
   NavigateToURLWithDisposition("/prerender/no_prerender_page.html#fragment",
-                               CURRENT_TAB, false);
+                               WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that we do not use a prerendered page when the page uses a client
@@ -2678,8 +2680,8 @@
   PrerenderTestURL(
       CreateClientRedirect("/prerender/no_prerender_page.html#fragment"),
       FINAL_STATUS_APP_TERMINATING, 2);
-  NavigateToURLWithDisposition("/prerender/no_prerender_page.html", CURRENT_TAB,
-                               false);
+  NavigateToURLWithDisposition("/prerender/no_prerender_page.html",
+                               WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that we do not use a prerendered page when the page uses a client
@@ -2689,7 +2691,7 @@
   PrerenderTestURL(CreateClientRedirect("/prerender/no_prerender_page.html"),
                    FINAL_STATUS_APP_TERMINATING, 2);
   NavigateToURLWithDisposition("/prerender/no_prerender_page.html#fragment",
-                               CURRENT_TAB, false);
+                               WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that we correctly use a prerendered page when the page uses JS to set
@@ -2833,7 +2835,7 @@
 
   // Switch back to the current tab and attempt to swap it in.
   current_browser()->tab_strip_model()->ActivateTabAt(0, true);
-  NavigateToDestURLWithDisposition(CURRENT_TAB, false);
+  NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 class TestClientCertStore : public net::ClientCertStore {
@@ -3231,7 +3233,7 @@
   agent->AttachClient(&client);
   const char* url = "/prerender/prerender_page.html";
   PrerenderTestURL(url, FINAL_STATUS_DEVTOOLS_ATTACHED, 1);
-  NavigateToURLWithDisposition(url, CURRENT_TAB, false);
+  NavigateToURLWithDisposition(url, WindowOpenDisposition::CURRENT_TAB, false);
   agent->DetachClient(&client);
 }
 
@@ -3526,7 +3528,7 @@
                    FINAL_STATUS_PAGE_BEING_CAPTURED, 1);
   WebContents* web_contents = GetActiveWebContents();
   web_contents->IncrementCapturerCount(gfx::Size());
-  NavigateToDestURLWithDisposition(CURRENT_TAB, false);
+  NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
   web_contents->DecrementCapturerCount();
 }
 
@@ -3609,7 +3611,7 @@
   NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(),
                                          GetActiveWebContents());
   ui_test_utils::NavigateToURLWithDisposition(
-      current_browser(), dest_url(), CURRENT_TAB,
+      current_browser(), dest_url(), WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
   swap_observer.Wait();
 
@@ -3646,7 +3648,7 @@
   NavigationOrSwapObserver swap_observer(current_browser()->tab_strip_model(),
                                          GetActiveWebContents());
   ui_test_utils::NavigateToURLWithDisposition(
-      current_browser(), dest_url(), CURRENT_TAB,
+      current_browser(), dest_url(), WindowOpenDisposition::CURRENT_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
   swap_observer.Wait();
 
@@ -3686,7 +3688,8 @@
   PrerenderTestURL("/prerender/prerender_page.html",
                    FINAL_STATUS_APP_TERMINATING, 1);
 
-  content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB,
+  content::OpenURLParams params(dest_url(), Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_TYPED, false);
   params.extra_headers = "X-Custom-Header: 42\r\n";
   NavigateToURLWithParams(params, false);
@@ -3700,7 +3703,8 @@
                    FINAL_STATUS_APP_TERMINATING, 1);
 
   std::string post_data = "DATA";
-  content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB,
+  content::OpenURLParams params(dest_url(), Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_TYPED, false);
   params.uses_post = true;
   params.post_data = content::ResourceRequestBody::CreateFromBytes(
@@ -3723,18 +3727,20 @@
 
   // Open a new tab to navigate in.
   ui_test_utils::NavigateToURLWithDisposition(
-      current_browser(), GURL(url::kAboutBlankURL), NEW_FOREGROUND_TAB,
+      current_browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Now navigate in the new tab.
-  NavigateToDestURLWithDisposition(CURRENT_TAB, false);
+  NavigateToDestURLWithDisposition(WindowOpenDisposition::CURRENT_TAB, false);
 }
 
 // Checks that prerenders honor |should_replace_current_entry|.
 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderReplaceCurrentEntry) {
   PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
 
-  content::OpenURLParams params(dest_url(), Referrer(), CURRENT_TAB,
+  content::OpenURLParams params(dest_url(), Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_TYPED, false);
   params.should_replace_current_entry = true;
   NavigateToURLWithParams(params, false);
@@ -3934,7 +3940,7 @@
   prerender->contents()->set_skip_final_checks(true);
 
   // Navigate to the URL entered.
-  omnibox_view->model()->AcceptInput(CURRENT_TAB, false);
+  omnibox_view->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false);
 
   // Prerender should be running, but abandoned.
   EXPECT_TRUE(
diff --git a/chrome/browser/printing/cloud_print/privet_notifications.cc b/chrome/browser/printing/cloud_print/privet_notifications.cc
index 89652153..12d00f1 100644
--- a/chrome/browser/printing/cloud_print/privet_notifications.cc
+++ b/chrome/browser/printing/cloud_print/privet_notifications.cc
@@ -377,7 +377,7 @@
   Profile* profile = Profile::FromBrowserContext(profile_);
   chrome::NavigateParams params(profile, url,
                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/printing/print_dialog_cloud.cc b/chrome/browser/printing/print_dialog_cloud.cc
index bdc280e..2491fef 100644
--- a/chrome/browser/printing/print_dialog_cloud.cc
+++ b/chrome/browser/printing/print_dialog_cloud.cc
@@ -80,10 +80,8 @@
         browser->OpenURL(content::OpenURLParams(
             google_util::AppendGoogleLocaleParam(
                 url, g_browser_process->GetApplicationLocale()),
-            content::Referrer(),
-            NEW_FOREGROUND_TAB,
-            ui::PAGE_TRANSITION_AUTO_BOOKMARK,
-            false));
+            content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+            ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
     new SignInObserver(web_contents, callback);
   }
 }
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc
index 5fa9f36f2..71f776b2 100644
--- a/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -98,7 +98,7 @@
       displayer.browser()->OpenURL(content::OpenURLParams(
           google_util::AppendGoogleLocaleParam(
               url, g_browser_process->GetApplicationLocale()),
-          content::Referrer(), NEW_FOREGROUND_TAB,
+          content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
           ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
   if (data && data->size()) {
     new PrintDataSetter(web_contents, data, print_job_title, print_ticket,
diff --git a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
index a9f65b3f..050ed536 100644
--- a/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
+++ b/chrome/browser/printing/print_preview_dialog_controller_browsertest.cc
@@ -263,7 +263,7 @@
   // Reload the initiator. Make sure reloading destroys the print preview
   // dialog.
   PrintPreviewDialogDestroyedObserver dialog_destroyed_observer(preview_dialog);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
   ASSERT_TRUE(dialog_destroyed_observer.dialog_destroyed());
diff --git a/chrome/browser/profiles/host_zoom_map_browsertest.cc b/chrome/browser/profiles/host_zoom_map_browsertest.cc
index e9a8f7f3..98a4c83 100644
--- a/chrome/browser/profiles/host_zoom_map_browsertest.cc
+++ b/chrome/browser/profiles/host_zoom_map_browsertest.cc
@@ -289,7 +289,7 @@
 
   GURL test_url2 = ConstructTestServerURL(kTestURLTemplate2);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_url2, NEW_FOREGROUND_TAB,
+      browser(), test_url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_TRUE(
       content::ZoomValuesEqual(default_zoom_level, GetZoomLevel(test_url2)));
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index 11b38772..ad1e21a7 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -222,7 +222,8 @@
   if (inspector_dir.empty())
     return false;
 
-  *path = inspector_dir.AppendASCII(relative_path);
+  // Use the non-bundled and non-minified devtools app for development
+  *path = inspector_dir.AppendASCII("debug").AppendASCII(relative_path);
   return true;
 }
 
diff --git a/chrome/browser/push_messaging/push_messaging_browsertest.cc b/chrome/browser/push_messaging/push_messaging_browsertest.cc
index 68df46d1..4f2482c9 100644
--- a/chrome/browser/push_messaging/push_messaging_browsertest.cc
+++ b/chrome/browser/push_messaging/push_messaging_browsertest.cc
@@ -791,7 +791,8 @@
 
   // Open a blank foreground tab so site is no longer visible.
   ui_test_utils::NavigateToURLWithDisposition(
-      GetBrowser(), GURL("about:blank"), NEW_FOREGROUND_TAB,
+      GetBrowser(), GURL("about:blank"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // If the Service Worker push event handler shows a notification, we
@@ -908,7 +909,8 @@
       GetBrowser()->tab_strip_model()->GetActiveWebContents();
 
   ui_test_utils::NavigateToURLWithDisposition(
-      GetBrowser(), GURL("about:blank"), NEW_FOREGROUND_TAB,
+      GetBrowser(), GURL("about:blank"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   SetSiteEngagementScore(web_contents->GetURL(), 0.0);
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc
index bd96e69..17db565 100644
--- a/chrome/browser/referrer_policy_browsertest.cc
+++ b/chrome/browser/referrer_policy_browsertest.cc
@@ -188,7 +188,7 @@
       tab->GetRenderViewHost()->GetWidget()->ForwardMouseEvent(mouse_event);
     }
 
-    if (disposition == CURRENT_TAB) {
+    if (disposition == WindowOpenDisposition::CURRENT_TAB) {
       EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
     } else {
       tab_added_observer.Wait();
@@ -239,123 +239,90 @@
 
 // Content initiated navigation, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Origin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  CURRENT_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::NoButton,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsDefault) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  CURRENT_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::NoButton,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  CURRENT_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  CURRENT_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  NEW_BACKGROUND_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  NEW_BACKGROUND_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, target blank, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  LINK_WITH_TARGET_BLANK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
-                  blink::WebMouseEvent::Button::Left,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTP, LINK_WITH_TARGET_BLANK,
+      NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, target blank, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  LINK_WITH_TARGET_BLANK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
-                  blink::WebMouseEvent::Button::Left,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTPS, LINK_WITH_TARGET_BLANK,
+      NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, target blank, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  LINK_WITH_TARGET_BLANK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
-                  blink::WebMouseEvent::Button::Middle,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTP, LINK_WITH_TARGET_BLANK,
+      NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      blink::WebMouseEvent::Button::Middle, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, target blank, from HTTPS to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickTargetBlankOrigin) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  LINK_WITH_TARGET_BLANK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
-                  blink::WebMouseEvent::Button::Middle,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTPS, LINK_WITH_TARGET_BLANK,
+      NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      blink::WebMouseEvent::Button::Middle, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Context menu, from HTTP to HTTP.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, ContextMenuOrigin) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTP,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::Button::Right,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -364,52 +331,50 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsContextMenuOrigin) {
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
-  RunReferrerTest(blink::WebReferrerPolicyOrigin,
-                  START_ON_HTTPS,
-                  REGULAR_LINK,
-                  NO_REDIRECT,
-                  NEW_FOREGROUND_TAB,
+  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+                  NO_REDIRECT, WindowOpenDisposition::NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::Button::Right,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTP to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, Redirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, CURRENT_TAB,
-                  blink::WebMouseEvent::Button::NoButton,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+      SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
+      blink::WebMouseEvent::Button::NoButton, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // Content initiated navigation, from HTTPS to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, CURRENT_TAB,
-                  blink::WebMouseEvent::Button::NoButton,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+      SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
+      blink::WebMouseEvent::Button::NoButton, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTP to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, LeftClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTP_TO_HTTP, CURRENT_TAB,
-                  blink::WebMouseEvent::Button::Left,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
+      SERVER_REDIRECT_FROM_HTTP_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
+      blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, from HTTPS to HTTP via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsLeftClickRedirect) {
-  RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, CURRENT_TAB,
-                  blink::WebMouseEvent::Button::Left,
-                  EXPECT_ORIGIN_AS_REFERRER);
+  RunReferrerTest(
+      blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
+      SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
+      blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 }
 
 // User initiated navigation, middle click, from HTTP to HTTP via server
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, NEW_BACKGROUND_TAB,
+                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
+                  WindowOpenDisposition::NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -418,7 +383,8 @@
 // redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, NEW_BACKGROUND_TAB,
+                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
+                  WindowOpenDisposition::NEW_BACKGROUND_TAB,
                   blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -428,7 +394,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, TargetBlankRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP,
                   LINK_WITH_TARGET_BLANK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
-                  NEW_FOREGROUND_TAB, blink::WebMouseEvent::Button::Left,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                  blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
@@ -437,7 +404,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsTargetBlankRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS,
                   LINK_WITH_TARGET_BLANK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
-                  NEW_FOREGROUND_TAB, blink::WebMouseEvent::Button::Left,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                  blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
@@ -446,7 +414,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickTargetBlankRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP,
                   LINK_WITH_TARGET_BLANK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
-                  NEW_FOREGROUND_TAB, blink::WebMouseEvent::Button::Middle,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                  blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
@@ -456,7 +425,8 @@
                        HttpsMiddleClickTargetBlankRedirect) {
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS,
                   LINK_WITH_TARGET_BLANK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
-                  NEW_FOREGROUND_TAB, blink::WebMouseEvent::Button::Middle,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                  blink::WebMouseEvent::Button::Middle,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
 
@@ -465,7 +435,8 @@
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, NEW_FOREGROUND_TAB,
+                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::Button::Right,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -475,7 +446,8 @@
   ContextMenuNotificationObserver context_menu_observer(
       IDC_CONTENT_CONTEXT_OPENLINKNEWTAB);
   RunReferrerTest(blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, NEW_FOREGROUND_TAB,
+                  SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB,
                   blink::WebMouseEvent::Button::Right,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -486,7 +458,7 @@
   // Navigate from A to B.
   GURL start_url = RunReferrerTest(
       blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-      SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, CURRENT_TAB,
+      SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
       blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 
   // Navigate to C.
@@ -504,21 +476,21 @@
   AddAllPossibleTitles(start_url, title_watcher.get());
 
   // Go back to B.
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
 
   title_watcher.reset(new content::TitleWatcher(tab, expected_title));
   AddAllPossibleTitles(start_url, title_watcher.get());
 
   // Reload to B.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
 
   title_watcher.reset(new content::TitleWatcher(tab, expected_title));
   AddAllPossibleTitles(start_url, title_watcher.get());
 
   // Shift-reload to B.
-  chrome::ReloadBypassingCache(browser(), CURRENT_TAB);
+  chrome::ReloadBypassingCache(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_EQ(expected_title, title_watcher->WaitAndGetTitle());
 }
 
@@ -527,7 +499,7 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, RequestTabletSite) {
   GURL start_url = RunReferrerTest(
       blink::WebReferrerPolicyOrigin, START_ON_HTTPS, REGULAR_LINK,
-      SERVER_REDIRECT_FROM_HTTP_TO_HTTP, CURRENT_TAB,
+      SERVER_REDIRECT_FROM_HTTP_TO_HTTP, WindowOpenDisposition::CURRENT_TAB,
       blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER);
 
   base::string16 expected_title =
@@ -603,7 +575,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
                        HttpLeftClickHTTPSRedirectToHTTPOriginWhenCrossOrigin) {
   RunReferrerTest(blink::WebReferrerPolicyOriginWhenCrossOrigin, START_ON_HTTPS,
-                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP, CURRENT_TAB,
+                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTPS_TO_HTTP,
+                  WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -611,7 +584,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
                        HttpLeftClickRedirectToHTTPSOriginWhenCrossOrigin) {
   RunReferrerTest(blink::WebReferrerPolicyOriginWhenCrossOrigin, START_ON_HTTP,
-                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTP_TO_HTTPS, CURRENT_TAB,
+                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTP_TO_HTTPS,
+                  WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left,
                   EXPECT_ORIGIN_AS_REFERRER);
 }
@@ -619,7 +593,8 @@
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest,
                        HttpLeftClickRedirectToHTTPOriginWhenCrossOrigin) {
   RunReferrerTest(blink::WebReferrerPolicyOriginWhenCrossOrigin, START_ON_HTTP,
-                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTP_TO_HTTP, CURRENT_TAB,
+                  REGULAR_LINK, SERVER_REDIRECT_FROM_HTTP_TO_HTTP,
+                  WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left, EXPECT_FULL_REFERRER);
 }
 
@@ -628,7 +603,8 @@
 // User initiated navigation, from HTTP to HTTPS via server redirect.
 IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpLeftClickRedirectDefaultNoFlag) {
   RunReferrerTest(blink::WebReferrerPolicyDefault, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTP_TO_HTTPS, CURRENT_TAB,
+                  SERVER_REDIRECT_FROM_HTTP_TO_HTTPS,
+                  WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left, EXPECT_FULL_REFERRER,
                   blink::WebReferrerPolicyNoReferrerWhenDowngrade);
 }
@@ -639,7 +615,8 @@
       blink::WebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin;
 
   RunReferrerTest(blink::WebReferrerPolicyDefault, START_ON_HTTP, REGULAR_LINK,
-                  SERVER_REDIRECT_FROM_HTTP_TO_HTTPS, CURRENT_TAB,
+                  SERVER_REDIRECT_FROM_HTTP_TO_HTTPS,
+                  WindowOpenDisposition::CURRENT_TAB,
                   blink::WebMouseEvent::Button::Left, EXPECT_ORIGIN_AS_REFERRER,
                   expected_referrer_policy);
 }
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 10a3256..832f2a7c 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -373,7 +373,9 @@
     int event_flags) {
   WindowOpenDisposition disposition =
       ui::DispositionFromEventFlags(event_flags);
-  return disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition;
+  return disposition == WindowOpenDisposition::CURRENT_TAB
+             ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+             : disposition;
 }
 
 // Returns the preference of the profile represented by the |context|.
@@ -484,7 +486,7 @@
     Browser* browser = chrome::FindLastActiveWithProfile(profile);
     chrome::NavigateParams nav_params(browser, link_url,
                                       ui::PAGE_TRANSITION_LINK);
-    nav_params.disposition = NEW_FOREGROUND_TAB;
+    nav_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     nav_params.referrer = referrer;
     nav_params.window_action = chrome::NavigateParams::SHOW_WINDOW;
     chrome::Navigate(&nav_params);
@@ -1674,12 +1676,12 @@
       break;
 
     case IDC_CONTENT_CONTEXT_OPENLINKNEWWINDOW:
-      OpenURL(params_.link_url, GetDocumentURL(params_), NEW_WINDOW,
-              ui::PAGE_TRANSITION_LINK);
+      OpenURL(params_.link_url, GetDocumentURL(params_),
+              WindowOpenDisposition::NEW_WINDOW, ui::PAGE_TRANSITION_LINK);
       break;
 
     case IDC_CONTENT_CONTEXT_OPENLINKOFFTHERECORD:
-      OpenURL(params_.link_url, GURL(), OFF_THE_RECORD,
+      OpenURL(params_.link_url, GURL(), WindowOpenDisposition::OFF_THE_RECORD,
               ui::PAGE_TRANSITION_LINK);
       break;
 
@@ -1715,8 +1717,8 @@
 
     case IDC_CONTENT_CONTEXT_OPEN_ORIGINAL_IMAGE_NEW_TAB:
       OpenURLWithExtraHeaders(
-          params_.src_url, GetDocumentURL(params_), NEW_BACKGROUND_TAB,
-          ui::PAGE_TRANSITION_LINK,
+          params_.src_url, GetDocumentURL(params_),
+          WindowOpenDisposition::NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_LINK,
           data_reduction_proxy::kDataReductionPassThroughHeader);
       break;
 
@@ -1726,9 +1728,8 @@
 
     case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB:
     case IDC_CONTENT_CONTEXT_OPENAVNEWTAB:
-      OpenURL(params_.src_url,
-              GetDocumentURL(params_),
-              NEW_BACKGROUND_TAB,
+      OpenURL(params_.src_url, GetDocumentURL(params_),
+              WindowOpenDisposition::NEW_BACKGROUND_TAB,
               ui::PAGE_TRANSITION_LINK);
       break;
 
@@ -2119,10 +2120,10 @@
 
 void RenderViewContextMenu::ExecOpenLinkNewTab() {
   Browser* browser = chrome::FindBrowserWithWebContents(source_web_contents_);
-  OpenURL(params_.link_url,
-          GetDocumentURL(params_),
-          (!browser || browser->is_app()) ? NEW_FOREGROUND_TAB
-                                          : NEW_BACKGROUND_TAB,
+  OpenURL(params_.link_url, GetDocumentURL(params_),
+          (!browser || browser->is_app())
+              ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+              : WindowOpenDisposition::NEW_BACKGROUND_TAB,
           ui::PAGE_TRANSITION_LINK);
 }
 
diff --git a/chrome/browser/renderer_context_menu/spelling_bubble_model.cc b/chrome/browser/renderer_context_menu/spelling_bubble_model.cc
index 0b8c3201..585aa5a 100644
--- a/chrome/browser/renderer_context_menu/spelling_bubble_model.cc
+++ b/chrome/browser/renderer_context_menu/spelling_bubble_model.cc
@@ -60,7 +60,8 @@
 }
 
 void SpellingBubbleModel::LinkClicked() {
-  OpenURLParams params(GetLinkURL(), Referrer(), NEW_FOREGROUND_TAB,
+  OpenURLParams params(GetLinkURL(), Referrer(),
+                       WindowOpenDisposition::NEW_FOREGROUND_TAB,
                        ui::PAGE_TRANSITION_LINK, false);
   web_contents_->OpenURL(params);
 }
diff --git a/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm b/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
index ba51708..0165f04 100644
--- a/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
+++ b/chrome/browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper.mm
@@ -377,9 +377,9 @@
       historyOverlay_.view.window);
   if (browser) {
     if (direction == history_swiper::kForwards)
-      chrome::GoForward(browser, CURRENT_TAB);
+      chrome::GoForward(browser, WindowOpenDisposition::CURRENT_TAB);
     else
-      chrome::GoBack(browser, CURRENT_TAB);
+      chrome::GoBack(browser, WindowOpenDisposition::CURRENT_TAB);
   }
 }
 
@@ -482,9 +482,9 @@
               chrome::FindBrowserWithWindow(historyOverlay.view.window);
           if (ended && browser) {
             if (isRightScroll)
-              chrome::GoForward(browser, CURRENT_TAB);
+              chrome::GoForward(browser, WindowOpenDisposition::CURRENT_TAB);
             else
-              chrome::GoBack(browser, CURRENT_TAB);
+              chrome::GoBack(browser, WindowOpenDisposition::CURRENT_TAB);
           }
 
           if (ended || isComplete) {
diff --git a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
index 08c9406..5513106 100644
--- a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
+++ b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
@@ -106,7 +106,7 @@
   // renderer.
   base::Process OpenBackgroundTab(const GURL& page) {
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), page, NEW_BACKGROUND_TAB,
+        browser(), page, WindowOpenDisposition::NEW_BACKGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
     TabStripModel* tab_strip = browser()->tab_strip_model();
@@ -280,7 +280,7 @@
   // Create another omnibox tab.  It should share the process with the other
   // WebUI.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), omnibox, NEW_FOREGROUND_TAB,
+      browser(), omnibox, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   tab_count++;
   EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
@@ -289,7 +289,7 @@
   // Create another omnibox tab.  It should share the process with the other
   // WebUI.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), omnibox, NEW_FOREGROUND_TAB,
+      browser(), omnibox, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   tab_count++;
   EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
@@ -514,7 +514,7 @@
 
   ui_test_utils::NavigateToURL(browser(), url);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_BACKGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
diff --git a/chrome/browser/repost_form_warning_browsertest.cc b/chrome/browser/repost_form_warning_browsertest.cc
index e594e678..e3950669 100644
--- a/chrome/browser/repost_form_warning_browsertest.cc
+++ b/chrome/browser/repost_form_warning_browsertest.cc
@@ -75,7 +75,7 @@
       content::Source<content::NavigationController>(&controller));
   browser()->OpenURL(content::OpenURLParams(
       embedded_test_server()->GetURL("/auth-basic"), content::Referrer(),
-      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   observer.Wait();
 
   // Try to reload it again.
@@ -86,7 +86,7 @@
   // happen while the auth dialog is up.
   content::TestNavigationObserver navigation_observer(web_contents);
   browser()->OpenURL(content::OpenURLParams(
-      embedded_test_server()->GetURL("/bar"), content::Referrer(), CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+      embedded_test_server()->GetURL("/bar"), content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   navigation_observer.Wait();
 }
diff --git a/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js b/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
index 9d9e8918..2824e6f 100644
--- a/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
+++ b/chrome/browser/resources/chromeos/chromevox/common/chrome_extension_externs.js
@@ -36,6 +36,7 @@
   checkedStateChanged: '',
   childrenChanged: '',
   documentSelectionChanged: '',
+  expandedChanged: '',
   focus: '',
   hide: '',
   hover: '',
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
index 0b1380b..4c3e3d42 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -46,14 +46,19 @@
   this.addListener_(e.activedescendantchanged, this.onActiveDescendantChanged);
   this.addListener_(e.alert, this.onAlert);
   this.addListener_(e.ariaAttributeChanged, this.onEventIfInRange);
+  this.addListener_(e.autocorrectionOccured, this.onEventIfInRange);
   this.addListener_(e.checkedStateChanged, this.onCheckedStateChanged);
   this.addListener_(e.childrenChanged, this.onActiveDescendantChanged);
+  this.addListener_(e.expandedChanged, this.onEventIfInRange);
   this.addListener_(e.focus, this.onFocus);
   this.addListener_(e.hover, this.onHover);
+  this.addListener_(e.invalidStatusChanged, this.onEventIfInRange);
   this.addListener_(e.loadComplete, this.onLoadComplete);
   this.addListener_(e.menuEnd, this.onMenuEnd);
   this.addListener_(e.menuListItemSelected, this.onEventIfSelected);
   this.addListener_(e.menuStart, this.onMenuStart);
+  this.addListener_(e.rowCollapsed, this.onEventIfInRange);
+  this.addListener_(e.rowExpanded, this.onEventIfInRange);
   this.addListener_(e.scrollPositionChanged, this.onScrollPositionChanged);
   this.addListener_(e.selection, this.onSelection);
   this.addListener_(e.textChanged, this.onTextChanged);
diff --git a/chrome/browser/resources/chromeos/login/custom_elements_user_pod.html b/chrome/browser/resources/chromeos/login/custom_elements_user_pod.html
new file mode 100644
index 0000000..7d34b962
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/custom_elements_user_pod.html
@@ -0,0 +1,3 @@
+<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
diff --git a/chrome/browser/resources/chromeos/quick_unlock/pin_keyboard.html b/chrome/browser/resources/chromeos/quick_unlock/pin_keyboard.html
index f5cbab2..f79d542 100644
--- a/chrome/browser/resources/chromeos/quick_unlock/pin_keyboard.html
+++ b/chrome/browser/resources/chromeos/quick_unlock/pin_keyboard.html
@@ -119,7 +119,6 @@
         opacity: var(--dark-secondary-opacity);
         outline: 0;
         position: relative;
-        text-color: #000;
         width: 127px;
       }
 
@@ -132,7 +131,7 @@
       }
 
       #pin-input[is-invisible] {
-        visiblity: hidden;
+        visibility: hidden;
       }
 
       :host(:not([enable-submit-button])) #pin-input {
@@ -181,8 +180,7 @@
           <paper-button class="digit-button" on-tap="onNumberTap_" value="1">
             <inner-text>$i18n{pinKeyboard1}</inner-text>
           </paper-button>
-          <paper-button class="digit-button center-button" on-tap="onNumberTap_"
-                        value="2">
+          <paper-button class="digit-button" on-tap="onNumberTap_" value="2">
             <inner-text>$i18n{pinKeyboard2}</inner-text>
           </paper-button>
           <paper-button class="digit-button" on-tap="onNumberTap_" value="3">
@@ -193,8 +191,7 @@
           <paper-button class="digit-button" on-tap="onNumberTap_" value="4">
             <inner-text>$i18n{pinKeyboard4}</inner-text>
           </paper-button>
-          <paper-button class="digit-button center-button" on-tap="onNumberTap_"
-                        value="5">
+          <paper-button class="digit-button" on-tap="onNumberTap_" value="5">
             <inner-text>$i18n{pinKeyboard5}</inner-text>
           </paper-button>
           <paper-button class="digit-button" on-tap="onNumberTap_" value="6">
@@ -205,8 +202,7 @@
           <paper-button class="digit-button" on-tap="onNumberTap_" value="7">
             <inner-text>$i18n{pinKeyboard7}</inner-text>
           </paper-button>
-          <paper-button class="digit-button center-button" on-tap="onNumberTap_"
-                        value="8">
+          <paper-button class="digit-button" on-tap="onNumberTap_" value="8">
             <inner-text>$i18n{pinKeyboard8}</inner-text>
           </paper-button>
           <paper-button class="digit-button" on-tap="onNumberTap_" value="9">
diff --git a/chrome/browser/resources/settings/printing_page/compiled_resources2.gyp b/chrome/browser/resources/settings/printing_page/compiled_resources2.gyp
index 2058a33..a0398663 100644
--- a/chrome/browser/resources/settings/printing_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/printing_page/compiled_resources2.gyp
@@ -48,6 +48,7 @@
     {
       'target_name': 'printing_page',
       'dependencies': [
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:load_time_data',
         '../compiled_resources2.gyp:route',
         '../settings_page/compiled_resources2.gyp:settings_animated_pages',
         'cups_printer_details_page',
diff --git a/chrome/browser/resources/settings/printing_page/printing_page.html b/chrome/browser/resources/settings/printing_page/printing_page.html
index ba31ae3..3b182eb9 100644
--- a/chrome/browser/resources/settings/printing_page/printing_page.html
+++ b/chrome/browser/resources/settings/printing_page/printing_page.html
@@ -21,11 +21,13 @@
       </array-selector>
       <neon-animatable route-path="default">
 <if expr="chromeos">
-        <div id="cupsPrinters" class="settings-box first"
-            on-tap="onTapCupsPrinters_" actionable>
-          <iron-icon icon="cr:print"></iron-icon>
-          <div class="middle">$i18n{cupsPrintersTitle}</div>
-        </div>
+        <template is="dom-if" if="[[showCupsPrintingFeatures_]]">
+          <div id="cupsPrinters" class="settings-box first"
+              on-tap="onTapCupsPrinters_" actionable>
+            <iron-icon icon="cr:print"></iron-icon>
+            <div class="middle">$i18n{cupsPrintersTitle}</div>
+          </div>
+        </template>
 </if>
         <div id="cloudPrinters" class="settings-box"
             on-tap="onTapCloudPrinters_" actionable>
diff --git a/chrome/browser/resources/settings/printing_page/printing_page.js b/chrome/browser/resources/settings/printing_page/printing_page.js
index 9c282bf..fbc14d45 100644
--- a/chrome/browser/resources/settings/printing_page/printing_page.js
+++ b/chrome/browser/resources/settings/printing_page/printing_page.js
@@ -12,6 +12,19 @@
       notify: true,
     },
 
+<if expr="chromeos">
+    /**
+     * Whether to show CUPS printers settings.
+     * @private {boolean}
+     */
+    showCupsPrintingFeatures_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('showCupsPrintingFeatures');
+      },
+    },
+</if>
+
     /** @type {!Array<!CupsPrinterInfo>} */
     cupsPrinters: {
       type: Array,
diff --git a/chrome/browser/resources/settings/settings_page/settings_section.html b/chrome/browser/resources/settings/settings_page/settings_section.html
index 6045474..aee3b5e 100644
--- a/chrome/browser/resources/settings/settings_page/settings_section.html
+++ b/chrome/browser/resources/settings/settings_page/settings_section.html
@@ -22,6 +22,7 @@
         color: var(--paper-grey-600);
         font-size: 13px;
         font-weight: 500;
+        margin-bottom: 0;
         margin-top: var(--settings-page-vertical-margin);
       }
 
@@ -54,7 +55,7 @@
       }
     </style>
     <div id="header">
-      <div class="title">{{pageTitle}}</div>
+      <h2 class="title">{{pageTitle}}</h2>
     </div>
     <div id="card">
       <content id="content"></content>
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
index 6bdb383e..a9ae25f6 100644
--- a/chrome/browser/safe_browsing/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -1643,11 +1643,9 @@
       learn_more_url, "ctx",
       base::IntToString(static_cast<int>(item.GetDangerType())));
   navigator->OpenURL(
-      content::OpenURLParams(learn_more_url,
-                             content::Referrer(),
-                             NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_LINK,
-                             false));
+      content::OpenURLParams(learn_more_url, content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_LINK, false));
 }
 
 void DownloadProtectionService::SetDownloadPingToken(
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
index 22c9bae..06d100c 100644
--- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -1079,7 +1079,7 @@
     ClearClientDownloadRequest();
   }
   {
-    // Invalid response should result in UNKNOWN.
+    // Invalid response should result in SAFE (default value in proto).
     ClientDownloadResponse invalid_response;
     factory.SetFakeResponse(DownloadProtectionService::GetDownloadRequestUrl(),
                             invalid_response.SerializePartialAsString(),
@@ -1089,7 +1089,7 @@
         &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback,
                           base::Unretained(this), run_loop.QuitClosure()));
     run_loop.Run();
-    EXPECT_TRUE(IsResult(DownloadProtectionService::UNKNOWN));
+    EXPECT_TRUE(IsResult(DownloadProtectionService::SAFE));
     EXPECT_TRUE(HasClientDownloadRequest());
     ClearClientDownloadRequest();
     EXPECT_FALSE(DownloadFeedbackService::GetPingsForDownloadForTesting(
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
index 24c479f7..9caf24f 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
@@ -251,11 +251,9 @@
       GURL learn_more_url(kLearnMore);
       learn_more_url = google_util::AppendGoogleLocaleParam(
           learn_more_url, g_browser_process->GetApplicationLocale());
-      OpenURLParams params(learn_more_url,
-                           Referrer(),
-                           CURRENT_TAB,
-                           ui::PAGE_TRANSITION_LINK,
-                           false);
+      OpenURLParams params(learn_more_url, Referrer(),
+                           WindowOpenDisposition::CURRENT_TAB,
+                           ui::PAGE_TRANSITION_LINK, false);
       web_contents()->OpenURL(params);
       break;
     }
@@ -316,9 +314,9 @@
              unsafe_resource.threat_type ==
                  SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL ||
              unsafe_resource.threat_type == SB_THREAT_TYPE_URL_UNWANTED);
-      OpenURLParams params(
-          diagnostic_url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_LINK,
-          false);
+      OpenURLParams params(diagnostic_url, Referrer(),
+                           WindowOpenDisposition::CURRENT_TAB,
+                           ui::PAGE_TRANSITION_LINK, false);
       web_contents()->OpenURL(params);
       break;
     }
@@ -335,7 +333,8 @@
       GURL phishing_error_url(kReportPhishingErrorUrl);
       phishing_error_url = google_util::AppendGoogleLocaleParam(
           phishing_error_url, g_browser_process->GetApplicationLocale());
-      OpenURLParams params(phishing_error_url, Referrer(), CURRENT_TAB,
+      OpenURLParams params(phishing_error_url, Referrer(),
+                           WindowOpenDisposition::CURRENT_TAB,
                            ui::PAGE_TRANSITION_LINK, false);
       web_contents()->OpenURL(params);
       break;
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index b956982..286acd9 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -454,9 +454,8 @@
     // Trigger the safe browsing interstitial page via a redirect in
     // "openWin()".
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(),
-        GURL("javascript:" + open_function + "()"),
-        CURRENT_TAB,
+        browser(), GURL("javascript:" + open_function + "()"),
+        WindowOpenDisposition::CURRENT_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
     WebContents* contents =
         browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index 9b669989..be07ef6 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -1087,8 +1087,9 @@
            &contents->GetController()));
   // Start a browser initiated top-level navigation to a site that does not
   // respond.
-  ui_test_utils::NavigateToURLWithDisposition(browser(), third_url, CURRENT_TAB,
-                                              ui_test_utils::BROWSER_TEST_NONE);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), third_url, WindowOpenDisposition::CURRENT_TAB,
+      ui_test_utils::BROWSER_TEST_NONE);
 
   // While the top-level navigation is pending, run javascript
   // function in the page which loads the malware image.
diff --git a/chrome/browser/safe_browsing/srt_global_error_win.cc b/chrome/browser/safe_browsing/srt_global_error_win.cc
index f06dfe13..376230e 100644
--- a/chrome/browser/safe_browsing/srt_global_error_win.cc
+++ b/chrome/browser/safe_browsing/srt_global_error_win.cc
@@ -246,9 +246,10 @@
 
   Browser* browser = chrome::FindLastActive();
   if (browser) {
-    browser->OpenURL(content::OpenURLParams(
-        GURL(kSRTDownloadURL), content::Referrer(), NEW_FOREGROUND_TAB,
-        ui::PAGE_TRANSITION_LINK, false));
+    browser->OpenURL(
+        content::OpenURLParams(GURL(kSRTDownloadURL), content::Referrer(),
+                               WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                               ui::PAGE_TRANSITION_LINK, false));
   }
 
   BrowserThread::PostBlockingPoolTask(
diff --git a/chrome/browser/search/hotword_service.cc b/chrome/browser/search/hotword_service.cc
index 2e60e06..45c7ce0 100644
--- a/chrome/browser/search/hotword_service.cc
+++ b/chrome/browser/search/hotword_service.cc
@@ -710,9 +710,9 @@
   if (!extension)
     return;
 
-  OpenApplication(
-      AppLaunchParams(profile_, extension, extensions::LAUNCH_CONTAINER_WINDOW,
-                      NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
+  OpenApplication(AppLaunchParams(
+      profile_, extension, extensions::LAUNCH_CONTAINER_WINDOW,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_CHROME_INTERNAL));
 }
 
 HotwordService::LaunchMode
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 1bc94036..963c712 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -201,7 +201,7 @@
         0,
         std::min(selected_index, static_cast<int>(tab.navigations.size() - 1)));
 
-    bool use_new_window = disposition == NEW_WINDOW;
+    bool use_new_window = disposition == WindowOpenDisposition::NEW_WINDOW;
 
     Browser* browser =
         use_new_window
@@ -211,7 +211,7 @@
     RecordAppLaunchForTab(browser, tab, selected_index);
 
     WebContents* web_contents;
-    if (disposition == CURRENT_TAB) {
+    if (disposition == WindowOpenDisposition::CURRENT_TAB) {
       DCHECK(!use_new_window);
       web_contents = chrome::ReplaceRestoredTab(
           browser, tab.navigations, selected_index, true, tab.extension_app_id,
@@ -222,7 +222,7 @@
       web_contents = chrome::AddRestoredTab(
           browser, tab.navigations, tab_index, selected_index,
           tab.extension_app_id,
-          disposition == NEW_FOREGROUND_TAB,  // selected
+          disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB,  // selected
           tab.pinned, true, nullptr, tab.user_agent_override);
       // Start loading the tab immediately.
       web_contents->GetController().LoadIfNecessary();
@@ -663,7 +663,8 @@
         add_types |= TabStripModel::ADD_ACTIVE;
       chrome::NavigateParams params(browser, urls[i],
                                     ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-      params.disposition = i == 0 ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
+      params.disposition = i == 0 ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                                  : WindowOpenDisposition::NEW_BACKGROUND_TAB;
       params.tabstrip_add_types = add_types;
       chrome::Navigate(&params);
     }
diff --git a/chrome/browser/sessions/session_restore_android.cc b/chrome/browser/sessions/session_restore_android.cc
index 812d85b..68b3734e 100644
--- a/chrome/browser/sessions/session_restore_android.cc
+++ b/chrome/browser/sessions/session_restore_android.cc
@@ -43,12 +43,12 @@
 
   TabAndroid* current_tab = TabAndroid::FromWebContents(web_contents);
   DCHECK(current_tab);
-  if (disposition == CURRENT_TAB) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
     current_tab->SwapTabContents(web_contents, new_web_contents, false, false);
     delete web_contents;
   } else {
-    DCHECK(disposition == NEW_FOREGROUND_TAB ||
-        disposition == NEW_BACKGROUND_TAB);
+    DCHECK(disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+           disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB);
     tab_model->CreateTab(current_tab, new_web_contents,
                          current_tab->GetAndroidId());
   }
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index fc3ad3d0..b9c308e 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -162,14 +162,14 @@
   void GoBack(Browser* browser) {
     content::TestNavigationObserver observer(
         browser->tab_strip_model()->GetActiveWebContents());
-    chrome::GoBack(browser, CURRENT_TAB);
+    chrome::GoBack(browser, WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
 
   void GoForward(Browser* browser) {
     content::TestNavigationObserver observer(
         browser->tab_strip_model()->GetActiveWebContents());
-    chrome::GoForward(browser, CURRENT_TAB);
+    chrome::GoForward(browser, WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
 
@@ -273,14 +273,12 @@
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, RestoredTabsShouldHaveWindow) {
   // Create tabs.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restart and session restore the tabs.
@@ -309,10 +307,10 @@
   GURL test_page(ui_test_utils::GetTestUrl(base::FilePath(),
       base::FilePath(FILE_PATH_LITERAL("tab-restore-visibility.html"))));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_page, NEW_FOREGROUND_TAB,
+      browser(), test_page, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_page, NEW_BACKGROUND_TAB,
+      browser(), test_page, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restart and session restore the tabs.
@@ -351,10 +349,10 @@
       base::FilePath(),
       base::FilePath(FILE_PATH_LITERAL("tab-restore-visibility.html"))));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_page, NEW_FOREGROUND_TAB,
+      browser(), test_page, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_page, NEW_BACKGROUND_TAB,
+      browser(), test_page, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restart and session restore the tabs.
@@ -557,8 +555,8 @@
     if (tab.navigations[0].virtual_url() == url2) {
       timestamp = tab.navigations[0].timestamp();
       http_status_code = tab.navigations[0].http_status_code();
-      std::vector<sessions::LiveTab*> content =
-          service->RestoreEntryById(NULL, tab.id, UNKNOWN);
+      std::vector<sessions::LiveTab*> content = service->RestoreEntryById(
+          NULL, tab.id, WindowOpenDisposition::UNKNOWN);
       ASSERT_EQ(1U, content.size());
       sessions::ContentLiveTab* live_tab =
           static_cast<sessions::ContentLiveTab*>(content[0]);
@@ -620,7 +618,7 @@
 
   // Restore the tab.
   std::vector<sessions::LiveTab*> content =
-      service->RestoreEntryById(NULL, tab->id, UNKNOWN);
+      service->RestoreEntryById(NULL, tab->id, WindowOpenDisposition::UNKNOWN);
   ASSERT_EQ(1U, content.size());
   ASSERT_TRUE(content[0]);
   EXPECT_EQ(url, static_cast<sessions::ContentLiveTab*>(content[0])
@@ -714,7 +712,8 @@
         content::NOTIFICATION_LOAD_STOP,
         content::NotificationService::AllSources());
     tab_content = SessionRestore::RestoreForeignSessionTab(
-        browser()->tab_strip_model()->GetActiveWebContents(), tab, CURRENT_TAB);
+        browser()->tab_strip_model()->GetActiveWebContents(), tab,
+        WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
   ASSERT_EQ(1, browser()->tab_strip_model()->count());
@@ -732,8 +731,8 @@
         content::NOTIFICATION_LOAD_STOP,
         content::NotificationService::AllSources());
     tab_content = SessionRestore::RestoreForeignSessionTab(
-        browser()->tab_strip_model()->GetActiveWebContents(),
-        tab, NEW_BACKGROUND_TAB);
+        browser()->tab_strip_model()->GetActiveWebContents(), tab,
+        WindowOpenDisposition::NEW_BACKGROUND_TAB);
     observer.Wait();
   }
   ASSERT_EQ(2, browser()->tab_strip_model()->count());
@@ -753,7 +752,8 @@
         content::NOTIFICATION_LOAD_STOP,
         content::NotificationService::AllSources());
     tab_content = SessionRestore::RestoreForeignSessionTab(
-        browser()->tab_strip_model()->GetActiveWebContents(), tab, NEW_WINDOW);
+        browser()->tab_strip_model()->GetActiveWebContents(), tab,
+        WindowOpenDisposition::NEW_WINDOW);
     new_browser = browser_observer.WaitForSingleNewBrowser();
     observer.Wait();
   }
@@ -862,14 +862,12 @@
   // Add several tabs to the browser. Restart the browser and check that all
   // tabs got loaded properly.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   Browser* restored =
       QuitBrowserAndRestoreWithURL(browser(), 1, GURL(), true);
@@ -889,14 +887,12 @@
   // Add several tabs to the browser. Restart the browser and check that all
   // tabs got loaded properly.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   // Restore the brwoser, but instead of directly waiting, we issue a critical
   // memory pressure event and finish then the loading.
@@ -1016,7 +1012,7 @@
   ui_test_utils::NavigateToURL(browser(), url1_);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   Browser* new_browser = QuitBrowserAndRestore(browser(), 2);
@@ -1036,7 +1032,7 @@
   ui_test_utils::NavigateToURL(browser(), url1_);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   chrome::CloseTab(browser());
 
@@ -1051,10 +1047,10 @@
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ActiveIndexUpdatedAtClose) {
   ui_test_utils::NavigateToURL(browser(), url1_);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url3_, NEW_BACKGROUND_TAB,
+      browser(), url3_, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   browser()->tab_strip_model()->CloseWebContentsAt(
@@ -1072,13 +1068,13 @@
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ActiveIndexUpdatedAtInsert) {
   ui_test_utils::NavigateToURL(browser(), url1_);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_BACKGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   chrome::NavigateParams navigate_params(browser(), url3_,
                                          ui::PAGE_TRANSITION_TYPED);
   navigate_params.tabstrip_index = 0;
-  navigate_params.disposition = NEW_BACKGROUND_TAB;
+  navigate_params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   ui_test_utils::NavigateToURL(&navigate_params);
 
   Browser* new_browser = QuitBrowserAndRestore(browser(), 3);
@@ -1131,9 +1127,7 @@
 
   // Open a second window.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_WINDOW,
+      browser(), GURL(url::kAboutBlankURL), WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
 
   ASSERT_EQ(2u, active_browser_list_->size());
@@ -1166,14 +1160,12 @@
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ShareProcessesOnRestore) {
   // Create two new tabs.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url::kAboutBlankURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   int expected_process_count = RenderProcessHostCount();
@@ -1196,7 +1188,7 @@
 
   // Create a tab without an overridden user agent.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
 
@@ -1226,7 +1218,7 @@
   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
   // Create a nonpinned tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
   // Select the pinned tab.
@@ -1268,7 +1260,7 @@
   // Create 2 tabs.
   ui_test_utils::NavigateToURL(browser(), url1_);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restore the session by calling chrome::Navigate().
@@ -1326,7 +1318,7 @@
   ui_test_utils::NavigateToURL(browser(), url1_);
   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
   Profile* profile = browser()->profile();
@@ -1425,7 +1417,7 @@
   ui_test_utils::NavigateToURL(browser(), GURL(kUrls[0]));
   for (size_t i = 1; i < kExpectedNumTabs; i++) {
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), GURL(kUrls[i]), NEW_FOREGROUND_TAB,
+        browser(), GURL(kUrls[i]), WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   }
 
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc
index a5b85a4..91c8c8ce 100644
--- a/chrome/browser/sessions/tab_restore_browsertest.cc
+++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -107,7 +107,7 @@
 
     for (int i = 0; i < how_many; ++i) {
       ui_test_utils::NavigateToURLWithDisposition(
-          browser, url1_, NEW_FOREGROUND_TAB,
+          browser, url1_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
           ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     }
     int tab_count = browser->tab_strip_model()->count();
@@ -179,7 +179,7 @@
     content::WindowedNotificationObserver observer(
         content::NOTIFICATION_LOAD_STOP,
         content::NotificationService::AllSources());
-    chrome::GoBack(browser, CURRENT_TAB);
+    chrome::GoBack(browser, WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
 
@@ -256,7 +256,8 @@
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(2u, active_browser_list_->size());
 
@@ -280,7 +281,8 @@
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(2u, active_browser_list_->size());
 
@@ -343,7 +345,8 @@
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(2u, active_browser_list_->size());
 
@@ -372,16 +375,17 @@
 // both. Make sure both restored tabs are in the same window.
 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreIntoSameWindow) {
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url1_, NEW_FOREGROUND_TAB,
+      browser(), url1_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   // Navigate the rightmost one to url2_ for easier identification.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(2u, active_browser_list_->size());
 
@@ -415,15 +419,16 @@
 // one by ID. Guards against regression of crbug.com/622752.
 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabFromClosedWindowByID) {
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url1_, NEW_FOREGROUND_TAB,
+      browser(), url1_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(2u, active_browser_list_->size());
 
@@ -470,7 +475,7 @@
       content::NOTIFICATION_LOAD_STOP,
       content::NotificationService::AllSources());
   service->RestoreEntryById(browser->live_tab_context(), tab_id_to_restore,
-                            NEW_FOREGROUND_TAB);
+                            WindowOpenDisposition::NEW_FOREGROUND_TAB);
   tab_added_observer.Wait();
   tab_loaded_observer.Wait();
 
@@ -491,7 +496,7 @@
 
   // Add a tab
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), http_url1, NEW_FOREGROUND_TAB,
+      browser(), http_url1, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count());
 
@@ -502,9 +507,9 @@
       content::NOTIFICATION_LOAD_STOP,
       content::NotificationService::AllSources());
   static_cast<content::WebContentsDelegate*>(browser())->OpenURLFromTab(
-      tab,
-      content::OpenURLParams(http_url2, content::Referrer(), CURRENT_TAB,
-                             ui::PAGE_TRANSITION_TYPED, false));
+      tab, content::OpenURLParams(http_url2, content::Referrer(),
+                                  WindowOpenDisposition::CURRENT_TAB,
+                                  ui::PAGE_TRANSITION_TYPED, false));
   observer.Wait();
 
   // Close the tab.
@@ -514,7 +519,7 @@
   // enabled, this will ensure that the SiteInstance used by the restored tab
   // will already exist when the restore happens.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), http_url2, NEW_FOREGROUND_TAB,
+      browser(), http_url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restore the closed tab.
@@ -551,7 +556,7 @@
 
   // Add a tab
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), http_url1, NEW_FOREGROUND_TAB,
+      browser(), http_url1, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(++tab_count, browser()->tab_strip_model()->count());
 
@@ -567,7 +572,7 @@
   // enabled, this will ensure that the SiteInstance will already exist when
   // the user clicks Back in the restored tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), http_url2, NEW_FOREGROUND_TAB,
+      browser(), http_url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Restore the closed tab.
@@ -592,17 +597,18 @@
   // Create a new window.
   size_t window_count = active_browser_list_->size();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_WINDOW,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   EXPECT_EQ(++window_count, active_browser_list_->size());
 
   // Create two more tabs, one with url1, the other url2.
   int initial_tab_count = browser()->tab_strip_model()->count();
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url1_, NEW_FOREGROUND_TAB,
+      browser(), url1_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url2_, NEW_FOREGROUND_TAB,
+      browser(), url2_, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Close the window.
@@ -644,7 +650,8 @@
 IN_PROC_BROWSER_TEST_F(TabRestoreTest, RestoreTabWithSpecialURL) {
   // Navigate new tab to a special URL.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUICreditsURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Close the tab.
@@ -671,7 +678,8 @@
 
   // Navigate new tab to a special URL.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUICreditsURL), NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUICreditsURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Then navigate to a normal URL.
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 6787db2f6..118d9c87 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -84,9 +84,9 @@
     GURL url(manage_accounts_params.continue_url.empty()
                  ? chrome::kChromeUINativeNewTabURL
                  : manage_accounts_params.continue_url);
-    web_contents->OpenURL(
-        content::OpenURLParams(url, content::Referrer(), OFF_THE_RECORD,
-                               ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false));
+    web_contents->OpenURL(content::OpenURLParams(
+        url, content::Referrer(), WindowOpenDisposition::OFF_THE_RECORD,
+        ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false));
   } else {
     signin_metrics::LogAccountReconcilorStateOnGaiaResponse(
         account_reconcilor->GetState());
diff --git a/chrome/browser/signin/easy_unlock_app_manager.cc b/chrome/browser/signin/easy_unlock_app_manager.cc
index 32a353a..22b3a149 100644
--- a/chrome/browser/signin/easy_unlock_app_manager.cc
+++ b/chrome/browser/signin/easy_unlock_app_manager.cc
@@ -89,7 +89,7 @@
 
   OpenApplication(AppLaunchParams(extension_service->profile(), extension,
                                   extensions::LAUNCH_CONTAINER_WINDOW,
-                                  NEW_WINDOW,
+                                  WindowOpenDisposition::NEW_WINDOW,
                                   extensions::SOURCE_CHROME_INTERNAL));
 }
 
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index 161e1146..cc51491 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -177,7 +177,7 @@
       "https://support.google.com/chrome/answer/1181420?";
   chrome::NavigateParams params(
       profile, GURL(kSigninErrorLearnMoreUrl), ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc b/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc
index 16508c0..359ed95 100644
--- a/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc
+++ b/chrome/browser/ssl/chrome_security_state_model_client_browser_tests.cc
@@ -853,7 +853,7 @@
   // security state is neutral while the page is loading.
   browser()->OpenURL(content::OpenURLParams(
       embedded_test_server()->GetURL("/title1.html"), content::Referrer(),
-      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   CheckSecurityInfoForNonSecure(
       browser()->tab_strip_model()->GetActiveWebContents());
 }
@@ -1086,7 +1086,7 @@
       content::NOTIFICATION_LOAD_STOP,
       content::Source<content::NavigationController>(
           &web_contents->GetController()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   back_nav_load_observer.Wait();
 
   EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATED,
diff --git a/chrome/browser/ssl/ssl_browser_tests.cc b/chrome/browser/ssl/ssl_browser_tests.cc
index 171f831..f3e01a6 100644
--- a/chrome/browser/ssl/ssl_browser_tests.cc
+++ b/chrome/browser/ssl/ssl_browser_tests.cc
@@ -1053,7 +1053,7 @@
   ProvisionalLoadWaiter load_failed_observer(tab);
 
   // Simulate user clicking on back button (crbug.com/39248).
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
 
   // Wait until we hear the load failure, and make sure we haven't changed
   // the previous RFH.  Prevents regression of http://crbug.com/82667.
@@ -1481,7 +1481,7 @@
       SSLBlockingPage::kTypeForTesting,
       tab->GetInterstitialPage()->GetDelegateForTesting()->GetTypeForTesting());
   EXPECT_TRUE(chrome::CanGoBack(browser()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
 
   dangerous_download_observer.WaitForFinished();
 }
@@ -1767,7 +1767,7 @@
 
   GURL url = https_server_.GetURL(replacement_path);
   chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_TYPED);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.tabstrip_index = 0;
   params.source_contents = tab1;
   content::WindowedNotificationObserver observer(
@@ -1809,7 +1809,7 @@
   // because we are using process-per-site in SetUpCommandLine.
   GURL url = https_server_.GetURL(replacement_path);
   chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_TYPED);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.source_contents = tab1;
   content::WindowedNotificationObserver observer(
       content::NOTIFICATION_LOAD_STOP,
@@ -2935,8 +2935,8 @@
   SSLInterstitialTimerObserver interstitial_timer_observer(contents);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), https_server_mismatched_url, CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), https_server_mismatched_url,
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   interstitial_timer_observer.WaitForTimerStarted();
 
   EXPECT_TRUE(contents->IsLoading());
@@ -3003,13 +3003,13 @@
   SSLInterstitialTimerObserver interstitial_timer_observer(contents);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), https_server_mismatched_url, CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), https_server_mismatched_url,
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   interstitial_timer_observer.WaitForTimerStarted();
 
   EXPECT_TRUE(contents->IsLoading());
   content::TestNavigationObserver observer(contents, 1);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
 
   SSLErrorHandler* ssl_error_handler =
@@ -3069,15 +3069,15 @@
   SSLInterstitialTimerObserver interstitial_timer_observer(contents);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), https_server_mismatched_url, CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), https_server_mismatched_url,
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   interstitial_timer_observer.WaitForTimerStarted();
 
   EXPECT_TRUE(contents->IsLoading());
   content::TestNavigationObserver observer(contents, 1);
-  browser()->OpenURL(content::OpenURLParams(GURL("https://google.com"),
-                                            content::Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(content::OpenURLParams(
+      GURL("https://google.com"), content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   observer.Wait();
 
   SSLErrorHandler* ssl_error_handler =
diff --git a/chrome/browser/supervised_user/supervised_user_browsertest.cc b/chrome/browser/supervised_user/supervised_user_browsertest.cc
index 5666213a..44c900d 100644
--- a/chrome/browser/supervised_user/supervised_user_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_browsertest.cc
@@ -206,7 +206,7 @@
   // Open blocked URL in a new tab.
   GURL test_url("http://www.example.com/simple.html");
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), test_url, NEW_FOREGROUND_TAB,
+      browser(), test_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Check that we got the interstitial.
diff --git a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
index 21c221f..c4c58526 100644
--- a/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
+++ b/chrome/browser/sync/test/integration/performance/sessions_sync_perf_test.cc
@@ -65,12 +65,10 @@
   for (int i = 0; i < browser->tab_strip_model()->count(); ++i) {
     chrome::SelectNumberedTab(browser, i);
     url = NextURL();
-    browser->OpenURL(
-        OpenURLParams(url,
-        content::Referrer(GURL("http://localhost"),
-                          blink::WebReferrerPolicyDefault),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_LINK, false));
+    browser->OpenURL(OpenURLParams(
+        url, content::Referrer(GURL("http://localhost"),
+                               blink::WebReferrerPolicyDefault),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_LINK, false));
     urls.push_back(url);
   }
   WaitForTabsToLoad(profile, urls);
diff --git a/chrome/browser/tab_contents/view_source_browsertest.cc b/chrome/browser/tab_contents/view_source_browsertest.cc
index b4740b5e..89e2bf4 100644
--- a/chrome/browser/tab_contents/view_source_browsertest.cc
+++ b/chrome/browser/tab_contents/view_source_browsertest.cc
@@ -168,7 +168,7 @@
   {
     ui_test_utils::UrlLoadObserver load_complete(
         url_viewsource, content::NotificationService::AllSources());
-    chrome::GoBack(browser(), CURRENT_TAB);
+    chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
     load_complete.Wait();
   }
 
diff --git a/chrome/browser/task_manager/task_manager_browsertest.cc b/chrome/browser/task_manager/task_manager_browsertest.cc
index 926845ff..c930334 100644
--- a/chrome/browser/task_manager/task_manager_browsertest.cc
+++ b/chrome/browser/task_manager/task_manager_browsertest.cc
@@ -246,7 +246,7 @@
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyTab()));
 
   // Tab should reappear in task manager upon reload.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchTab("title1.html")));
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(2, MatchAnyTab()));
 }
@@ -299,7 +299,8 @@
   // Now navigate this tab to a different site. This should wind up in a
   // different renderer process, so it should complete and show up in the task
   // manager.
-  tab2->OpenURL(content::OpenURLParams(url3, content::Referrer(), CURRENT_TAB,
+  tab2->OpenURL(content::OpenURLParams(url3, content::Referrer(),
+                                       WindowOpenDisposition::CURRENT_TAB,
                                        ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchTab("iframe test")));
@@ -699,9 +700,7 @@
       WaitForTaskManagerRows(1, MatchUtility(proxy_resolver_name)));
 }
 
-// TODO(crbug.com/642482): Disabled flaky test.
-IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
-                       DISABLED_DevToolsNewDockedWindow) {
+IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, DevToolsNewDockedWindow) {
   ShowTaskManager();  // Task manager shown BEFORE dev tools window.
 
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyTab()));
@@ -712,9 +711,7 @@
   DevToolsWindowTesting::CloseDevToolsWindowSync(devtools);
 }
 
-// TODO(crbug.com/642482): Disabled flaky test.
-IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest,
-                       DISABLED_DevToolsNewUndockedWindow) {
+IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, DevToolsNewUndockedWindow) {
   ShowTaskManager();  // Task manager shown BEFORE dev tools window.
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchAnyTab()));
   DevToolsWindow* devtools =
@@ -748,7 +745,7 @@
   GURL main_url(embedded_test_server()->GetURL(
       "/cross-site/a.com/iframe_cross_site.html"));
   browser()->OpenURL(content::OpenURLParams(main_url, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
@@ -804,7 +801,7 @@
   GURL a_dotcom(embedded_test_server()->GetURL(
       "/cross-site/a.com/iframe_cross_site.html"));
   browser()->OpenURL(content::OpenURLParams(a_dotcom, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
@@ -827,7 +824,7 @@
       embedded_test_server()->GetURL("/cross-site/b.com/iframe.html"));
 
   browser()->OpenURL(content::OpenURLParams(b_dotcom, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchTab("iframe test")));
@@ -850,7 +847,7 @@
       embedded_test_server()->GetURL("/cross-site/b.com/iframe.html"));
 
   browser()->OpenURL(content::OpenURLParams(b_dotcom, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(1, MatchTab("iframe test")));
@@ -862,7 +859,7 @@
   GURL a_dotcom(embedded_test_server()->GetURL(
       "/cross-site/a.com/iframe_cross_site.html"));
   browser()->OpenURL(content::OpenURLParams(a_dotcom, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
@@ -904,7 +901,7 @@
   GURL a_dotcom(embedded_test_server()->GetURL(
       "/cross-site/a.com/iframe_cross_site.html"));
   browser()->OpenURL(content::OpenURLParams(a_dotcom, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
@@ -963,9 +960,9 @@
   // Navigate the tab to a page on a.com with cross-process subframes.
   GURL a_dotcom_with_iframes(embedded_test_server()->GetURL(
       "/cross-site/a.com/iframe_cross_site.html"));
-  browser()->OpenURL(content::OpenURLParams(a_dotcom_with_iframes,
-                                            content::Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(content::OpenURLParams(
+      a_dotcom_with_iframes, content::Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
       WaitForTaskManagerRows(1, MatchTab("cross-site iframe test")));
@@ -985,9 +982,9 @@
   // the subframe processes should disappear.
   GURL a_dotcom_simple(
       embedded_test_server()->GetURL("/cross-site/a.com/title2.html"));
-  browser()->OpenURL(content::OpenURLParams(a_dotcom_simple,
-                                            content::Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(content::OpenURLParams(
+      a_dotcom_simple, content::Referrer(), WindowOpenDisposition::CURRENT_TAB,
+      ui::PAGE_TRANSITION_TYPED, false));
   ASSERT_NO_FATAL_FAILURE(
       WaitForTaskManagerRows(1, MatchTab("Title Of Awesomeness")));
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows(0, MatchAnySubframe()));
@@ -1006,7 +1003,7 @@
   GURL a_with_frames(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b,b,c(d,a,b,c))"));
   browser()->OpenURL(content::OpenURLParams(a_with_frames, content::Referrer(),
-                                            CURRENT_TAB,
+                                            WindowOpenDisposition::CURRENT_TAB,
                                             ui::PAGE_TRANSITION_TYPED, false));
 
   if (ShouldExpectSubframes()) {
@@ -1034,9 +1031,10 @@
   // Opening a new tab should appear below the existing tab.
   GURL other_tab_url(embedded_test_server()->GetURL(
       "d.com", "/cross_site_iframe_factory.html?d(a(c(b)))"));
-  browser()->OpenURL(content::OpenURLParams(other_tab_url, content::Referrer(),
-                                            NEW_FOREGROUND_TAB,
-                                            ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(
+      content::OpenURLParams(other_tab_url, content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_TYPED, false));
 
   ASSERT_NO_FATAL_FAILURE(
       WaitForTaskManagerRows(2, MatchTab("Cross-site iframe factory")));
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index a5d89a4..ee7e192 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -9,11 +9,6 @@
 import("//chrome/common/features.gni")
 import("//media/media_options.gni")
 
-gypi_values = exec_script("//build/gypi_to_gn.py",
-                          [ rebase_path("../../chrome_browser_ui.gypi") ],
-                          "scope",
-                          [ "../../chrome_browser_ui.gypi" ])
-
 config("ui_warnings") {
   if (is_clang) {
     # TODO(thakis): Remove this once http://crbug.com/383820 is figured out
@@ -32,12 +27,401 @@
     split_count = 1
   }
 
-  sources = rebase_path(gypi_values.chrome_browser_ui_non_ios_sources,
-                        ".",
-                        "//chrome")
-  sources += rebase_path(gypi_values.chrome_browser_ui_toolbar_model_sources,
-                         ".",
-                         "//chrome")
+  sources = [
+    "accelerator_utils.h",
+    "android/android_about_app_info.cc",
+    "android/android_about_app_info.h",
+    "android/external_protocol_dialog_android.cc",
+    "android/status_tray_android.cc",
+    "app_list/app_list_util.cc",
+    "app_list/app_list_util.h",
+
+    # All other browser/ui/app_list files go under enable_app_list below.
+    "autofill/autofill_dialog_models.cc",
+    "autofill/autofill_dialog_models.h",
+    "autofill/autofill_popup_controller.h",
+    "autofill/autofill_popup_controller_impl.cc",
+    "autofill/autofill_popup_controller_impl.h",
+    "autofill/autofill_popup_layout_model.cc",
+    "autofill/autofill_popup_layout_model.h",
+    "autofill/autofill_popup_view.h",
+    "autofill/autofill_popup_view_delegate.h",
+    "autofill/chrome_autofill_client.cc",
+    "autofill/chrome_autofill_client.h",
+    "autofill/country_combobox_model.cc",
+    "autofill/country_combobox_model.h",
+    "autofill/create_card_unmask_prompt_view.h",
+    "autofill/credit_card_scanner_controller.cc",
+    "autofill/credit_card_scanner_controller.h",
+    "autofill/credit_card_scanner_view.cc",
+    "autofill/credit_card_scanner_view.h",
+    "autofill/credit_card_scanner_view_delegate.h",
+    "autofill/password_generation_popup_controller.h",
+    "autofill/password_generation_popup_controller_impl.cc",
+    "autofill/password_generation_popup_controller_impl.h",
+    "autofill/password_generation_popup_observer.h",
+    "autofill/password_generation_popup_view.cc",
+    "autofill/password_generation_popup_view.h",
+    "autofill/popup_controller_common.cc",
+    "autofill/popup_controller_common.h",
+    "autofill/popup_view_common.cc",
+    "autofill/popup_view_common.h",
+    "blocked_content/blocked_window_params.cc",
+    "blocked_content/blocked_window_params.h",
+    "blocked_content/popup_blocker_tab_helper.cc",
+    "blocked_content/popup_blocker_tab_helper.h",
+    "bookmarks/bookmark_bar.h",
+    "bookmarks/bookmark_bar_constants.h",
+    "bookmarks/bookmark_bar_instructions_delegate.h",
+    "bookmarks/bookmark_bubble_observer.h",
+    "bookmarks/bookmark_editor.cc",
+    "bookmarks/bookmark_editor.h",
+    "bookmarks/bookmark_utils.cc",
+    "bookmarks/bookmark_utils.h",
+    "bookmarks/recently_used_folders_combo_model.cc",
+    "bookmarks/recently_used_folders_combo_model.h",
+    "browser_commands_chromeos.cc",
+    "browser_commands_chromeos.h",
+    "browser_commands_mac.cc",
+    "browser_commands_mac.h",
+    "browser_dialogs.h",
+    "browser_mac.cc",
+    "browser_mac.h",
+    "browser_navigator_params.cc",
+    "browser_navigator_params.h",
+    "browser_ui_prefs.cc",
+    "browser_ui_prefs.h",
+    "chrome_select_file_policy.cc",
+    "chrome_select_file_policy.h",
+    "confirm_bubble.h",
+    "crypto_module_password_dialog.h",
+    "find_bar/find_bar.h",
+    "find_bar/find_bar_state.h",
+    "find_bar/find_bar_state_factory.cc",
+    "find_bar/find_bar_state_factory.h",
+    "find_bar/find_notification_details.h",
+    "find_bar/find_tab_helper.cc",
+    "find_bar/find_tab_helper.h",
+    "javascript_dialogs/chrome_javascript_native_dialog_factory.h",
+    "login/login_handler.cc",
+    "login/login_handler.h",
+    "login/login_interstitial_delegate.cc",
+    "login/login_interstitial_delegate.h",
+    "media_utils.cc",
+    "media_utils.h",
+    "navigation_correction_tab_observer.cc",
+    "navigation_correction_tab_observer.h",
+    "passwords/account_avatar_fetcher.cc",
+    "passwords/account_avatar_fetcher.h",
+    "passwords/manage_passwords_state.cc",
+    "passwords/manage_passwords_state.h",
+    "passwords/manage_passwords_view_utils.cc",
+    "passwords/manage_passwords_view_utils.h",
+    "passwords/password_manager_presenter.cc",
+    "passwords/password_manager_presenter.h",
+    "passwords/password_ui_view.h",
+    "platform_keys_certificate_selector_chromeos.h",
+    "prefs/prefs_tab_helper.cc",
+    "prefs/prefs_tab_helper.h",
+    "process_singleton_dialog_linux.h",
+    "profile_chooser_constants.h",
+    "profile_error_dialog.cc",
+    "profile_error_dialog.h",
+    "protocol_dialog_delegate.h",
+    "proximity_auth/proximity_auth_error_bubble.h",
+    "screen_capture_notification_ui.h",
+    "search/instant_search_prerenderer.cc",
+    "search/instant_search_prerenderer.h",
+    "search/instant_tab.cc",
+    "search/instant_tab.h",
+    "search/new_tab_page_interceptor_service.cc",
+    "search/new_tab_page_interceptor_service.h",
+    "search/new_tab_page_interceptor_service_factory.cc",
+    "search/new_tab_page_interceptor_service_factory.h",
+    "search/search_ipc_router.cc",
+    "search/search_ipc_router.h",
+    "search/search_ipc_router_policy_impl.cc",
+    "search/search_ipc_router_policy_impl.h",
+    "search/search_model.cc",
+    "search/search_model.h",
+    "search/search_model_observer.h",
+    "search/search_tab_helper.cc",
+    "search/search_tab_helper.h",
+    "search/search_tab_helper_delegate.cc",
+    "search/search_tab_helper_delegate.h",
+    "search_engines/edit_search_engine_controller.cc",
+    "search_engines/edit_search_engine_controller.h",
+    "search_engines/keyword_editor_controller.cc",
+    "search_engines/keyword_editor_controller.h",
+    "search_engines/search_engine_tab_helper.cc",
+    "search_engines/search_engine_tab_helper.h",
+    "search_engines/template_url_table_model.cc",
+    "search_engines/template_url_table_model.h",
+    "session_crashed_bubble.h",
+    "simple_message_box.h",
+    "simple_message_box_internal.cc",
+    "simple_message_box_internal.h",
+    "status_bubble.h",
+    "sync/bubble_sync_promo_delegate.h",
+    "sync/profile_signin_confirmation_helper.cc",
+    "sync/profile_signin_confirmation_helper.h",
+    "sync/tab_contents_synced_tab_delegate.cc",
+    "sync/tab_contents_synced_tab_delegate.h",
+    "tab_contents/chrome_web_contents_view_delegate.h",
+    "tab_contents/core_tab_helper.cc",
+    "tab_contents/core_tab_helper.h",
+    "tab_contents/core_tab_helper_delegate.cc",
+    "tab_contents/core_tab_helper_delegate.h",
+    "tab_dialogs.cc",
+    "tab_dialogs.h",
+    "tab_helpers.cc",
+    "tab_helpers.h",
+    "tab_modal_confirm_dialog.h",
+    "toolbar/chrome_toolbar_model_delegate.cc",
+    "toolbar/chrome_toolbar_model_delegate.h",
+    "translate/language_combobox_model.cc",
+    "translate/language_combobox_model.h",
+    "translate/translate_bubble_model.h",
+    "translate/translate_bubble_model_impl.cc",
+    "translate/translate_bubble_model_impl.h",
+    "translate/translate_bubble_view_state_transition.cc",
+    "translate/translate_bubble_view_state_transition.h",
+    "uninstall_browser_prompt.h",
+    "validation_message_bubble.h",
+    "view_ids.h",
+    "views/platform_keys_certificate_selector_chromeos.cc",
+    "views/platform_keys_certificate_selector_chromeos.h",
+    "web_contents_sizer.h",
+    "website_settings/website_settings.cc",
+    "website_settings/website_settings.h",
+    "website_settings/website_settings_ui.cc",
+    "website_settings/website_settings_ui.h",
+    "webui/about_ui.cc",
+    "webui/about_ui.h",
+    "webui/browsing_history_handler.cc",
+    "webui/browsing_history_handler.h",
+    "webui/chrome_web_ui_controller_factory.cc",
+    "webui/chrome_web_ui_controller_factory.h",
+    "webui/chromeos/bluetooth_pairing_ui.cc",
+    "webui/chromeos/bluetooth_pairing_ui.h",
+    "webui/chromeos/certificate_manager_dialog_ui.cc",
+    "webui/chromeos/certificate_manager_dialog_ui.h",
+    "webui/chromeos/choose_mobile_network_ui.cc",
+    "webui/chromeos/choose_mobile_network_ui.h",
+    "webui/chromeos/cryptohome_ui.cc",
+    "webui/chromeos/cryptohome_ui.h",
+    "webui/chromeos/cryptohome_web_ui_handler.cc",
+    "webui/chromeos/cryptohome_web_ui_handler.h",
+    "webui/chromeos/drive_internals_ui.cc",
+    "webui/chromeos/drive_internals_ui.h",
+    "webui/chromeos/first_run/first_run_actor.cc",
+    "webui/chromeos/first_run/first_run_actor.h",
+    "webui/chromeos/first_run/first_run_handler.cc",
+    "webui/chromeos/first_run/first_run_handler.h",
+    "webui/chromeos/first_run/first_run_ui.cc",
+    "webui/chromeos/first_run/first_run_ui.h",
+    "webui/chromeos/image_source.cc",
+    "webui/chromeos/image_source.h",
+    "webui/chromeos/keyboard_overlay_ui.cc",
+    "webui/chromeos/keyboard_overlay_ui.h",
+    "webui/chromeos/login/app_launch_splash_screen_handler.cc",
+    "webui/chromeos/login/app_launch_splash_screen_handler.h",
+    "webui/chromeos/login/authenticated_user_email_retriever.cc",
+    "webui/chromeos/login/authenticated_user_email_retriever.h",
+    "webui/chromeos/login/auto_enrollment_check_screen_handler.cc",
+    "webui/chromeos/login/auto_enrollment_check_screen_handler.h",
+    "webui/chromeos/login/base_screen_handler.cc",
+    "webui/chromeos/login/base_screen_handler.h",
+    "webui/chromeos/login/controller_pairing_screen_handler.cc",
+    "webui/chromeos/login/controller_pairing_screen_handler.h",
+    "webui/chromeos/login/core_oobe_handler.cc",
+    "webui/chromeos/login/core_oobe_handler.h",
+    "webui/chromeos/login/demo_mode_detector.cc",
+    "webui/chromeos/login/demo_mode_detector.h",
+    "webui/chromeos/login/device_disabled_screen_handler.cc",
+    "webui/chromeos/login/device_disabled_screen_handler.h",
+    "webui/chromeos/login/enable_debugging_screen_handler.cc",
+    "webui/chromeos/login/enable_debugging_screen_handler.h",
+    "webui/chromeos/login/enrollment_screen_handler.cc",
+    "webui/chromeos/login/enrollment_screen_handler.h",
+    "webui/chromeos/login/error_screen_handler.cc",
+    "webui/chromeos/login/error_screen_handler.h",
+    "webui/chromeos/login/eula_screen_handler.cc",
+    "webui/chromeos/login/eula_screen_handler.h",
+    "webui/chromeos/login/gaia_screen_handler.cc",
+    "webui/chromeos/login/gaia_screen_handler.h",
+    "webui/chromeos/login/hid_detection_screen_handler.cc",
+    "webui/chromeos/login/hid_detection_screen_handler.h",
+    "webui/chromeos/login/host_pairing_screen_handler.cc",
+    "webui/chromeos/login/host_pairing_screen_handler.h",
+    "webui/chromeos/login/kiosk_app_menu_handler.cc",
+    "webui/chromeos/login/kiosk_app_menu_handler.h",
+    "webui/chromeos/login/kiosk_autolaunch_screen_handler.cc",
+    "webui/chromeos/login/kiosk_autolaunch_screen_handler.h",
+    "webui/chromeos/login/kiosk_enable_screen_handler.cc",
+    "webui/chromeos/login/kiosk_enable_screen_handler.h",
+    "webui/chromeos/login/l10n_util.cc",
+    "webui/chromeos/login/l10n_util.h",
+    "webui/chromeos/login/network_dropdown.cc",
+    "webui/chromeos/login/network_dropdown.h",
+    "webui/chromeos/login/network_dropdown_handler.cc",
+    "webui/chromeos/login/network_dropdown_handler.h",
+    "webui/chromeos/login/network_screen_handler.cc",
+    "webui/chromeos/login/network_screen_handler.h",
+    "webui/chromeos/login/network_state_informer.cc",
+    "webui/chromeos/login/network_state_informer.h",
+    "webui/chromeos/login/oobe_screen.cc",
+    "webui/chromeos/login/oobe_screen.h",
+    "webui/chromeos/login/oobe_ui.cc",
+    "webui/chromeos/login/oobe_ui.h",
+    "webui/chromeos/login/reset_screen_handler.cc",
+    "webui/chromeos/login/reset_screen_handler.h",
+    "webui/chromeos/login/screenlock_icon_provider.cc",
+    "webui/chromeos/login/screenlock_icon_provider.h",
+    "webui/chromeos/login/screenlock_icon_source.cc",
+    "webui/chromeos/login/screenlock_icon_source.h",
+    "webui/chromeos/login/signin_screen_handler.cc",
+    "webui/chromeos/login/signin_screen_handler.h",
+    "webui/chromeos/login/supervised_user_creation_screen_handler.cc",
+    "webui/chromeos/login/supervised_user_creation_screen_handler.h",
+    "webui/chromeos/login/terms_of_service_screen_handler.cc",
+    "webui/chromeos/login/terms_of_service_screen_handler.h",
+    "webui/chromeos/login/update_screen_handler.cc",
+    "webui/chromeos/login/update_screen_handler.h",
+    "webui/chromeos/login/user_board_screen_handler.cc",
+    "webui/chromeos/login/user_board_screen_handler.h",
+    "webui/chromeos/login/user_image_screen_handler.cc",
+    "webui/chromeos/login/user_image_screen_handler.h",
+    "webui/chromeos/login/wrong_hwid_screen_handler.cc",
+    "webui/chromeos/login/wrong_hwid_screen_handler.h",
+    "webui/chromeos/mobile_setup_dialog.cc",
+    "webui/chromeos/mobile_setup_dialog.h",
+    "webui/chromeos/mobile_setup_ui.cc",
+    "webui/chromeos/mobile_setup_ui.h",
+    "webui/chromeos/network_ui.cc",
+    "webui/chromeos/network_ui.h",
+    "webui/chromeos/power_ui.cc",
+    "webui/chromeos/power_ui.h",
+    "webui/chromeos/proxy_settings_ui.cc",
+    "webui/chromeos/proxy_settings_ui.h",
+    "webui/chromeos/set_time_ui.cc",
+    "webui/chromeos/set_time_ui.h",
+    "webui/chromeos/sim_unlock_ui.cc",
+    "webui/chromeos/sim_unlock_ui.h",
+    "webui/chromeos/slow_trace_ui.cc",
+    "webui/chromeos/slow_trace_ui.h",
+    "webui/chromeos/slow_ui.cc",
+    "webui/chromeos/slow_ui.h",
+    "webui/chromeos/touch_view_controller_delegate.cc",
+    "webui/chromeos/touch_view_controller_delegate.h",
+    "webui/chromeos/ui_account_tweaks.cc",
+    "webui/chromeos/ui_account_tweaks.h",
+    "webui/components_ui.cc",
+    "webui/components_ui.h",
+    "webui/constrained_web_dialog_ui.cc",
+    "webui/constrained_web_dialog_ui.h",
+    "webui/cookies_tree_model_util.cc",
+    "webui/cookies_tree_model_util.h",
+    "webui/crashes_ui.cc",
+    "webui/crashes_ui.h",
+    "webui/device_log_ui.cc",
+    "webui/device_log_ui.h",
+    "webui/domain_reliability_internals_ui.cc",
+    "webui/domain_reliability_internals_ui.h",
+    "webui/engagement/site_engagement_ui.cc",
+    "webui/engagement/site_engagement_ui.h",
+    "webui/fallback_icon_source.cc",
+    "webui/fallback_icon_source.h",
+    "webui/favicon_source.cc",
+    "webui/favicon_source.h",
+    "webui/fileicon_source.cc",
+    "webui/fileicon_source.h",
+    "webui/flags_ui.cc",
+    "webui/flags_ui.h",
+    "webui/gcm_internals_ui.cc",
+    "webui/gcm_internals_ui.h",
+    "webui/history_ui.cc",
+    "webui/history_ui.h",
+    "webui/instant_ui.cc",
+    "webui/instant_ui.h",
+    "webui/interstitials/interstitial_ui.cc",
+    "webui/interstitials/interstitial_ui.h",
+    "webui/invalidations_message_handler.cc",
+    "webui/invalidations_message_handler.h",
+    "webui/invalidations_ui.cc",
+    "webui/invalidations_ui.h",
+    "webui/large_icon_source.cc",
+    "webui/large_icon_source.h",
+    "webui/local_state/local_state_ui.cc",
+    "webui/local_state/local_state_ui.h",
+    "webui/log_web_ui_url.cc",
+    "webui/log_web_ui_url.h",
+    "webui/metrics_handler.cc",
+    "webui/metrics_handler.h",
+    "webui/mojo_web_ui_controller.cc",
+    "webui/mojo_web_ui_controller.h",
+    "webui/mojo_web_ui_handler.h",
+    "webui/net_export_ui.cc",
+    "webui/net_export_ui.h",
+    "webui/net_internals/net_internals_ui.cc",
+    "webui/net_internals/net_internals_ui.h",
+    "webui/ntp/ntp_user_data_logger.cc",
+    "webui/ntp/ntp_user_data_logger.h",
+    "webui/omnibox/omnibox_page_handler.cc",
+    "webui/omnibox/omnibox_page_handler.h",
+    "webui/omnibox/omnibox_ui.cc",
+    "webui/omnibox/omnibox_ui.h",
+    "webui/password_manager_internals/password_manager_internals_ui.cc",
+    "webui/password_manager_internals/password_manager_internals_ui.h",
+    "webui/policy_material_design_ui.cc",
+    "webui/policy_material_design_ui.h",
+    "webui/policy_ui.cc",
+    "webui/policy_ui.h",
+    "webui/policy_ui_handler.cc",
+    "webui/policy_ui_handler.h",
+    "webui/predictors/predictors_handler.cc",
+    "webui/predictors/predictors_handler.h",
+    "webui/predictors/predictors_ui.cc",
+    "webui/predictors/predictors_ui.h",
+    "webui/profiler_ui.cc",
+    "webui/profiler_ui.h",
+    "webui/signin_internals_ui.cc",
+    "webui/signin_internals_ui.h",
+    "webui/supervised_user_internals_message_handler.cc",
+    "webui/supervised_user_internals_message_handler.h",
+    "webui/supervised_user_internals_ui.cc",
+    "webui/supervised_user_internals_ui.h",
+    "webui/sync_internals_message_handler.cc",
+    "webui/sync_internals_message_handler.h",
+    "webui/sync_internals_ui.cc",
+    "webui/sync_internals_ui.h",
+    "webui/test_files_request_filter.cc",
+    "webui/test_files_request_filter.h",
+    "webui/translate_internals/translate_internals_handler.cc",
+    "webui/translate_internals/translate_internals_handler.h",
+    "webui/translate_internals/translate_internals_ui.cc",
+    "webui/translate_internals/translate_internals_ui.h",
+    "webui/usb_internals/usb_internals_page_handler.cc",
+    "webui/usb_internals/usb_internals_page_handler.h",
+    "webui/usb_internals/usb_internals_ui.cc",
+    "webui/usb_internals/usb_internals_ui.h",
+    "webui/user_actions/user_actions_ui.cc",
+    "webui/user_actions/user_actions_ui.h",
+    "webui/user_actions/user_actions_ui_handler.cc",
+    "webui/user_actions/user_actions_ui_handler.h",
+    "webui/version_handler.cc",
+    "webui/version_handler.h",
+    "webui/version_handler_chromeos.cc",
+    "webui/version_handler_chromeos.h",
+    "webui/version_ui.cc",
+    "webui/version_ui.h",
+    "window_sizer/window_sizer_mac.mm",
+    "zoom/chrome_zoom_level_otr_delegate.cc",
+    "zoom/chrome_zoom_level_otr_delegate.h",
+    "zoom/chrome_zoom_level_prefs.cc",
+    "zoom/chrome_zoom_level_prefs.h",
+  ]
+
   defines = []
   libs = []
 
@@ -222,13 +606,531 @@
   }
 
   if (!android_java_ui) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_non_mobile_sources,
-                           ".",
-                           "//chrome")
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_omnibox_non_mobile_sources,
-                    ".",
-                    "//chrome")
+    sources += [
+      "apps/app_info_dialog.h",
+      "apps/chrome_app_delegate.cc",
+      "apps/chrome_app_delegate.h",
+      "apps/chrome_app_window_client.cc",
+      "apps/chrome_app_window_client.h",
+      "apps/directory_access_confirmation_dialog.cc",
+      "apps/directory_access_confirmation_dialog.h",
+      "blocked_content/app_modal_dialog_helper.cc",
+      "blocked_content/app_modal_dialog_helper.h",
+      "bluetooth/bluetooth_chooser_controller.cc",
+      "bluetooth/bluetooth_chooser_controller.h",
+      "bluetooth/bluetooth_chooser_desktop.cc",
+      "bluetooth/bluetooth_chooser_desktop.h",
+      "bluetooth/chrome_extension_bluetooth_chooser.cc",
+      "bluetooth/chrome_extension_bluetooth_chooser.h",
+      "bookmarks/bookmark_bubble_sign_in_delegate.cc",
+      "bookmarks/bookmark_bubble_sign_in_delegate.h",
+      "bookmarks/bookmark_context_menu_controller.cc",
+      "bookmarks/bookmark_context_menu_controller.h",
+      "bookmarks/bookmark_drag_drop.cc",
+      "bookmarks/bookmark_drag_drop.h",
+      "bookmarks/bookmark_tab_helper.cc",
+      "bookmarks/bookmark_tab_helper.h",
+      "bookmarks/bookmark_tab_helper_delegate.cc",
+      "bookmarks/bookmark_tab_helper_delegate.h",
+      "bookmarks/bookmark_utils_desktop.cc",
+      "bookmarks/bookmark_utils_desktop.h",
+      "bookmarks/enhanced_bookmark_key_service.cc",
+      "bookmarks/enhanced_bookmark_key_service.h",
+      "bookmarks/enhanced_bookmark_key_service_factory.cc",
+      "bookmarks/enhanced_bookmark_key_service_factory.h",
+      "browser.cc",
+      "browser.h",
+      "browser_command_controller.cc",
+      "browser_command_controller.h",
+      "browser_commands.cc",
+      "browser_commands.h",
+      "browser_content_setting_bubble_model_delegate.cc",
+      "browser_content_setting_bubble_model_delegate.h",
+      "browser_finder.cc",
+      "browser_finder.h",
+      "browser_instant_controller.cc",
+      "browser_instant_controller.h",
+      "browser_list.cc",
+      "browser_list.h",
+      "browser_live_tab_context.cc",
+      "browser_live_tab_context.h",
+      "browser_navigator.cc",
+      "browser_navigator.h",
+      "browser_otr_state.cc",
+      "browser_otr_state.h",
+      "browser_tab_restorer.cc",
+      "browser_tab_strip_model_delegate.cc",
+      "browser_tab_strip_model_delegate.h",
+      "browser_tab_strip_tracker.cc",
+      "browser_tab_strip_tracker.h",
+      "browser_tab_strip_tracker_delegate.h",
+      "browser_tabrestore.cc",
+      "browser_tabrestore.h",
+      "browser_tabstrip.cc",
+      "browser_tabstrip.h",
+      "browser_toolbar_model_delegate.cc",
+      "browser_toolbar_model_delegate.h",
+      "browser_view_prefs.cc",
+      "browser_view_prefs.h",
+      "browser_window_state.cc",
+      "browser_window_state.h",
+      "chrome_bubble_manager.cc",
+      "chrome_bubble_manager.h",
+      "chrome_pages.cc",
+      "chrome_pages.h",
+      "chrome_web_modal_dialog_manager_delegate.cc",
+      "chrome_web_modal_dialog_manager_delegate.h",
+      "collected_cookies_infobar_delegate.cc",
+      "collected_cookies_infobar_delegate.h",
+      "confirm_bubble_model.cc",
+      "confirm_bubble_model.h",
+      "content_settings/content_setting_bubble_model.cc",
+      "content_settings/content_setting_bubble_model.h",
+      "content_settings/content_setting_bubble_model_delegate.h",
+      "content_settings/content_setting_image_model.cc",
+      "content_settings/content_setting_image_model.h",
+      "exclusive_access/exclusive_access_bubble.cc",
+      "exclusive_access/exclusive_access_bubble.h",
+      "exclusive_access/exclusive_access_bubble_type.cc",
+      "exclusive_access/exclusive_access_bubble_type.h",
+      "exclusive_access/exclusive_access_context.cc",
+      "exclusive_access/exclusive_access_context.h",
+      "exclusive_access/exclusive_access_controller_base.cc",
+      "exclusive_access/exclusive_access_controller_base.h",
+      "exclusive_access/exclusive_access_manager.cc",
+      "exclusive_access/exclusive_access_manager.h",
+      "exclusive_access/fullscreen_controller.cc",
+      "exclusive_access/fullscreen_controller.h",
+      "exclusive_access/fullscreen_within_tab_helper.cc",
+      "exclusive_access/fullscreen_within_tab_helper.h",
+      "exclusive_access/mouse_lock_controller.cc",
+      "exclusive_access/mouse_lock_controller.h",
+      "fast_unload_controller.cc",
+      "fast_unload_controller.h",
+      "find_bar/find_bar_controller.cc",
+      "find_bar/find_bar_controller.h",
+      "global_error/global_error.cc",
+      "global_error/global_error.h",
+      "global_error/global_error_bubble_view_base.h",
+      "global_error/global_error_service.cc",
+      "global_error/global_error_service.h",
+      "global_error/global_error_service_factory.cc",
+      "global_error/global_error_service_factory.h",
+      "infobar_container_delegate.cc",
+      "infobar_container_delegate.h",
+      "layout_constants.cc",
+      "layout_constants.h",
+      "location_bar/location_bar.cc",
+      "location_bar/location_bar.h",
+      "location_bar/location_bar_util.cc",
+      "location_bar/location_bar_util.h",
+      "native_window_tracker.h",
+      "omnibox/alternate_nav_infobar_delegate.cc",
+      "omnibox/alternate_nav_infobar_delegate.h",
+      "omnibox/chrome_omnibox_client.cc",
+      "omnibox/chrome_omnibox_client.h",
+      "omnibox/chrome_omnibox_edit_controller.cc",
+      "omnibox/chrome_omnibox_edit_controller.h",
+      "omnibox/chrome_omnibox_navigation_observer.cc",
+      "omnibox/chrome_omnibox_navigation_observer.h",
+      "omnibox/clipboard_utils.cc",
+      "omnibox/clipboard_utils.h",
+      "passwords/manage_passwords_bubble_model.cc",
+      "passwords/manage_passwords_bubble_model.h",
+      "passwords/manage_passwords_icon_view.h",
+      "passwords/manage_passwords_ui_controller.cc",
+      "passwords/manage_passwords_ui_controller.h",
+      "passwords/manage_passwords_view_utils_desktop.cc",
+      "passwords/manage_passwords_view_utils_desktop.h",
+      "passwords/password_dialog_controller.h",
+      "passwords/password_dialog_controller_impl.cc",
+      "passwords/password_dialog_controller_impl.h",
+      "passwords/password_dialog_prompts.h",
+      "passwords/passwords_client_ui_delegate.cc",
+      "passwords/passwords_client_ui_delegate.h",
+      "passwords/passwords_model_delegate.cc",
+      "passwords/passwords_model_delegate.h",
+      "pdf/adobe_reader_info_win.cc",
+      "pdf/adobe_reader_info_win.h",
+      "pdf/chrome_pdf_web_contents_helper_client.cc",
+      "pdf/chrome_pdf_web_contents_helper_client.h",
+      "pdf/pdf_unsupported_feature.cc",
+      "pdf/pdf_unsupported_feature.h",
+      "sad_tab.cc",
+      "sad_tab.h",
+      "sad_tab_helper.cc",
+      "sad_tab_helper.h",
+      "sad_tab_types.h",
+      "scoped_tabbed_browser_displayer.cc",
+      "scoped_tabbed_browser_displayer.h",
+      "search/instant_controller.cc",
+      "search/instant_controller.h",
+      "search/search_delegate.cc",
+      "search/search_delegate.h",
+      "settings_window_manager.cc",
+      "settings_window_manager.h",
+      "settings_window_manager_observer.h",
+      "signin_view_controller.cc",
+      "signin_view_controller.h",
+      "signin_view_controller_delegate.cc",
+      "signin_view_controller_delegate.h",
+      "singleton_tabs.cc",
+      "singleton_tabs.h",
+      "startup/bad_flags_prompt.cc",
+      "startup/bad_flags_prompt.h",
+      "startup/google_api_keys_infobar_delegate.cc",
+      "startup/google_api_keys_infobar_delegate.h",
+      "startup/obsolete_system_infobar_delegate.cc",
+      "startup/obsolete_system_infobar_delegate.h",
+      "startup/session_crashed_infobar_delegate.cc",
+      "startup/session_crashed_infobar_delegate.h",
+      "startup/startup_browser_creator.cc",
+      "startup/startup_browser_creator.h",
+      "startup/startup_browser_creator_impl.cc",
+      "startup/startup_browser_creator_impl.h",
+      "startup/startup_tab.cc",
+      "startup/startup_tab.h",
+      "startup/startup_types.h",
+      "sync/browser_synced_window_delegate.cc",
+      "sync/browser_synced_window_delegate.h",
+      "sync/browser_synced_window_delegates_getter.cc",
+      "sync/browser_synced_window_delegates_getter.h",
+      "sync/sync_promo_ui.cc",
+      "sync/sync_promo_ui.h",
+      "tab_contents/tab_contents_iterator.cc",
+      "tab_contents/tab_contents_iterator.h",
+      "tab_modal_confirm_dialog_delegate.cc",
+      "tab_modal_confirm_dialog_delegate.h",
+      "tabs/hover_tab_selector.cc",
+      "tabs/hover_tab_selector.h",
+      "tabs/pinned_tab_codec.cc",
+      "tabs/pinned_tab_codec.h",
+      "tabs/pinned_tab_service.cc",
+      "tabs/pinned_tab_service.h",
+      "tabs/pinned_tab_service_factory.cc",
+      "tabs/pinned_tab_service_factory.h",
+      "tabs/tab_menu_model.cc",
+      "tabs/tab_menu_model.h",
+      "tabs/tab_strip_model.cc",
+      "tabs/tab_strip_model.h",
+      "tabs/tab_strip_model_delegate.h",
+      "tabs/tab_strip_model_observer.cc",
+      "tabs/tab_strip_model_observer.h",
+      "tabs/tab_strip_model_order_controller.cc",
+      "tabs/tab_strip_model_order_controller.h",
+      "tabs/tab_strip_model_stats_recorder.cc",
+      "tabs/tab_strip_model_stats_recorder.h",
+      "tabs/tab_strip_model_utils.cc",
+      "tabs/tab_strip_model_utils.h",
+      "tabs/tab_utils.cc",
+      "tabs/tab_utils.h",
+      "task_manager/task_manager_columns.cc",
+      "task_manager/task_manager_columns.h",
+      "task_manager/task_manager_table_model.cc",
+      "task_manager/task_manager_table_model.h",
+      "toolbar/app_menu_icon_controller.cc",
+      "toolbar/app_menu_icon_controller.h",
+      "toolbar/app_menu_icon_painter.cc",
+      "toolbar/app_menu_icon_painter.h",
+      "toolbar/app_menu_model.cc",
+      "toolbar/app_menu_model.h",
+      "toolbar/back_forward_menu_model.cc",
+      "toolbar/back_forward_menu_model.h",
+      "toolbar/bookmark_sub_menu_model.cc",
+      "toolbar/bookmark_sub_menu_model.h",
+      "toolbar/component_toolbar_actions_factory.cc",
+      "toolbar/component_toolbar_actions_factory.h",
+      "toolbar/recent_tabs_sub_menu_model.cc",
+      "toolbar/recent_tabs_sub_menu_model.h",
+      "toolbar/toolbar_action_view_controller.h",
+      "toolbar/toolbar_action_view_delegate.h",
+      "toolbar/toolbar_actions_bar.cc",
+      "toolbar/toolbar_actions_bar.h",
+      "toolbar/toolbar_actions_bar_bubble_delegate.h",
+      "toolbar/toolbar_actions_bar_delegate.h",
+      "toolbar/toolbar_actions_bar_observer.h",
+      "translate/translate_bubble_factory.cc",
+      "translate/translate_bubble_factory.h",
+      "uma_browsing_activity_observer.cc",
+      "uma_browsing_activity_observer.h",
+      "unload_controller.cc",
+      "unload_controller.h",
+      "user_manager.cc",
+      "user_manager.h",
+      "website_settings/chooser_bubble_delegate.cc",
+      "website_settings/chooser_bubble_delegate.h",
+      "website_settings/permission_menu_model.cc",
+      "website_settings/permission_menu_model.h",
+      "website_settings/permission_prompt.h",
+      "website_settings/website_settings_infobar_delegate.cc",
+      "website_settings/website_settings_infobar_delegate.h",
+      "webui/app_launcher_login_handler.cc",
+      "webui/app_launcher_login_handler.h",
+      "webui/bookmarks_ui.cc",
+      "webui/bookmarks_ui.h",
+      "webui/chrome_web_contents_handler.cc",
+      "webui/chrome_web_contents_handler.h",
+      "webui/constrained_web_dialog_delegate_base.cc",
+      "webui/constrained_web_dialog_delegate_base.h",
+      "webui/devtools_ui.cc",
+      "webui/devtools_ui.h",
+      "webui/extensions/extension_loader_handler.cc",
+      "webui/extensions/extension_loader_handler.h",
+      "webui/extensions/extension_settings_handler.cc",
+      "webui/extensions/extension_settings_handler.h",
+      "webui/extensions/extensions_ui.cc",
+      "webui/extensions/extensions_ui.h",
+      "webui/extensions/install_extension_handler.cc",
+      "webui/extensions/install_extension_handler.h",
+      "webui/foreign_session_handler.cc",
+      "webui/foreign_session_handler.h",
+      "webui/help/help_handler.cc",
+      "webui/help/help_handler.h",
+      "webui/help/help_ui.cc",
+      "webui/help/help_ui.h",
+      "webui/help/help_utils_chromeos.cc",
+      "webui/help/help_utils_chromeos.h",
+      "webui/help/version_updater.h",
+      "webui/help/version_updater_chromeos.cc",
+      "webui/help/version_updater_chromeos.h",
+      "webui/help/version_updater_mac.h",
+      "webui/help/version_updater_mac.mm",
+      "webui/help/version_updater_win.cc",
+      "webui/history_login_handler.cc",
+      "webui/history_login_handler.h",
+      "webui/identity_internals_ui.cc",
+      "webui/identity_internals_ui.h",
+      "webui/inspect_ui.cc",
+      "webui/inspect_ui.h",
+      "webui/md_downloads/downloads_list_tracker.cc",
+      "webui/md_downloads/downloads_list_tracker.h",
+      "webui/md_downloads/md_downloads_dom_handler.cc",
+      "webui/md_downloads/md_downloads_dom_handler.h",
+      "webui/md_downloads/md_downloads_ui.cc",
+      "webui/md_downloads/md_downloads_ui.h",
+      "webui/md_feedback/md_feedback_dialog_controller.cc",
+      "webui/md_feedback/md_feedback_dialog_controller.h",
+      "webui/md_feedback/md_feedback_ui.cc",
+      "webui/md_feedback/md_feedback_ui.h",
+      "webui/md_history_ui.cc",
+      "webui/md_history_ui.h",
+      "webui/ntp/app_launcher_handler.cc",
+      "webui/ntp/app_launcher_handler.h",
+      "webui/ntp/app_resource_cache_factory.cc",
+      "webui/ntp/app_resource_cache_factory.h",
+      "webui/ntp/core_app_launcher_handler.cc",
+      "webui/ntp/core_app_launcher_handler.h",
+      "webui/ntp/favicon_webui_handler.cc",
+      "webui/ntp/favicon_webui_handler.h",
+      "webui/ntp/new_tab_ui.cc",
+      "webui/ntp/new_tab_ui.h",
+      "webui/ntp/ntp_resource_cache.cc",
+      "webui/ntp/ntp_resource_cache.h",
+      "webui/ntp/ntp_resource_cache_factory.cc",
+      "webui/ntp/ntp_resource_cache_factory.h",
+      "webui/options/autofill_options_handler.cc",
+      "webui/options/autofill_options_handler.h",
+      "webui/options/automatic_settings_reset_handler.cc",
+      "webui/options/automatic_settings_reset_handler.h",
+      "webui/options/browser_options_handler.cc",
+      "webui/options/browser_options_handler.h",
+      "webui/options/chromeos/accounts_options_handler.cc",
+      "webui/options/chromeos/accounts_options_handler.h",
+      "webui/options/chromeos/bluetooth_options_handler.cc",
+      "webui/options/chromeos/bluetooth_options_handler.h",
+      "webui/options/chromeos/change_picture_options_handler.cc",
+      "webui/options/chromeos/change_picture_options_handler.h",
+      "webui/options/chromeos/core_chromeos_options_handler.cc",
+      "webui/options/chromeos/core_chromeos_options_handler.h",
+      "webui/options/chromeos/cros_language_options_handler.cc",
+      "webui/options/chromeos/cros_language_options_handler.h",
+      "webui/options/chromeos/date_time_options_handler.cc",
+      "webui/options/chromeos/date_time_options_handler.h",
+      "webui/options/chromeos/display_options_handler.cc",
+      "webui/options/chromeos/display_options_handler.h",
+      "webui/options/chromeos/display_overscan_handler.cc",
+      "webui/options/chromeos/display_overscan_handler.h",
+      "webui/options/chromeos/internet_options_handler.cc",
+      "webui/options/chromeos/internet_options_handler.h",
+      "webui/options/chromeos/internet_options_handler_strings.cc",
+      "webui/options/chromeos/internet_options_handler_strings.h",
+      "webui/options/chromeos/keyboard_handler.cc",
+      "webui/options/chromeos/keyboard_handler.h",
+      "webui/options/chromeos/options_stylus_handler.cc",
+      "webui/options/chromeos/options_stylus_handler.h",
+      "webui/options/chromeos/pointer_handler.cc",
+      "webui/options/chromeos/pointer_handler.h",
+      "webui/options/chromeos/power_handler.cc",
+      "webui/options/chromeos/power_handler.h",
+      "webui/options/chromeos/proxy_handler.cc",
+      "webui/options/chromeos/proxy_handler.h",
+      "webui/options/chromeos/stats_options_handler.cc",
+      "webui/options/chromeos/stats_options_handler.h",
+      "webui/options/chromeos/storage_manager_handler.cc",
+      "webui/options/chromeos/storage_manager_handler.h",
+      "webui/options/chromeos/user_image_source.cc",
+      "webui/options/chromeos/user_image_source.h",
+      "webui/options/clear_browser_data_handler.cc",
+      "webui/options/clear_browser_data_handler.h",
+      "webui/options/content_settings_handler.cc",
+      "webui/options/content_settings_handler.h",
+      "webui/options/cookies_view_handler.cc",
+      "webui/options/cookies_view_handler.h",
+      "webui/options/core_options_handler.cc",
+      "webui/options/core_options_handler.h",
+      "webui/options/create_profile_handler.cc",
+      "webui/options/create_profile_handler.h",
+      "webui/options/easy_unlock_handler.cc",
+      "webui/options/easy_unlock_handler.h",
+      "webui/options/font_settings_handler.cc",
+      "webui/options/font_settings_handler.h",
+      "webui/options/font_settings_utils.h",
+      "webui/options/font_settings_utils_linux.cc",
+      "webui/options/font_settings_utils_mac.mm",
+      "webui/options/font_settings_utils_win.cc",
+      "webui/options/handler_options_handler.cc",
+      "webui/options/handler_options_handler.h",
+      "webui/options/help_overlay_handler.cc",
+      "webui/options/help_overlay_handler.h",
+      "webui/options/home_page_overlay_handler.cc",
+      "webui/options/home_page_overlay_handler.h",
+      "webui/options/import_data_handler.cc",
+      "webui/options/import_data_handler.h",
+      "webui/options/language_dictionary_overlay_handler.cc",
+      "webui/options/language_dictionary_overlay_handler.h",
+      "webui/options/language_options_handler.cc",
+      "webui/options/language_options_handler.h",
+      "webui/options/language_options_handler_common.cc",
+      "webui/options/language_options_handler_common.h",
+      "webui/options/manage_profile_handler.cc",
+      "webui/options/manage_profile_handler.h",
+      "webui/options/media_devices_selection_handler.cc",
+      "webui/options/media_devices_selection_handler.h",
+      "webui/options/options_ui.cc",
+      "webui/options/options_ui.h",
+      "webui/options/password_manager_handler.cc",
+      "webui/options/password_manager_handler.h",
+      "webui/options/pepper_flash_content_settings_utils.cc",
+      "webui/options/pepper_flash_content_settings_utils.h",
+      "webui/options/reset_profile_settings_handler.cc",
+      "webui/options/reset_profile_settings_handler.h",
+      "webui/options/search_engine_manager_handler.cc",
+      "webui/options/search_engine_manager_handler.h",
+      "webui/options/startup_pages_handler.cc",
+      "webui/options/startup_pages_handler.h",
+      "webui/options/supervised_user_create_confirm_handler.cc",
+      "webui/options/supervised_user_create_confirm_handler.h",
+      "webui/options/supervised_user_import_handler.cc",
+      "webui/options/supervised_user_import_handler.h",
+      "webui/options/supervised_user_learn_more_handler.cc",
+      "webui/options/supervised_user_learn_more_handler.h",
+      "webui/options/sync_setup_handler.cc",
+      "webui/options/sync_setup_handler.h",
+      "webui/policy_indicator_localized_strings_provider.cc",
+      "webui/policy_indicator_localized_strings_provider.h",
+      "webui/profile_helper.cc",
+      "webui/profile_helper.h",
+      "webui/profile_info_watcher.cc",
+      "webui/profile_info_watcher.h",
+      "webui/quota_internals/quota_internals_handler.cc",
+      "webui/quota_internals/quota_internals_handler.h",
+      "webui/quota_internals/quota_internals_proxy.cc",
+      "webui/quota_internals/quota_internals_proxy.h",
+      "webui/quota_internals/quota_internals_types.cc",
+      "webui/quota_internals/quota_internals_types.h",
+      "webui/quota_internals/quota_internals_ui.cc",
+      "webui/quota_internals/quota_internals_ui.h",
+      "webui/set_as_default_browser_ui_win.cc",
+      "webui/set_as_default_browser_ui_win.h",
+      "webui/settings/about_handler.cc",
+      "webui/settings/about_handler.h",
+      "webui/settings/appearance_handler.cc",
+      "webui/settings/appearance_handler.h",
+      "webui/settings/browser_lifetime_handler.cc",
+      "webui/settings/browser_lifetime_handler.h",
+      "webui/settings/chromeos/accessibility_handler.cc",
+      "webui/settings/chromeos/accessibility_handler.h",
+      "webui/settings/chromeos/change_picture_handler.cc",
+      "webui/settings/chromeos/change_picture_handler.h",
+      "webui/settings/chromeos/cups_printers_handler.cc",
+      "webui/settings/chromeos/cups_printers_handler.h",
+      "webui/settings/chromeos/device_keyboard_handler.cc",
+      "webui/settings/chromeos/device_keyboard_handler.h",
+      "webui/settings/chromeos/device_pointer_handler.cc",
+      "webui/settings/chromeos/device_pointer_handler.h",
+      "webui/settings/chromeos/easy_unlock_settings_handler.cc",
+      "webui/settings/chromeos/easy_unlock_settings_handler.h",
+      "webui/settings/chromeos/internet_handler.cc",
+      "webui/settings/chromeos/internet_handler.h",
+      "webui/settings/downloads_handler.cc",
+      "webui/settings/downloads_handler.h",
+      "webui/settings/font_handler.cc",
+      "webui/settings/font_handler.h",
+      "webui/settings/languages_handler.cc",
+      "webui/settings/languages_handler.h",
+      "webui/settings/md_settings_localized_strings_provider.cc",
+      "webui/settings/md_settings_localized_strings_provider.h",
+      "webui/settings/md_settings_ui.cc",
+      "webui/settings/md_settings_ui.h",
+      "webui/settings/metrics_reporting_handler.cc",
+      "webui/settings/metrics_reporting_handler.h",
+      "webui/settings/people_handler.cc",
+      "webui/settings/people_handler.h",
+      "webui/settings/profile_info_handler.cc",
+      "webui/settings/profile_info_handler.h",
+      "webui/settings/protocol_handlers_handler.cc",
+      "webui/settings/protocol_handlers_handler.h",
+      "webui/settings/reset_settings_handler.cc",
+      "webui/settings/reset_settings_handler.h",
+      "webui/settings/search_engines_handler.cc",
+      "webui/settings/search_engines_handler.h",
+      "webui/settings/settings_clear_browsing_data_handler.cc",
+      "webui/settings/settings_clear_browsing_data_handler.h",
+      "webui/settings/settings_cookies_view_handler.cc",
+      "webui/settings/settings_cookies_view_handler.h",
+      "webui/settings/settings_manage_profile_handler.cc",
+      "webui/settings/settings_manage_profile_handler.h",
+      "webui/settings/settings_media_devices_selection_handler.cc",
+      "webui/settings/settings_media_devices_selection_handler.h",
+      "webui/settings/settings_page_ui_handler.cc",
+      "webui/settings/settings_page_ui_handler.h",
+      "webui/settings/settings_startup_pages_handler.cc",
+      "webui/settings/settings_startup_pages_handler.h",
+      "webui/settings/site_settings_handler.cc",
+      "webui/settings/site_settings_handler.h",
+      "webui/settings_utils.cc",
+      "webui/settings_utils.h",
+      "webui/signin/get_auth_frame.cc",
+      "webui/signin/get_auth_frame.h",
+      "webui/signin/login_ui_service.cc",
+      "webui/signin/login_ui_service.h",
+      "webui/signin/login_ui_service_factory.cc",
+      "webui/signin/login_ui_service_factory.h",
+      "webui/signin/profile_signin_confirmation_dialog.cc",
+      "webui/signin/profile_signin_confirmation_dialog.h",
+      "webui/signin/profile_signin_confirmation_ui.cc",
+      "webui/signin/profile_signin_confirmation_ui.h",
+      "webui/site_settings_helper.cc",
+      "webui/site_settings_helper.h",
+      "webui/sync_file_system_internals/dump_database_handler.cc",
+      "webui/sync_file_system_internals/dump_database_handler.h",
+      "webui/sync_file_system_internals/extension_statuses_handler.cc",
+      "webui/sync_file_system_internals/extension_statuses_handler.h",
+      "webui/sync_file_system_internals/file_metadata_handler.cc",
+      "webui/sync_file_system_internals/file_metadata_handler.h",
+      "webui/sync_file_system_internals/sync_file_system_internals_handler.cc",
+      "webui/sync_file_system_internals/sync_file_system_internals_handler.h",
+      "webui/sync_file_system_internals/sync_file_system_internals_ui.cc",
+      "webui/sync_file_system_internals/sync_file_system_internals_ui.h",
+      "webui/system_info_ui.cc",
+      "webui/system_info_ui.h",
+      "webui/theme_handler.cc",
+      "webui/theme_handler.h",
+      "webui/uber/uber_ui.cc",
+      "webui/uber/uber_ui.h",
+      "window_sizer/window_sizer.cc",
+      "window_sizer/window_sizer.h",
+    ]
     deps += [
       "//apps",
       "//chrome/browser/profile_resetter:profile_reset_report_proto",
@@ -244,14 +1146,23 @@
   }
 
   if (enable_nacl) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_nacl_sources, ".", "//chrome")
+    sources += [
+      "webui/nacl_ui.cc",
+      "webui/nacl_ui.h",
+    ]
     deps += [ "//components/nacl/browser" ]
   }
   if (enable_plugins) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_plugin_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "hung_plugin_tab_helper.cc",
+      "hung_plugin_tab_helper.h",
+      "webui/flash_ui.cc",
+      "webui/flash_ui.h",
+      "webui/plugins/plugins_handler.cc",
+      "webui/plugins/plugins_handler.h",
+      "webui/plugins/plugins_ui.cc",
+      "webui/plugins/plugins_ui.h",
+    ]
     deps += [ "//ppapi/proxy:ipc" ]
   }
   if (safe_browsing_mode == 1) {
@@ -262,16 +1173,41 @@
   }
 
   if (is_chromeos && !is_official_build) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_chromeos_non_official_sources,
-                    ".",
-                    "//chrome")
+    sources += [
+      "webui/chromeos/emulator/device_emulator_message_handler.cc",
+      "webui/chromeos/emulator/device_emulator_message_handler.h",
+      "webui/chromeos/emulator/device_emulator_ui.cc",
+      "webui/chromeos/emulator/device_emulator_ui.h",
+    ]
   }
 
   if (is_chromeos) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_chromeos_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "app_list/search/launcher_search/launcher_search_icon_image_loader.cc",
+      "app_list/search/launcher_search/launcher_search_icon_image_loader.h",
+      "app_list/search/launcher_search/launcher_search_icon_image_loader_impl.cc",
+      "app_list/search/launcher_search/launcher_search_icon_image_loader_impl.h",
+      "app_list/search/launcher_search/launcher_search_provider.cc",
+      "app_list/search/launcher_search/launcher_search_provider.h",
+      "app_list/search/launcher_search/launcher_search_result.cc",
+      "app_list/search/launcher_search/launcher_search_result.h",
+      "extensions/extension_installed_notification.cc",
+      "extensions/extension_installed_notification.h",
+      "input_method/input_method_engine_base.cc",
+      "input_method/input_method_engine_base.h",
+      "views/apps/chrome_native_app_window_views_aura_ash.cc",
+      "views/apps/chrome_native_app_window_views_aura_ash.h",
+      "views/intent_picker_bubble_view.cc",
+      "views/intent_picker_bubble_view.h",
+
+      # On chromeos, file manager extension handles the file open/save dialog.
+      "views/select_file_dialog_extension.cc",
+      "views/select_file_dialog_extension.h",
+      "views/select_file_dialog_extension_factory.cc",
+      "views/select_file_dialog_extension_factory.h",
+      "webui/cast/cast_ui.cc",
+      "webui/cast/cast_ui.h",
+    ]
     deps += [
       "//chrome/browser/chromeos",
       "//components/arc",
@@ -282,19 +1218,151 @@
     configs += [ "//printing:cups" ]
   }
   if (use_ash) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_ash_sources, ".", "//chrome")
     sources += [
+      "ash/app_list/app_list_controller_ash.cc",
+      "ash/app_list/app_list_controller_ash.h",
+      "ash/app_list/app_list_presenter_delegate_mus.cc",
+      "ash/app_list/app_list_presenter_delegate_mus.h",
       "ash/app_list/app_list_presenter_service.cc",
       "ash/app_list/app_list_presenter_service.h",
+      "ash/app_list/app_list_service_ash.cc",
+      "ash/app_list/app_list_service_ash.h",
+      "ash/app_list/app_sync_ui_state_watcher.cc",
+      "ash/app_list/app_sync_ui_state_watcher.h",
+      "ash/app_sync_ui_state.cc",
+      "ash/app_sync_ui_state.h",
+      "ash/app_sync_ui_state_factory.cc",
+      "ash/app_sync_ui_state_factory.h",
+      "ash/app_sync_ui_state_observer.h",
+      "ash/ash_init.cc",
+      "ash/ash_init.h",
+      "ash/ash_util.cc",
+      "ash/ash_util.h",
+      "ash/cast_config_delegate_chromeos.cc",
+      "ash/cast_config_delegate_chromeos.h",
+      "ash/cast_config_delegate_media_router.cc",
+      "ash/cast_config_delegate_media_router.h",
+      "ash/chrome_keyboard_ui.cc",
+      "ash/chrome_keyboard_ui.h",
+      "ash/chrome_launcher_prefs.cc",
+      "ash/chrome_launcher_prefs.h",
+      "ash/chrome_new_window_delegate.cc",
+      "ash/chrome_new_window_delegate.h",
+      "ash/chrome_screenshot_grabber.cc",
+      "ash/chrome_screenshot_grabber.h",
+      "ash/chrome_shell_content_state.cc",
+      "ash/chrome_shell_content_state.h",
+      "ash/chrome_shell_content_state_chromeos.cc",
+      "ash/chrome_shell_delegate.cc",
+      "ash/chrome_shell_delegate.h",
       "ash/chrome_wallpaper_manager.cc",
       "ash/chrome_wallpaper_manager.h",
+      "ash/ime_controller_chromeos.cc",
+      "ash/ime_controller_chromeos.h",
       "ash/keyboard_ui_service.cc",
       "ash/keyboard_ui_service.h",
+      "ash/launcher/app_shortcut_launcher_item_controller.cc",
+      "ash/launcher/app_shortcut_launcher_item_controller.h",
+      "ash/launcher/app_window_launcher_controller.cc",
+      "ash/launcher/app_window_launcher_controller.h",
+      "ash/launcher/app_window_launcher_item_controller.cc",
+      "ash/launcher/app_window_launcher_item_controller.h",
+      "ash/launcher/arc_playstore_shortcut_launcher_item_controller.cc",
+      "ash/launcher/arc_playstore_shortcut_launcher_item_controller.h",
+      "ash/launcher/browser_shortcut_launcher_item_controller.cc",
+      "ash/launcher/browser_shortcut_launcher_item_controller.h",
+      "ash/launcher/browser_status_monitor.cc",
+      "ash/launcher/browser_status_monitor.h",
+      "ash/launcher/chrome_launcher_app_menu_item.cc",
+      "ash/launcher/chrome_launcher_app_menu_item.h",
+      "ash/launcher/chrome_launcher_app_menu_item_browser.cc",
+      "ash/launcher/chrome_launcher_app_menu_item_browser.h",
+      "ash/launcher/chrome_launcher_app_menu_item_tab.cc",
+      "ash/launcher/chrome_launcher_app_menu_item_tab.h",
+      "ash/launcher/chrome_launcher_app_menu_item_v2app.cc",
+      "ash/launcher/chrome_launcher_app_menu_item_v2app.h",
+      "ash/launcher/chrome_launcher_controller.cc",
+      "ash/launcher/chrome_launcher_controller.h",
+      "ash/launcher/chrome_launcher_controller_impl.cc",
+      "ash/launcher/chrome_launcher_controller_impl.h",
       "ash/launcher/chrome_launcher_controller_mus.cc",
       "ash/launcher/chrome_launcher_controller_mus.h",
+      "ash/launcher/chrome_launcher_controller_util.cc",
+      "ash/launcher/chrome_launcher_controller_util.h",
       "ash/launcher/chrome_mash_shelf_controller.cc",
       "ash/launcher/chrome_mash_shelf_controller.h",
+      "ash/launcher/desktop_shell_launcher_context_menu.cc",
+      "ash/launcher/desktop_shell_launcher_context_menu.h",
+      "ash/launcher/extension_app_window_launcher_controller.cc",
+      "ash/launcher/extension_app_window_launcher_controller.h",
+      "ash/launcher/extension_app_window_launcher_item_controller.cc",
+      "ash/launcher/extension_app_window_launcher_item_controller.h",
+      "ash/launcher/extension_launcher_context_menu.cc",
+      "ash/launcher/extension_launcher_context_menu.h",
+      "ash/launcher/launcher_app_updater.cc",
+      "ash/launcher/launcher_app_updater.h",
+      "ash/launcher/launcher_application_menu_item_model.cc",
+      "ash/launcher/launcher_application_menu_item_model.h",
+      "ash/launcher/launcher_context_menu.cc",
+      "ash/launcher/launcher_context_menu.h",
+      "ash/launcher/launcher_controller_helper.cc",
+      "ash/launcher/launcher_controller_helper.h",
+      "ash/launcher/launcher_extension_app_updater.cc",
+      "ash/launcher/launcher_extension_app_updater.h",
+      "ash/launcher/launcher_favicon_loader.cc",
+      "ash/launcher/launcher_favicon_loader.h",
+      "ash/launcher/launcher_item_controller.cc",
+      "ash/launcher/launcher_item_controller.h",
+      "ash/launcher/multi_profile_app_window_launcher_controller.cc",
+      "ash/launcher/multi_profile_app_window_launcher_controller.h",
+      "ash/launcher/multi_profile_browser_status_monitor.cc",
+      "ash/launcher/multi_profile_browser_status_monitor.h",
+      "ash/media_delegate_chromeos.cc",
+      "ash/media_delegate_chromeos.h",
+      "ash/metrics/chrome_user_metrics_recorder.cc",
+      "ash/metrics/chrome_user_metrics_recorder.h",
+      "ash/multi_user/multi_user_context_menu.h",
+      "ash/multi_user/multi_user_context_menu_chromeos.cc",
+      "ash/multi_user/multi_user_notification_blocker_chromeos.cc",
+      "ash/multi_user/multi_user_notification_blocker_chromeos.h",
+      "ash/multi_user/multi_user_util.cc",
+      "ash/multi_user/multi_user_util.h",
+      "ash/multi_user/multi_user_warning_dialog.cc",
+      "ash/multi_user/multi_user_warning_dialog.h",
+      "ash/multi_user/multi_user_window_manager.cc",
+      "ash/multi_user/multi_user_window_manager.h",
+      "ash/multi_user/multi_user_window_manager_chromeos.cc",
+      "ash/multi_user/multi_user_window_manager_chromeos.h",
+      "ash/multi_user/multi_user_window_manager_stub.cc",
+      "ash/multi_user/multi_user_window_manager_stub.h",
+      "ash/multi_user/user_switch_animator_chromeos.cc",
+      "ash/multi_user/user_switch_animator_chromeos.h",
+      "ash/multi_user/user_switch_util.cc",
+      "ash/multi_user/user_switch_util.h",
+      "ash/network_connect_delegate_chromeos.cc",
+      "ash/network_connect_delegate_chromeos.h",
+      "ash/networking_config_delegate_chromeos.cc",
+      "ash/networking_config_delegate_chromeos.h",
+      "ash/palette_delegate_chromeos.cc",
+      "ash/palette_delegate_chromeos.h",
+      "ash/session_state_delegate_chromeos.cc",
+      "ash/session_state_delegate_chromeos.h",
+      "ash/session_util.cc",
+      "ash/session_util.h",
+      "ash/system_tray_delegate_chromeos.cc",
+      "ash/system_tray_delegate_chromeos.h",
+      "ash/system_tray_delegate_utils.cc",
+      "ash/system_tray_delegate_utils.h",
+      "ash/volume_controller_chromeos.cc",
+      "ash/volume_controller_chromeos.h",
+      "ash/vpn_delegate_chromeos.cc",
+      "ash/vpn_delegate_chromeos.h",
+      "views/ash/chrome_browser_main_extra_parts_ash.cc",
+      "views/ash/chrome_browser_main_extra_parts_ash.h",
+      "views/ash/tab_scrubber.cc",
+      "views/ash/tab_scrubber.h",
+      "views/touch_uma/touch_uma_ash.cc",
+      "window_sizer/window_sizer_ash.cc",
     ]
     deps += [
       "//ash",
@@ -307,14 +1375,99 @@
       "//ui/keyboard:mojom",
     ]
   } else {  # Not ash.
-    sources += rebase_path(gypi_values.chrome_browser_ui_non_ash_sources,
-                           ".",
-                           "//chrome")
+    sources += [ "views/touch_uma/touch_uma.cc" ]
   }
   if (toolkit_views) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_views_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "autofill/save_card_bubble_controller.h",
+      "autofill/save_card_bubble_controller_impl.cc",
+      "autofill/save_card_bubble_controller_impl.h",
+      "autofill/save_card_bubble_view.h",
+      "browser_dialogs_mac.cc",
+      "views/apps/app_info_dialog/app_info_dialog_container.cc",
+      "views/apps/app_info_dialog/app_info_dialog_container.h",
+      "views/apps/app_info_dialog/app_info_dialog_views.cc",
+      "views/apps/app_info_dialog/app_info_dialog_views.h",
+      "views/apps/app_info_dialog/app_info_footer_panel.cc",
+      "views/apps/app_info_dialog/app_info_footer_panel.h",
+      "views/apps/app_info_dialog/app_info_header_panel.cc",
+      "views/apps/app_info_dialog/app_info_header_panel.h",
+      "views/apps/app_info_dialog/app_info_panel.cc",
+      "views/apps/app_info_dialog/app_info_panel.h",
+      "views/apps/app_info_dialog/app_info_permissions_panel.cc",
+      "views/apps/app_info_dialog/app_info_permissions_panel.h",
+      "views/apps/app_info_dialog/app_info_summary_panel.cc",
+      "views/apps/app_info_dialog/app_info_summary_panel.h",
+      "views/apps/app_window_native_widget_mac.h",
+      "views/apps/app_window_native_widget_mac.mm",
+      "views/apps/chrome_native_app_window_views.cc",
+      "views/apps/chrome_native_app_window_views.h",
+      "views/apps/chrome_native_app_window_views_mac.h",
+      "views/apps/chrome_native_app_window_views_mac.mm",
+      "views/apps/native_app_window_frame_view_mac.h",
+      "views/apps/native_app_window_frame_view_mac.mm",
+      "views/autofill/card_unmask_prompt_views.cc",
+      "views/autofill/card_unmask_prompt_views.h",
+      "views/autofill/decorated_textfield.cc",
+      "views/autofill/decorated_textfield.h",
+      "views/autofill/info_bubble.cc",
+      "views/autofill/info_bubble.h",
+      "views/autofill/tooltip_icon.cc",
+      "views/autofill/tooltip_icon.h",
+      "views/bookmarks/bookmark_bubble_view.cc",
+      "views/bookmarks/bookmark_bubble_view.h",
+      "views/bookmarks/bookmark_editor_view.cc",
+      "views/bookmarks/bookmark_editor_view.h",
+      "views/browser_dialogs_views_mac.cc",
+      "views/chooser_content_view.cc",
+      "views/chooser_content_view.h",
+      "views/chrome_browser_main_extra_parts_views.cc",
+      "views/chrome_browser_main_extra_parts_views.h",
+      "views/chrome_constrained_window_views_client.cc",
+      "views/chrome_constrained_window_views_client.h",
+      "views/chrome_views_delegate.cc",
+      "views/chrome_views_delegate.h",
+      "views/collected_cookies_views.cc",
+      "views/collected_cookies_views.h",
+      "views/content_setting_bubble_contents.cc",
+      "views/content_setting_bubble_contents.h",
+      "views/cookie_info_view.cc",
+      "views/cookie_info_view.h",
+      "views/exclusive_access_bubble_views.cc",
+      "views/exclusive_access_bubble_views.h",
+      "views/exclusive_access_bubble_views_context.h",
+      "views/extensions/chooser_dialog_view.cc",
+      "views/extensions/chooser_dialog_view.h",
+      "views/extensions/device_permissions_dialog_view.cc",
+      "views/extensions/device_permissions_dialog_view.h",
+      "views/extensions/extension_install_dialog_view.cc",
+      "views/extensions/extension_keybinding_registry_views.cc",
+      "views/extensions/extension_keybinding_registry_views.h",
+      "views/frame/native_widget_mac_frameless_nswindow.h",
+      "views/frame/native_widget_mac_frameless_nswindow.mm",
+      "views/location_bar/location_bar_bubble_delegate_view.cc",
+      "views/location_bar/location_bar_bubble_delegate_view.h",
+      "views/login_handler_views.cc",
+      "views/login_view.cc",
+      "views/login_view.h",
+      "views/new_back_shortcut_bubble.cc",
+      "views/new_back_shortcut_bubble.h",
+      "views/subtle_notification_view.cc",
+      "views/subtle_notification_view.h",
+      "views/sync/bubble_sync_promo_view.cc",
+      "views/sync/bubble_sync_promo_view.h",
+      "views/task_manager_view.cc",
+      "views/task_manager_view.h",
+      "views/website_settings/chosen_object_view.cc",
+      "views/website_settings/chosen_object_view.h",
+      "views/website_settings/permission_prompt_impl.cc",
+      "views/website_settings/permission_prompt_impl.h",
+      "views/website_settings/permission_selector_view.cc",
+      "views/website_settings/permission_selector_view.h",
+      "views/website_settings/permission_selector_view_observer.h",
+      "views/website_settings/website_settings_popup_view.cc",
+      "views/website_settings/website_settings_popup_view.h",
+    ]
     deps += [
       "//chrome/browser/ui/views",
       "//components/constrained_window",
@@ -327,21 +1480,350 @@
     }
 
     if (is_chromeos) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_views_chromeos_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "views/apps/app_info_dialog/arc_app_info_links_panel.cc",
+        "views/apps/app_info_dialog/arc_app_info_links_panel.h",
+      ]
     } else if (!is_mac || mac_views_browser) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_views_non_chromeos_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "external_protocol_dialog_delegate.cc",
+        "external_protocol_dialog_delegate.h",
+        "views/chrome_browser_main_extra_parts_views_linux.cc",
+        "views/chrome_browser_main_extra_parts_views_linux.h",
+        "views/external_protocol_dialog.cc",
+        "views/external_protocol_dialog.h",
+        "views/frame/opaque_browser_frame_view.cc",
+        "views/frame/opaque_browser_frame_view.h",
+        "views/frame/opaque_browser_frame_view_layout.cc",
+        "views/frame/opaque_browser_frame_view_layout.h",
+        "views/frame/opaque_browser_frame_view_layout_delegate.h",
+        "views/frame/opaque_browser_frame_view_linux.cc",
+        "views/frame/opaque_browser_frame_view_linux.h",
+        "views/frame/opaque_browser_frame_view_platform_specific.cc",
+        "views/frame/opaque_browser_frame_view_platform_specific.h",
+        "views/profiles/profile_chooser_view.cc",
+        "views/profiles/profile_chooser_view.h",
+        "views/screen_capture_notification_ui_views.cc",
+        "views/sync/one_click_signin_dialog_view.cc",
+        "views/sync/one_click_signin_dialog_view.h",
+        "views/sync/profile_signin_confirmation_dialog_views.cc",
+        "views/sync/profile_signin_confirmation_dialog_views.h",
+      ]
+    }
+    if (enable_extensions && (!is_mac || mac_views_browser)) {
+      sources += [
+        "views/extensions/bookmark_app_confirmation_view.cc",
+        "views/extensions/bookmark_app_confirmation_view.h",
+        "views/extensions/browser_action_drag_data.cc",
+        "views/extensions/browser_action_drag_data.h",
+        "views/extensions/extension_action_platform_delegate_views.cc",
+        "views/extensions/extension_action_platform_delegate_views.h",
+        "views/extensions/extension_dialog.cc",
+        "views/extensions/extension_dialog.h",
+        "views/extensions/extension_dialog_observer.cc",
+        "views/extensions/extension_dialog_observer.h",
+        "views/extensions/extension_installed_bubble_view.cc",
+        "views/extensions/extension_popup.cc",
+        "views/extensions/extension_popup.h",
+        "views/extensions/extension_uninstall_dialog_view.cc",
+        "views/extensions/extension_view_views.cc",
+        "views/extensions/extension_view_views.h",
+        "views/extensions/media_galleries_dialog_views.cc",
+        "views/extensions/media_galleries_dialog_views.h",
+        "views/extensions/media_gallery_checkbox_view.cc",
+        "views/extensions/media_gallery_checkbox_view.h",
+      ]
+      if (use_aura) {
+        sources += [
+          "views/extensions/extension_popup_aura.cc",
+          "views/extensions/extension_popup_aura.h",
+        ]
+      }
     }
     if (!is_mac) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_views_non_mac_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        # This test header is included because it contains forward declarations
+        # needed for "friend" statements for use in tests.
+        "translate/translate_bubble_test_utils.h",
+        "views/accessibility/invert_bubble_view.cc",
+        "views/accessibility/invert_bubble_view.h",
+        "views/autofill/autofill_popup_base_view.cc",
+        "views/autofill/autofill_popup_base_view.h",
+        "views/autofill/autofill_popup_view_views.cc",
+        "views/autofill/autofill_popup_view_views.h",
+        "views/autofill/card_unmask_prompt_views_shim.cc",
+        "views/autofill/password_generation_popup_view_views.cc",
+        "views/autofill/password_generation_popup_view_views.h",
+        "views/autofill/save_card_bubble_views.cc",
+        "views/autofill/save_card_bubble_views.h",
+        "views/autofill/save_card_icon_view.cc",
+        "views/autofill/save_card_icon_view.h",
+        "views/bar_control_button.cc",
+        "views/bar_control_button.h",
+        "views/bookmarks/bookmark_bar_instructions_view.cc",
+        "views/bookmarks/bookmark_bar_instructions_view.h",
+        "views/bookmarks/bookmark_bar_view.cc",
+        "views/bookmarks/bookmark_bar_view.h",
+        "views/bookmarks/bookmark_bar_view_observer.h",
+        "views/bookmarks/bookmark_context_menu.cc",
+        "views/bookmarks/bookmark_context_menu.h",
+        "views/bookmarks/bookmark_drag_drop_views.cc",
+        "views/bookmarks/bookmark_menu_controller_observer.h",
+        "views/bookmarks/bookmark_menu_controller_views.cc",
+        "views/bookmarks/bookmark_menu_controller_views.h",
+        "views/bookmarks/bookmark_menu_delegate.cc",
+        "views/bookmarks/bookmark_menu_delegate.h",
+        "views/browser_dialogs_views.cc",
+        "views/certificate_selector.cc",
+        "views/certificate_selector.h",
+        "views/certificate_viewer_win.cc",
+        "views/chrome_javascript_native_dialog_factory_views.cc",
+        "views/chrome_views_delegate_chromeos.cc",
+        "views/chrome_web_dialog_view.cc",
+        "views/color_chooser_win.cc",
+        "views/confirm_bubble_views.cc",
+        "views/confirm_bubble_views.h",
+        "views/conflicting_module_view_win.cc",
+        "views/conflicting_module_view_win.h",
+        "views/constrained_web_dialog_delegate_views.cc",
+        "views/create_application_shortcut_view.cc",
+        "views/create_application_shortcut_view.h",
+        "views/download/download_danger_prompt_views.cc",
+        "views/download/download_feedback_dialog_view.cc",
+        "views/download/download_feedback_dialog_view.h",
+        "views/download/download_in_progress_dialog_view.cc",
+        "views/download/download_in_progress_dialog_view.h",
+        "views/download/download_item_view.cc",
+        "views/download/download_item_view.h",
+        "views/download/download_item_view_md.cc",
+        "views/download/download_item_view_md.h",
+        "views/download/download_shelf_context_menu_view.cc",
+        "views/download/download_shelf_context_menu_view.h",
+        "views/download/download_shelf_view.cc",
+        "views/download/download_shelf_view.h",
+        "views/download/download_started_animation_views.cc",
+        "views/dropdown_bar_host.cc",
+        "views/dropdown_bar_host.h",
+        "views/dropdown_bar_host_delegate.h",
+        "views/dropdown_bar_view.cc",
+        "views/dropdown_bar_view.h",
+        "views/elevation_icon_setter.cc",
+        "views/elevation_icon_setter.h",
+        "views/find_bar_host.cc",
+        "views/find_bar_host.h",
+        "views/find_bar_view.cc",
+        "views/find_bar_view.h",
+        "views/first_run_bubble.cc",
+        "views/first_run_bubble.h",
+        "views/frame/browser_command_handler_linux.cc",
+        "views/frame/browser_command_handler_linux.h",
+        "views/frame/browser_frame.cc",
+        "views/frame/browser_frame.h",
+        "views/frame/browser_non_client_frame_view.cc",
+        "views/frame/browser_non_client_frame_view.h",
+        "views/frame/browser_root_view.cc",
+        "views/frame/browser_root_view.h",
+        "views/frame/browser_view.cc",
+        "views/frame/browser_view.h",
+        "views/frame/browser_view_layout.cc",
+        "views/frame/browser_view_layout.h",
+        "views/frame/browser_view_layout_delegate.h",
+        "views/frame/browser_window_factory.cc",
+        "views/frame/browser_window_property_manager_win.cc",
+        "views/frame/browser_window_property_manager_win.h",
+        "views/frame/contents_layout_manager.cc",
+        "views/frame/contents_layout_manager.h",
+        "views/frame/contents_web_view.cc",
+        "views/frame/contents_web_view.h",
+        "views/frame/immersive_mode_controller.cc",
+        "views/frame/immersive_mode_controller.h",
+        "views/frame/immersive_mode_controller_factory_views.cc",
+        "views/frame/immersive_mode_controller_stub.cc",
+        "views/frame/immersive_mode_controller_stub.h",
+        "views/frame/minimize_button_metrics_win.cc",
+        "views/frame/minimize_button_metrics_win.h",
+        "views/frame/native_browser_frame.h",
+        "views/frame/native_browser_frame_factory.cc",
+        "views/frame/native_browser_frame_factory.h",
+        "views/frame/native_browser_frame_factory_chromeos.cc",
+        "views/frame/system_menu_insertion_delegate_win.cc",
+        "views/frame/system_menu_insertion_delegate_win.h",
+        "views/frame/system_menu_model_builder.cc",
+        "views/frame/system_menu_model_builder.h",
+        "views/frame/system_menu_model_delegate.cc",
+        "views/frame/system_menu_model_delegate.h",
+        "views/frame/taskbar_decorator_win.cc",
+        "views/frame/taskbar_decorator_win.h",
+        "views/frame/top_container_view.cc",
+        "views/frame/top_container_view.h",
+        "views/frame/web_contents_close_handler.cc",
+        "views/frame/web_contents_close_handler.h",
+        "views/frame/web_contents_close_handler_delegate.h",
+        "views/global_error_bubble_view.cc",
+        "views/global_error_bubble_view.h",
+        "views/hung_renderer_view.cc",
+        "views/hung_renderer_view.h",
+        "views/ime/ime_warning_bubble_view.cc",
+        "views/ime/ime_warning_bubble_view.h",
+        "views/importer/import_lock_dialog_view.cc",
+        "views/importer/import_lock_dialog_view.h",
+        "views/infobars/alternate_nav_infobar_view.cc",
+        "views/infobars/alternate_nav_infobar_view.h",
+        "views/infobars/confirm_infobar.cc",
+        "views/infobars/confirm_infobar.h",
+        "views/infobars/infobar_background.cc",
+        "views/infobars/infobar_background.h",
+        "views/infobars/infobar_container_view.cc",
+        "views/infobars/infobar_container_view.h",
+        "views/infobars/infobar_view.cc",
+        "views/infobars/infobar_view.h",
+        "views/load_complete_listener.cc",
+        "views/load_complete_listener.h",
+        "views/location_bar/background_with_1_px_border.cc",
+        "views/location_bar/background_with_1_px_border.h",
+        "views/location_bar/bubble_icon_view.cc",
+        "views/location_bar/bubble_icon_view.h",
+        "views/location_bar/content_setting_image_view.cc",
+        "views/location_bar/content_setting_image_view.h",
+        "views/location_bar/icon_label_bubble_view.cc",
+        "views/location_bar/icon_label_bubble_view.h",
+        "views/location_bar/keyword_hint_view.cc",
+        "views/location_bar/keyword_hint_view.h",
+        "views/location_bar/location_bar_decoration_view.cc",
+        "views/location_bar/location_bar_decoration_view.h",
+        "views/location_bar/location_bar_layout.cc",
+        "views/location_bar/location_bar_layout.h",
+        "views/location_bar/location_bar_view.cc",
+        "views/location_bar/location_bar_view.h",
+        "views/location_bar/location_icon_view.cc",
+        "views/location_bar/location_icon_view.h",
+        "views/location_bar/open_pdf_in_reader_view.cc",
+        "views/location_bar/open_pdf_in_reader_view.h",
+        "views/location_bar/page_action_image_view.cc",
+        "views/location_bar/page_action_image_view.h",
+        "views/location_bar/page_action_with_badge_view.cc",
+        "views/location_bar/page_action_with_badge_view.h",
+        "views/location_bar/selected_keyword_view.cc",
+        "views/location_bar/selected_keyword_view.h",
+        "views/location_bar/star_view.cc",
+        "views/location_bar/star_view.h",
+        "views/location_bar/zoom_bubble_view.cc",
+        "views/location_bar/zoom_bubble_view.h",
+        "views/location_bar/zoom_view.cc",
+        "views/location_bar/zoom_view.h",
+        "views/omnibox/omnibox_popup_contents_view.cc",
+        "views/omnibox/omnibox_popup_contents_view.h",
+        "views/omnibox/omnibox_result_view.cc",
+        "views/omnibox/omnibox_result_view.h",
+        "views/omnibox/omnibox_view_views.cc",
+        "views/omnibox/omnibox_view_views.h",
+        "views/open_pdf_in_reader_bubble_view.cc",
+        "views/open_pdf_in_reader_bubble_view.h",
+        "views/outdated_upgrade_bubble_view.cc",
+        "views/outdated_upgrade_bubble_view.h",
+        "views/passwords/account_chooser_dialog_view.cc",
+        "views/passwords/account_chooser_dialog_view.h",
+        "views/passwords/auto_signin_first_run_dialog_view.cc",
+        "views/passwords/auto_signin_first_run_dialog_view.h",
+        "views/passwords/credentials_item_view.cc",
+        "views/passwords/credentials_item_view.h",
+        "views/passwords/credentials_selection_view.cc",
+        "views/passwords/credentials_selection_view.h",
+        "views/passwords/manage_password_items_view.cc",
+        "views/passwords/manage_password_items_view.h",
+        "views/passwords/manage_passwords_bubble_view.cc",
+        "views/passwords/manage_passwords_bubble_view.h",
+        "views/passwords/manage_passwords_icon_views.cc",
+        "views/passwords/manage_passwords_icon_views.h",
+        "views/process_singleton_dialog_linux.cc",
+        "views/profiles/profile_indicator_icon.cc",
+        "views/profiles/profile_indicator_icon.h",
+        "views/profiles/signin_view_controller_delegate_views.cc",
+        "views/profiles/signin_view_controller_delegate_views.h",
+        "views/profiles/user_manager_view.cc",
+        "views/profiles/user_manager_view.h",
+        "views/proximity_auth/proximity_auth_error_bubble_view.cc",
+        "views/proximity_auth/proximity_auth_error_bubble_view.h",
+        "views/session_crashed_bubble_view.cc",
+        "views/session_crashed_bubble_view.h",
+        "views/simple_message_box_views.cc",
+        "views/ssl_client_certificate_selector.cc",
+        "views/ssl_client_certificate_selector.h",
+        "views/status_bubble_views.cc",
+        "views/status_bubble_views.h",
+        "views/status_icons/status_icon_win.cc",
+        "views/status_icons/status_icon_win.h",
+        "views/status_icons/status_tray_linux.cc",
+        "views/status_icons/status_tray_linux.h",
+        "views/status_icons/status_tray_state_changer_win.cc",
+        "views/status_icons/status_tray_state_changer_win.h",
+        "views/status_icons/status_tray_win.cc",
+        "views/status_icons/status_tray_win.h",
+        "views/tab_dialogs_views.cc",
+        "views/tab_dialogs_views.h",
+        "views/tab_icon_view.cc",
+        "views/tab_icon_view.h",
+        "views/tab_modal_confirm_dialog_views.cc",
+        "views/tab_modal_confirm_dialog_views.h",
+        "views/tabs/alert_indicator_button.cc",
+        "views/tabs/alert_indicator_button.h",
+        "views/tabs/browser_tab_strip_controller.cc",
+        "views/tabs/browser_tab_strip_controller.h",
+        "views/tabs/stacked_tab_strip_layout.cc",
+        "views/tabs/stacked_tab_strip_layout.h",
+        "views/tabs/tab.cc",
+        "views/tabs/tab.h",
+        "views/tabs/tab_controller.h",
+        "views/tabs/tab_drag_controller.cc",
+        "views/tabs/tab_drag_controller.h",
+        "views/tabs/tab_strip.cc",
+        "views/tabs/tab_strip.h",
+        "views/tabs/tab_strip_controller.h",
+        "views/tabs/tab_strip_layout.cc",
+        "views/tabs/tab_strip_layout.h",
+        "views/tabs/window_finder.cc",
+        "views/tabs/window_finder.h",
+        "views/tabs/window_finder_chromeos.cc",
+        "views/tabs/window_finder_win.cc",
+        "views/theme_copying_widget.cc",
+        "views/theme_copying_widget.h",
+        "views/toolbar/app_menu.cc",
+        "views/toolbar/app_menu.h",
+        "views/toolbar/app_menu_button.cc",
+        "views/toolbar/app_menu_button.h",
+        "views/toolbar/app_menu_observer.h",
+        "views/toolbar/back_button.cc",
+        "views/toolbar/back_button.h",
+        "views/toolbar/browser_actions_container.cc",
+        "views/toolbar/browser_actions_container.h",
+        "views/toolbar/extension_toolbar_menu_view.cc",
+        "views/toolbar/extension_toolbar_menu_view.h",
+        "views/toolbar/home_button.cc",
+        "views/toolbar/home_button.h",
+        "views/toolbar/reload_button.cc",
+        "views/toolbar/reload_button.h",
+        "views/toolbar/toolbar_action_view.cc",
+        "views/toolbar/toolbar_action_view.h",
+        "views/toolbar/toolbar_action_view_delegate_views.h",
+        "views/toolbar/toolbar_actions_bar_bubble_views.cc",
+        "views/toolbar/toolbar_actions_bar_bubble_views.h",
+        "views/toolbar/toolbar_button.cc",
+        "views/toolbar/toolbar_button.h",
+        "views/toolbar/toolbar_view.cc",
+        "views/toolbar/toolbar_view.h",
+        "views/touch_uma/touch_uma.h",
+        "views/translate/translate_bubble_view.cc",
+        "views/translate/translate_bubble_view.h",
+        "views/translate/translate_icon_view.cc",
+        "views/translate/translate_icon_view.h",
+        "views/update_recommended_message_box.cc",
+        "views/update_recommended_message_box.h",
+        "views/validation_message_bubble_view.cc",
+        "views/validation_message_bubble_view.h",
+        "views/website_settings/chooser_bubble_ui_view.cc",
+        "views/website_settings/chooser_bubble_ui_view.h",
+        "views/website_settings/permission_prompt_impl_views.cc",
+      ]
       if (use_aura) {
         deps += [
           "//services/ui/public/cpp",
@@ -356,18 +1838,25 @@
         ]
       }
       deps += [ "//ui/views/mus" ]
-
-      if (enable_extensions) {
-        sources += rebase_path(
-                gypi_values.chrome_browser_ui_views_extensions_non_mac_sources,
-                ".",
-                "//chrome")
-      }
     }
     if (use_ash) {
-      sources += rebase_path(gypi_values.chrome_browser_ui_ash_views_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "views/frame/browser_frame_ash.cc",
+        "views/frame/browser_frame_ash.h",
+        "views/frame/browser_header_painter_ash.cc",
+        "views/frame/browser_header_painter_ash.h",
+        "views/frame/browser_non_client_frame_view_ash.cc",
+        "views/frame/browser_non_client_frame_view_ash.h",
+        "views/frame/immersive_context_mus.cc",
+        "views/frame/immersive_context_mus.h",
+        "views/frame/immersive_handler_factory_mus.cc",
+        "views/frame/immersive_handler_factory_mus.h",
+        "views/frame/immersive_mode_controller_ash.cc",
+        "views/frame/immersive_mode_controller_ash.h",
+        "views/frame/web_app_left_header_view_ash.cc",
+        "views/frame/web_app_left_header_view_ash.h",
+        "views/tabs/window_finder_ash.cc",
+      ]
     }
   }
   if (use_gio) {
@@ -381,9 +1870,58 @@
     ]
   }
   if (is_win || is_mac || is_desktop_linux) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_desktop_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "avatar_button_error_controller.cc",
+      "avatar_button_error_controller.h",
+      "avatar_button_error_controller_delegate.h",
+      "startup/default_browser_infobar_delegate.cc",
+      "startup/default_browser_infobar_delegate.h",
+      "startup/default_browser_prompt.cc",
+      "startup/default_browser_prompt.h",
+      "startup/default_browser_prompt_win.cc",
+      "sync/one_click_signin_links_delegate.h",
+      "sync/one_click_signin_links_delegate_impl.cc",
+      "sync/one_click_signin_links_delegate_impl.h",
+      "sync/one_click_signin_sync_observer.cc",
+      "sync/one_click_signin_sync_observer.h",
+      "sync/one_click_signin_sync_starter.cc",
+      "sync/one_click_signin_sync_starter.h",
+      "views/frame/avatar_button_manager.cc",
+      "views/frame/avatar_button_manager.h",
+      "views/profiles/avatar_button_delegate.h",
+      "views/profiles/avatar_button_style.h",
+      "views/profiles/new_avatar_button.cc",
+      "views/profiles/new_avatar_button.h",
+      "webui/app_launcher_page_ui.cc",
+      "webui/app_launcher_page_ui.h",
+      "webui/settings/settings_default_browser_handler.cc",
+      "webui/settings/settings_default_browser_handler.h",
+      "webui/settings/system_handler.cc",
+      "webui/settings/system_handler.h",
+      "webui/settings_utils_linux.cc",
+      "webui/settings_utils_mac.mm",
+      "webui/settings_utils_win.cc",
+      "webui/signin/inline_login_handler.cc",
+      "webui/signin/inline_login_handler.h",
+      "webui/signin/inline_login_handler_impl.cc",
+      "webui/signin/inline_login_handler_impl.h",
+      "webui/signin/inline_login_ui.cc",
+      "webui/signin/inline_login_ui.h",
+      "webui/signin/md_user_manager_ui.cc",
+      "webui/signin/md_user_manager_ui.h",
+      "webui/signin/signin_create_profile_handler.cc",
+      "webui/signin/signin_create_profile_handler.h",
+      "webui/signin/signin_supervised_user_import_handler.cc",
+      "webui/signin/signin_supervised_user_import_handler.h",
+      "webui/signin/sync_confirmation_handler.cc",
+      "webui/signin/sync_confirmation_handler.h",
+      "webui/signin/sync_confirmation_ui.cc",
+      "webui/signin/sync_confirmation_ui.h",
+      "webui/signin/user_manager_screen_handler.cc",
+      "webui/signin/user_manager_screen_handler.h",
+      "webui/signin/user_manager_ui.cc",
+      "webui/signin/user_manager_ui.h",
+    ]
     if (is_mac && !mac_views_browser) {
       sources -= [
         # This is not explicitly excluded in GYP, but I think the static
@@ -397,8 +1935,62 @@
     }
   }
   if (use_aura) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_aura_sources, ".", "//chrome")
+    sources += [
+      "aura/accessibility/automation_manager_aura.cc",
+      "aura/accessibility/automation_manager_aura.h",
+      "aura/accessibility/ax_root_obj_wrapper.cc",
+      "aura/accessibility/ax_root_obj_wrapper.h",
+      "aura/accessibility/ax_tree_source_aura.cc",
+      "aura/accessibility/ax_tree_source_aura.h",
+      "aura/native_window_tracker_aura.cc",
+      "aura/native_window_tracker_aura.h",
+      "aura/tab_contents/web_drag_bookmark_handler_aura.cc",
+      "aura/tab_contents/web_drag_bookmark_handler_aura.h",
+      "ime/ime_window.cc",
+      "ime/ime_window.h",
+      "views/accelerator_utils_aura.cc",
+      "views/apps/app_window_desktop_native_widget_aura_win.cc",
+      "views/apps/app_window_desktop_native_widget_aura_win.h",
+      "views/apps/app_window_desktop_window_tree_host_win.cc",
+      "views/apps/app_window_desktop_window_tree_host_win.h",
+      "views/apps/app_window_easy_resize_window_targeter.cc",
+      "views/apps/app_window_easy_resize_window_targeter.h",
+      "views/apps/chrome_app_window_client_views_chromeos.cc",
+      "views/apps/chrome_app_window_client_views_win.cc",
+      "views/apps/chrome_native_app_window_views_aura.cc",
+      "views/apps/chrome_native_app_window_views_aura.h",
+      "views/apps/chrome_native_app_window_views_win.cc",
+      "views/apps/chrome_native_app_window_views_win.h",
+      "views/apps/glass_app_window_frame_view_win.cc",
+      "views/apps/glass_app_window_frame_view_win.h",
+      "views/apps/shaped_app_window_targeter.cc",
+      "views/apps/shaped_app_window_targeter.h",
+      "views/color_chooser_aura.cc",
+      "views/color_chooser_aura.h",
+      "views/crypto_module_password_dialog_view.cc",
+      "views/crypto_module_password_dialog_view.h",
+      "views/desktop_capture/desktop_media_list_view.cc",
+      "views/desktop_capture/desktop_media_list_view.h",
+      "views/desktop_capture/desktop_media_picker_views.cc",
+      "views/desktop_capture/desktop_media_picker_views.h",
+      "views/desktop_capture/desktop_media_source_view.cc",
+      "views/desktop_capture/desktop_media_source_view.h",
+      "views/desktop_media_picker_views_deprecated.cc",
+      "views/desktop_media_picker_views_deprecated.h",
+      "views/dropdown_bar_host_aura.cc",
+      "views/frame/browser_non_client_frame_view_factory_views.cc",
+      "views/ime/ime_window_frame_view.cc",
+      "views/ime/ime_window_frame_view.h",
+      "views/ime/ime_window_view.cc",
+      "views/ime/ime_window_view.h",
+      "views/renderer_context_menu/render_view_context_menu_views.cc",
+      "views/renderer_context_menu/render_view_context_menu_views.h",
+      "views/sad_tab_view.cc",
+      "views/sad_tab_view.h",
+      "views/tab_contents/chrome_web_contents_view_delegate_views.cc",
+      "views/tab_contents/chrome_web_contents_view_delegate_views.h",
+      "window_sizer/window_sizer_aura.cc",
+    ]
     deps += [
       # aura uses some of ash resources.
       "//ash/resources",
@@ -409,30 +2001,56 @@
       "//ui/wm",
     ]
     if (!is_chromeos) {
-      sources += rebase_path(gypi_values.chrome_browser_ui_aura_non_chromeos,
-                             ".",
-                             "//chrome")
+      sources += [
+        "views/frame/desktop_browser_frame_aura.cc",
+        "views/frame/desktop_browser_frame_aura.h",
+        "views/message_center/message_center_frame_view.cc",
+        "views/message_center/message_center_frame_view.h",
+        "views/message_center/web_notification_tray.cc",
+        "views/message_center/web_notification_tray.h",
+      ]
     }
   }
   if (ui_compositor_image_transport) {
     deps += [ "//ui/gl" ]
   }
   if (use_nss_certs) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_nss_sources, ".", "//chrome")
+    sources += [
+      "crypto_module_delegate_nss.cc",
+      "crypto_module_delegate_nss.h",
+      "crypto_module_password_dialog_nss.cc",
+      "crypto_module_password_dialog_nss.h",
+      "webui/options/certificate_manager_handler.cc",
+      "webui/options/certificate_manager_handler.h",
+      "webui/settings/certificates_handler.cc",
+      "webui/settings/certificates_handler.h",
+    ]
   }
   if (is_mac || is_win) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_non_nss_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "webui/settings/native_certificates_handler.cc",
+      "webui/settings/native_certificates_handler.h",
+    ]
   }
-  if (!enable_themes) {
-    sources -= [ "webui/theme_source.cc" ]
+  if (enable_themes) {
+    sources += [
+      "webui/theme_source.cc",
+      "webui/theme_source.h",
+    ]
   }
   if (enable_print_preview) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_print_preview_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "webui/print_preview/extension_printer_handler.cc",
+      "webui/print_preview/extension_printer_handler.h",
+      "webui/print_preview/print_preview_handler.cc",
+      "webui/print_preview/print_preview_handler.h",
+      "webui/print_preview/print_preview_ui.cc",
+      "webui/print_preview/print_preview_ui.h",
+      "webui/print_preview/printer_handler.cc",
+      "webui/print_preview/printer_handler.h",
+      "webui/print_preview/sticky_settings.cc",
+      "webui/print_preview/sticky_settings.h",
+    ]
   }
 
   if (is_android) {
@@ -445,10 +2063,112 @@
     ]
 
     if (android_java_ui) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_android_java_ui_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "android/autofill/autofill_keyboard_accessory_view.cc",
+        "android/autofill/autofill_keyboard_accessory_view.h",
+        "android/autofill/autofill_logger_android.cc",
+        "android/autofill/autofill_logger_android.h",
+        "android/autofill/autofill_popup_view_android.cc",
+        "android/autofill/autofill_popup_view_android.h",
+        "android/autofill/card_unmask_prompt_view_android.cc",
+        "android/autofill/card_unmask_prompt_view_android.h",
+        "android/autofill/credit_card_scanner_view_android.cc",
+        "android/autofill/credit_card_scanner_view_android.h",
+        "android/autofill/password_generation_popup_view_android.cc",
+        "android/autofill/password_generation_popup_view_android.h",
+        "android/bluetooth_chooser_android.cc",
+        "android/bluetooth_chooser_android.h",
+        "android/certificate_viewer_android.cc",
+        "android/certificate_viewer_android.h",
+        "android/chrome_http_auth_handler.cc",
+        "android/chrome_http_auth_handler.h",
+        "android/color_chooser_dialog_android.cc",
+        "android/connection_info_popup_android.cc",
+        "android/connection_info_popup_android.h",
+        "android/content_settings/popup_blocked_infobar_delegate.cc",
+        "android/content_settings/popup_blocked_infobar_delegate.h",
+        "android/content_settings/subresource_filter_infobar_delegate.cc",
+        "android/content_settings/subresource_filter_infobar_delegate.h",
+        "android/context_menu_helper.cc",
+        "android/context_menu_helper.h",
+        "android/infobars/app_banner_infobar_android.cc",
+        "android/infobars/app_banner_infobar_android.h",
+        "android/infobars/autofill_credit_card_filling_infobar.cc",
+        "android/infobars/autofill_credit_card_filling_infobar.h",
+        "android/infobars/autofill_save_card_infobar.cc",
+        "android/infobars/autofill_save_card_infobar.h",
+        "android/infobars/confirm_infobar.cc",
+        "android/infobars/confirm_infobar.h",
+        "android/infobars/data_reduction_promo_infobar.cc",
+        "android/infobars/data_reduction_promo_infobar.h",
+        "android/infobars/download_overwrite_infobar.cc",
+        "android/infobars/download_overwrite_infobar.h",
+        "android/infobars/generated_password_saved_infobar.cc",
+        "android/infobars/generated_password_saved_infobar.h",
+        "android/infobars/grouped_permission_infobar.cc",
+        "android/infobars/grouped_permission_infobar.h",
+        "android/infobars/infobar_android.cc",
+        "android/infobars/infobar_android.h",
+        "android/infobars/infobar_container_android.cc",
+        "android/infobars/infobar_container_android.h",
+        "android/infobars/instant_apps_infobar.cc",
+        "android/infobars/instant_apps_infobar.h",
+        "android/infobars/permission_infobar.cc",
+        "android/infobars/permission_infobar.h",
+        "android/infobars/save_password_infobar.cc",
+        "android/infobars/save_password_infobar.h",
+        "android/infobars/simple_confirm_infobar_builder.cc",
+        "android/infobars/simple_confirm_infobar_builder.h",
+        "android/infobars/translate_infobar.cc",
+        "android/infobars/translate_infobar.h",
+        "android/infobars/update_password_infobar.cc",
+        "android/infobars/update_password_infobar.h",
+        "android/javascript_app_modal_dialog_android.cc",
+        "android/login_handler_android.cc",
+        "android/omnibox/omnibox_url_emphasizer.cc",
+        "android/omnibox/omnibox_url_emphasizer.h",
+        "android/omnibox/omnibox_view_util.cc",
+        "android/omnibox/omnibox_view_util.h",
+        "android/simple_message_box_android.cc",
+        "android/snackbars/auto_signin_prompt_controller.cc",
+        "android/snackbars/auto_signin_prompt_controller.h",
+        "android/ssl_client_certificate_request.cc",
+        "android/ssl_client_certificate_request.h",
+        "android/tab_contents/chrome_web_contents_view_delegate_android.cc",
+        "android/tab_contents/chrome_web_contents_view_delegate_android.h",
+        "android/tab_model/android_live_tab_context.cc",
+        "android/tab_model/android_live_tab_context.h",
+        "android/tab_model/single_tab_model.cc",
+        "android/tab_model/single_tab_model.h",
+        "android/tab_model/tab_model.cc",
+        "android/tab_model/tab_model.h",
+        "android/tab_model/tab_model_jni_bridge.cc",
+        "android/tab_model/tab_model_jni_bridge.h",
+        "android/tab_model/tab_model_list.cc",
+        "android/tab_model/tab_model_list.h",
+        "android/toolbar/toolbar_model_android.cc",
+        "android/toolbar/toolbar_model_android.h",
+        "android/usb_chooser_dialog_android.cc",
+        "android/usb_chooser_dialog_android.h",
+        "android/view_android_helper.cc",
+        "android/view_android_helper.h",
+        "android/website_settings_popup_android.cc",
+        "android/website_settings_popup_android.h",
+        "browser_otr_state_android.cc",
+        "screen_capture_notification_ui_stub.cc",
+        "webui/offline/offline_internals_ui.cc",
+        "webui/offline/offline_internals_ui.h",
+        "webui/offline/offline_internals_ui_message_handler.cc",
+        "webui/offline/offline_internals_ui_message_handler.h",
+        "webui/popular_sites_internals_message_handler.cc",
+        "webui/popular_sites_internals_message_handler.h",
+        "webui/popular_sites_internals_ui.cc",
+        "webui/popular_sites_internals_ui.h",
+        "webui/snippets_internals_message_handler.cc",
+        "webui/snippets_internals_message_handler.h",
+        "webui/snippets_internals_ui.cc",
+        "webui/snippets_internals_ui.h",
+      ]
       deps += [
         "//chrome/browser:jni_headers",
         "//components/web_contents_delegate_android",
@@ -460,8 +2180,103 @@
   }
 
   if (is_mac) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_mac_sources, ".", "//chrome")
+    sources += [
+      "certificate_viewer_mac.h",
+      "certificate_viewer_mac.mm",
+      "chrome_style.cc",
+      "chrome_style.h",
+      "cocoa/accelerator_utils_cocoa.mm",
+      "cocoa/accelerators_cocoa.h",
+      "cocoa/accelerators_cocoa.mm",
+      "cocoa/apps/app_shim_menu_controller_mac.h",
+      "cocoa/apps/app_shim_menu_controller_mac.mm",
+      "cocoa/apps/quit_with_apps_controller_mac.cc",
+      "cocoa/apps/quit_with_apps_controller_mac.h",
+      "cocoa/apps/titlebar_background_view.h",
+      "cocoa/apps/titlebar_background_view.mm",
+      "cocoa/bookmarks/bookmark_menu_bridge.h",
+      "cocoa/bookmarks/bookmark_menu_bridge.mm",
+      "cocoa/bookmarks/bookmark_menu_cocoa_controller.h",
+      "cocoa/bookmarks/bookmark_menu_cocoa_controller.mm",
+      "cocoa/browser_window_command_handler.h",
+      "cocoa/browser_window_command_handler.mm",
+      "cocoa/chrome_command_dispatcher_delegate.h",
+      "cocoa/chrome_command_dispatcher_delegate.mm",
+      "cocoa/color_chooser_mac.mm",
+      "cocoa/confirm_quit.h",
+      "cocoa/confirm_quit_panel_controller.h",
+      "cocoa/confirm_quit_panel_controller.mm",
+      "cocoa/dock_icon.h",
+      "cocoa/dock_icon.mm",
+      "cocoa/download/download_item_drag_mac.mm",
+      "cocoa/download/download_util_mac.h",
+      "cocoa/download/download_util_mac.mm",
+      "cocoa/first_run_dialog.h",
+      "cocoa/first_run_dialog.mm",
+      "cocoa/handoff_active_url_observer.cc",
+      "cocoa/handoff_active_url_observer.h",
+      "cocoa/handoff_active_url_observer_bridge.h",
+      "cocoa/handoff_active_url_observer_bridge.mm",
+      "cocoa/handoff_active_url_observer_delegate.h",
+      "cocoa/history_menu_bridge.h",
+      "cocoa/history_menu_bridge.mm",
+      "cocoa/history_menu_cocoa_controller.h",
+      "cocoa/history_menu_cocoa_controller.mm",
+      "cocoa/history_overlay_controller.h",
+      "cocoa/history_overlay_controller.mm",
+      "cocoa/key_equivalent_constants.h",
+      "cocoa/key_equivalent_constants.mm",
+      "cocoa/keystone_infobar_delegate.h",
+      "cocoa/keystone_infobar_delegate.mm",
+      "cocoa/l10n_util.h",
+      "cocoa/l10n_util.mm",
+      "cocoa/last_active_browser_cocoa.cc",
+      "cocoa/last_active_browser_cocoa.h",
+      "cocoa/media_picker/desktop_media_picker_bridge.h",
+      "cocoa/media_picker/desktop_media_picker_bridge.mm",
+      "cocoa/media_picker/desktop_media_picker_cocoa.h",
+      "cocoa/media_picker/desktop_media_picker_cocoa.mm",
+      "cocoa/media_picker/desktop_media_picker_controller.h",
+      "cocoa/media_picker/desktop_media_picker_controller.mm",
+      "cocoa/media_picker/desktop_media_picker_controller_deprecated.h",
+      "cocoa/media_picker/desktop_media_picker_controller_deprecated.mm",
+      "cocoa/media_picker/desktop_media_picker_item.h",
+      "cocoa/media_picker/desktop_media_picker_item.mm",
+      "cocoa/native_window_tracker_cocoa.h",
+      "cocoa/native_window_tracker_cocoa.mm",
+      "cocoa/notifications/message_center_tray_bridge.h",
+      "cocoa/notifications/message_center_tray_bridge.mm",
+      "cocoa/nsmenuitem_additions.h",
+      "cocoa/nsmenuitem_additions.mm",
+      "cocoa/profiles/profile_menu_controller.h",
+      "cocoa/profiles/profile_menu_controller.mm",
+      "cocoa/renderer_context_menu/render_view_context_menu_mac.h",
+      "cocoa/renderer_context_menu/render_view_context_menu_mac.mm",
+      "cocoa/status_icons/status_icon_mac.h",
+      "cocoa/status_icons/status_icon_mac.mm",
+      "cocoa/status_icons/status_tray_mac.h",
+      "cocoa/status_icons/status_tray_mac.mm",
+      "cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h",
+      "cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm",
+      "cocoa/tab_contents/sad_tab_controller.h",
+      "cocoa/tab_contents/sad_tab_controller.mm",
+      "cocoa/tab_contents/sad_tab_view_cocoa.h",
+      "cocoa/tab_contents/sad_tab_view_cocoa.mm",
+      "cocoa/tab_contents/web_drag_bookmark_handler_mac.h",
+      "cocoa/tab_contents/web_drag_bookmark_handler_mac.mm",
+      "cocoa/ui_localizer.h",
+      "cocoa/ui_localizer.mm",
+      "cocoa/web_contents_modal_dialog_host_cocoa.h",
+      "cocoa/web_contents_modal_dialog_host_cocoa.mm",
+
+      # TODO(estade): this class should be folded into
+      # manage_passwords_decoration.mm
+      "passwords/manage_passwords_icon.cc",
+      "passwords/manage_passwords_icon.h",
+      "web_contents_sizer.mm",
+      "webui/cast/cast_ui.cc",
+      "webui/cast/cast_ui.h",
+    ]
     deps += [
       ":generate_localizer",
       "//third_party/apple_sample_code",
@@ -471,29 +2286,579 @@
       "//ui/accelerated_widget_mac:accelerated_widget_mac",
     ]
     if (mac_views_browser) {
-      sources += rebase_path(
-              gypi_values.chrome_browser_ui_views_mac_experimental_sources,
-              ".",
-              "//chrome")
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_views_non_mac_sources,
-                      ".",
-                      "//chrome")
-      sources += rebase_path(
-              gypi_values.chrome_browser_ui_views_extensions_non_mac_sources,
-              ".",
-              "//chrome")
-
-      sources -= [
-        "views/extensions/extension_popup_aura.cc",
-        "views/extensions/extension_popup_aura.h",
+      # MacViews sources that we still want to keep behind a compile-time flag.
+      # TODO(jackhou): Move items to general views sources out of here.
+      sources += [
+        "views/apps/chrome_app_window_client_views_mac.mm",
+        "views/certificate_viewer_mac_views.mm",
+        "views/dropdown_bar_host_mac.mm",
+        "views/frame/browser_frame_mac.h",
+        "views/frame/browser_frame_mac.mm",
+        "views/frame/browser_non_client_frame_view_factory_mac.mm",
+        "views/frame/browser_non_client_frame_view_mac.h",
+        "views/frame/browser_non_client_frame_view_mac.mm",
+        "views/frame/native_browser_frame_factory_mac.mm",
+        "views/infobars/legacy_infobars_mac.cc",
+        "views/tabs/window_finder_mac.mm",
       ]
-
       deps += [ "//extensions/components/native_app_window" ]
     } else {
-      sources += rebase_path(gypi_values.chrome_browser_ui_cocoa_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "cocoa/animatable_image.h",
+        "cocoa/animatable_image.mm",
+        "cocoa/animatable_view.h",
+        "cocoa/animatable_view.mm",
+        "cocoa/app_menu/app_menu_button_cell.h",
+        "cocoa/app_menu/app_menu_button_cell.mm",
+        "cocoa/app_menu/app_menu_controller.h",
+        "cocoa/app_menu/app_menu_controller.mm",
+        "cocoa/app_menu/menu_tracked_button.h",
+        "cocoa/app_menu/menu_tracked_button.mm",
+        "cocoa/app_menu/menu_tracked_root_view.h",
+        "cocoa/app_menu/menu_tracked_root_view.mm",
+        "cocoa/app_menu/recent_tabs_menu_model_delegate.h",
+        "cocoa/app_menu/recent_tabs_menu_model_delegate.mm",
+        "cocoa/applescript/apple_event_util.h",
+        "cocoa/applescript/apple_event_util.mm",
+        "cocoa/applescript/bookmark_folder_applescript.h",
+        "cocoa/applescript/bookmark_folder_applescript.mm",
+        "cocoa/applescript/bookmark_item_applescript.h",
+        "cocoa/applescript/bookmark_item_applescript.mm",
+        "cocoa/applescript/bookmark_node_applescript.h",
+        "cocoa/applescript/bookmark_node_applescript.mm",
+        "cocoa/applescript/browsercrapplication+applescript.h",
+        "cocoa/applescript/browsercrapplication+applescript.mm",
+        "cocoa/applescript/constants_applescript.h",
+        "cocoa/applescript/constants_applescript.mm",
+        "cocoa/applescript/element_applescript.h",
+        "cocoa/applescript/element_applescript.mm",
+        "cocoa/applescript/error_applescript.h",
+        "cocoa/applescript/error_applescript.mm",
+        "cocoa/applescript/metrics_applescript.h",
+        "cocoa/applescript/metrics_applescript.mm",
+        "cocoa/applescript/tab_applescript.h",
+        "cocoa/applescript/tab_applescript.mm",
+        "cocoa/applescript/window_applescript.h",
+        "cocoa/applescript/window_applescript.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/autofill/autofill_bubble_controller.h",
+        "cocoa/autofill/autofill_bubble_controller.mm",
+        "cocoa/autofill/autofill_layout.h",
+        "cocoa/autofill/autofill_pop_up_button.h",
+        "cocoa/autofill/autofill_pop_up_button.mm",
+        "cocoa/autofill/autofill_popup_base_view_cocoa.h",
+        "cocoa/autofill/autofill_popup_base_view_cocoa.mm",
+        "cocoa/autofill/autofill_popup_view_bridge.h",
+        "cocoa/autofill/autofill_popup_view_bridge.mm",
+        "cocoa/autofill/autofill_popup_view_cocoa.h",
+        "cocoa/autofill/autofill_popup_view_cocoa.mm",
+        "cocoa/autofill/autofill_textfield.h",
+        "cocoa/autofill/autofill_textfield.mm",
+        "cocoa/autofill/autofill_tooltip_controller.h",
+        "cocoa/autofill/autofill_tooltip_controller.mm",
+        "cocoa/autofill/card_unmask_prompt_view_bridge.h",
+        "cocoa/autofill/card_unmask_prompt_view_bridge.mm",
+        "cocoa/autofill/card_unmask_prompt_view_views.mm",
+        "cocoa/autofill/down_arrow_popup_menu_cell.h",
+        "cocoa/autofill/down_arrow_popup_menu_cell.mm",
+        "cocoa/autofill/layout_view.h",
+        "cocoa/autofill/layout_view.mm",
+        "cocoa/autofill/password_generation_popup_view_bridge.h",
+        "cocoa/autofill/password_generation_popup_view_bridge.mm",
+        "cocoa/autofill/password_generation_popup_view_cocoa.h",
+        "cocoa/autofill/password_generation_popup_view_cocoa.mm",
+        "cocoa/autofill/save_card_bubble_view_bridge.h",
+        "cocoa/autofill/save_card_bubble_view_bridge.mm",
+        "cocoa/autofill/simple_grid_layout.h",
+        "cocoa/autofill/simple_grid_layout.mm",
+        "cocoa/background_gradient_view.h",
+        "cocoa/background_gradient_view.mm",
+        "cocoa/base_bubble_controller.h",
+        "cocoa/base_bubble_controller.mm",
+        "cocoa/bookmarks/bookmark_all_tabs_controller.h",
+        "cocoa/bookmarks/bookmark_all_tabs_controller.mm",
+        "cocoa/bookmarks/bookmark_bar_bridge.h",
+        "cocoa/bookmarks/bookmark_bar_bridge.mm",
+        "cocoa/bookmarks/bookmark_bar_constants.h",
+        "cocoa/bookmarks/bookmark_bar_controller.h",
+        "cocoa/bookmarks/bookmark_bar_controller.mm",
+        "cocoa/bookmarks/bookmark_bar_folder_button_cell.h",
+        "cocoa/bookmarks/bookmark_bar_folder_button_cell.mm",
+        "cocoa/bookmarks/bookmark_bar_folder_controller.h",
+        "cocoa/bookmarks/bookmark_bar_folder_controller.mm",
+        "cocoa/bookmarks/bookmark_bar_folder_hover_state.h",
+        "cocoa/bookmarks/bookmark_bar_folder_hover_state.mm",
+        "cocoa/bookmarks/bookmark_bar_folder_view.h",
+        "cocoa/bookmarks/bookmark_bar_folder_view.mm",
+        "cocoa/bookmarks/bookmark_bar_folder_window.h",
+        "cocoa/bookmarks/bookmark_bar_folder_window.mm",
+        "cocoa/bookmarks/bookmark_bar_state.h",
+        "cocoa/bookmarks/bookmark_bar_toolbar_view.h",
+        "cocoa/bookmarks/bookmark_bar_toolbar_view.mm",
+        "cocoa/bookmarks/bookmark_bar_view_cocoa.h",
+        "cocoa/bookmarks/bookmark_bar_view_cocoa.mm",
+        "cocoa/bookmarks/bookmark_bubble_controller.h",
+        "cocoa/bookmarks/bookmark_bubble_controller.mm",
+        "cocoa/bookmarks/bookmark_bubble_observer_cocoa.h",
+        "cocoa/bookmarks/bookmark_bubble_observer_cocoa.mm",
+        "cocoa/bookmarks/bookmark_button.h",
+        "cocoa/bookmarks/bookmark_button.mm",
+        "cocoa/bookmarks/bookmark_button_cell.h",
+        "cocoa/bookmarks/bookmark_button_cell.mm",
+        "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.h",
+        "cocoa/bookmarks/bookmark_context_menu_cocoa_controller.mm",
+        "cocoa/bookmarks/bookmark_drag_drop_cocoa.mm",
+        "cocoa/bookmarks/bookmark_editor_base_controller.h",
+        "cocoa/bookmarks/bookmark_editor_base_controller.mm",
+        "cocoa/bookmarks/bookmark_editor_controller.h",
+        "cocoa/bookmarks/bookmark_editor_controller.mm",
+        "cocoa/bookmarks/bookmark_folder_target.h",
+        "cocoa/bookmarks/bookmark_folder_target.mm",
+        "cocoa/bookmarks/bookmark_model_observer_for_cocoa.h",
+        "cocoa/bookmarks/bookmark_model_observer_for_cocoa.mm",
+        "cocoa/bookmarks/bookmark_name_folder_controller.h",
+        "cocoa/bookmarks/bookmark_name_folder_controller.mm",
+        "cocoa/bookmarks/bookmark_tree_browser_cell.h",
+        "cocoa/bookmarks/bookmark_tree_browser_cell.mm",
+        "cocoa/browser/exclusive_access_controller_views.h",
+        "cocoa/browser/exclusive_access_controller_views.mm",
+        "cocoa/browser/zoom_bubble_controller.h",
+        "cocoa/browser/zoom_bubble_controller.mm",
+        "cocoa/browser_window_cocoa.h",
+        "cocoa/browser_window_cocoa.mm",
+        "cocoa/browser_window_controller.h",
+        "cocoa/browser_window_controller.mm",
+        "cocoa/browser_window_controller_private.h",
+        "cocoa/browser_window_controller_private.mm",
+        "cocoa/browser_window_factory_cocoa.mm",
+        "cocoa/browser_window_fullscreen_transition.h",
+        "cocoa/browser_window_fullscreen_transition.mm",
+        "cocoa/browser_window_layout.h",
+        "cocoa/browser_window_layout.mm",
+        "cocoa/browser_window_utils.h",
+        "cocoa/browser_window_utils.mm",
+        "cocoa/bubble_combobox.h",
+        "cocoa/bubble_combobox.mm",
+        "cocoa/bubble_sync_promo_controller.h",
+        "cocoa/bubble_sync_promo_controller.mm",
+        "cocoa/bubble_view.h",
+        "cocoa/bubble_view.mm",
+        "cocoa/certificate_viewer_mac_cocoa.h",
+        "cocoa/certificate_viewer_mac_cocoa.mm",
+        "cocoa/chooser_content_view_cocoa.h",
+        "cocoa/chooser_content_view_cocoa.mm",
+        "cocoa/chrome_browser_window.h",
+        "cocoa/chrome_browser_window.mm",
+        "cocoa/chrome_event_processing_window.h",
+        "cocoa/chrome_event_processing_window.mm",
+        "cocoa/clickhold_button_cell.h",
+        "cocoa/clickhold_button_cell.mm",
+        "cocoa/confirm_bubble_cocoa.h",
+        "cocoa/confirm_bubble_cocoa.mm",
+        "cocoa/confirm_bubble_controller.h",
+        "cocoa/confirm_bubble_controller.mm",
+        "cocoa/constrained_web_dialog_delegate_mac.mm",
+        "cocoa/constrained_window/constrained_window_alert.h",
+        "cocoa/constrained_window/constrained_window_alert.mm",
+        "cocoa/constrained_window/constrained_window_button.h",
+        "cocoa/constrained_window/constrained_window_button.mm",
+        "cocoa/constrained_window/constrained_window_control_utils.h",
+        "cocoa/constrained_window/constrained_window_control_utils.mm",
+        "cocoa/constrained_window/constrained_window_custom_sheet.h",
+        "cocoa/constrained_window/constrained_window_custom_sheet.mm",
+        "cocoa/constrained_window/constrained_window_custom_window.h",
+        "cocoa/constrained_window/constrained_window_custom_window.mm",
+        "cocoa/constrained_window/constrained_window_mac.h",
+        "cocoa/constrained_window/constrained_window_mac.mm",
+        "cocoa/constrained_window/constrained_window_sheet.h",
+        "cocoa/constrained_window/constrained_window_sheet_controller.h",
+        "cocoa/constrained_window/constrained_window_sheet_controller.mm",
+        "cocoa/constrained_window/constrained_window_sheet_info.h",
+        "cocoa/constrained_window/constrained_window_sheet_info.mm",
+        "cocoa/constrained_window/constrained_window_web_dialog_sheet.h",
+        "cocoa/constrained_window/constrained_window_web_dialog_sheet.mm",
+        "cocoa/content_settings/collected_cookies_mac.h",
+        "cocoa/content_settings/collected_cookies_mac.mm",
+        "cocoa/content_settings/content_setting_bubble_cocoa.h",
+        "cocoa/content_settings/content_setting_bubble_cocoa.mm",
+        "cocoa/content_settings/cookie_details.h",
+        "cocoa/content_settings/cookie_details.mm",
+        "cocoa/content_settings/cookie_details_view_controller.h",
+        "cocoa/content_settings/cookie_details_view_controller.mm",
+        "cocoa/content_settings/cookie_tree_node.h",
+        "cocoa/content_settings/cookie_tree_node.mm",
+        "cocoa/content_settings/cookies_tree_controller_bridge.h",
+        "cocoa/content_settings/cookies_tree_controller_bridge.mm",
+        "cocoa/create_application_shortcut_cocoa.mm",
+        "cocoa/create_native_web_modal_manager_cocoa.mm",
+        "cocoa/custom_frame_view.h",
+        "cocoa/custom_frame_view.mm",
+        "cocoa/dev_tools_controller.h",
+        "cocoa/dev_tools_controller.mm",
+        "cocoa/download/background_theme.h",
+        "cocoa/download/background_theme.mm",
+        "cocoa/download/download_danger_prompt_impl.cc",
+        "cocoa/download/download_danger_prompt_impl.h",
+        "cocoa/download/download_item_button.h",
+        "cocoa/download/download_item_button.mm",
+        "cocoa/download/download_item_cell.h",
+        "cocoa/download/download_item_cell.mm",
+        "cocoa/download/download_item_controller.h",
+        "cocoa/download/download_item_controller.mm",
+        "cocoa/download/download_item_mac.h",
+        "cocoa/download/download_item_mac.mm",
+        "cocoa/download/download_shelf_context_menu_controller.h",
+        "cocoa/download/download_shelf_context_menu_controller.mm",
+        "cocoa/download/download_shelf_controller.h",
+        "cocoa/download/download_shelf_controller.mm",
+        "cocoa/download/download_shelf_mac.h",
+        "cocoa/download/download_shelf_mac.mm",
+        "cocoa/download/download_shelf_view_cocoa.h",
+        "cocoa/download/download_shelf_view_cocoa.mm",
+        "cocoa/download/download_show_all_button.h",
+        "cocoa/download/download_show_all_button.mm",
+        "cocoa/download/download_show_all_cell.h",
+        "cocoa/download/download_show_all_cell.mm",
+        "cocoa/download/download_started_animation_mac.mm",
+        "cocoa/drag_util.h",
+        "cocoa/drag_util.mm",
+        "cocoa/draggable_button.h",
+        "cocoa/draggable_button.mm",
+        "cocoa/draggable_button_mixin.h",
+        "cocoa/draggable_button_mixin.mm",
+        "cocoa/extensions/browser_action_button.h",
+        "cocoa/extensions/browser_action_button.mm",
+        "cocoa/extensions/browser_actions_container_view.h",
+        "cocoa/extensions/browser_actions_container_view.mm",
+        "cocoa/extensions/browser_actions_controller.h",
+        "cocoa/extensions/browser_actions_controller.mm",
+        "cocoa/extensions/chooser_dialog_cocoa.h",
+        "cocoa/extensions/chooser_dialog_cocoa.mm",
+        "cocoa/extensions/chooser_dialog_cocoa_controller.h",
+        "cocoa/extensions/chooser_dialog_cocoa_controller.mm",
+        "cocoa/extensions/device_permissions_dialog_controller.h",
+        "cocoa/extensions/device_permissions_dialog_controller.mm",
+        "cocoa/extensions/device_permissions_view_controller.h",
+        "cocoa/extensions/device_permissions_view_controller.mm",
+        "cocoa/extensions/extension_action_platform_delegate_cocoa.h",
+        "cocoa/extensions/extension_action_platform_delegate_cocoa.mm",
+        "cocoa/extensions/extension_install_dialog_controller.h",
+        "cocoa/extensions/extension_install_dialog_controller.mm",
+        "cocoa/extensions/extension_install_view_controller.h",
+        "cocoa/extensions/extension_install_view_controller.mm",
+        "cocoa/extensions/extension_installed_bubble_controller.h",
+        "cocoa/extensions/extension_installed_bubble_controller.mm",
+        "cocoa/extensions/extension_keybinding_registry_cocoa.h",
+        "cocoa/extensions/extension_keybinding_registry_cocoa.mm",
+        "cocoa/extensions/extension_popup_controller.h",
+        "cocoa/extensions/extension_popup_controller.mm",
+        "cocoa/extensions/extension_uninstall_dialog_cocoa.mm",
+        "cocoa/extensions/extension_view_mac.h",
+        "cocoa/extensions/extension_view_mac.mm",
+        "cocoa/extensions/media_galleries_dialog_cocoa.h",
+        "cocoa/extensions/media_galleries_dialog_cocoa.mm",
+        "cocoa/extensions/media_gallery_list_entry_view.h",
+        "cocoa/extensions/media_gallery_list_entry_view.mm",
+        "cocoa/extensions/toolbar_actions_bar_bubble_mac.h",
+        "cocoa/extensions/toolbar_actions_bar_bubble_mac.mm",
+        "cocoa/extensions/windowed_install_dialog_controller.h",
+        "cocoa/extensions/windowed_install_dialog_controller.mm",
+        "cocoa/external_protocol_dialog.h",
+        "cocoa/external_protocol_dialog.mm",
+        "cocoa/fast_resize_view.h",
+        "cocoa/fast_resize_view.mm",
+        "cocoa/find_bar/find_bar_bridge.h",
+        "cocoa/find_bar/find_bar_bridge.mm",
+        "cocoa/find_bar/find_bar_cocoa_controller.h",
+        "cocoa/find_bar/find_bar_cocoa_controller.mm",
+        "cocoa/find_bar/find_bar_text_field.h",
+        "cocoa/find_bar/find_bar_text_field.mm",
+        "cocoa/find_bar/find_bar_text_field_cell.h",
+        "cocoa/find_bar/find_bar_text_field_cell.mm",
+        "cocoa/find_bar/find_bar_view_cocoa.h",
+        "cocoa/find_bar/find_bar_view_cocoa.mm",
+        "cocoa/first_run_bubble_controller.h",
+        "cocoa/first_run_bubble_controller.mm",
+        "cocoa/floating_bar_backing_view.h",
+        "cocoa/floating_bar_backing_view.mm",
+        "cocoa/framed_browser_window.h",
+        "cocoa/framed_browser_window.mm",
+        "cocoa/full_size_content_window.h",
+        "cocoa/full_size_content_window.mm",
+        "cocoa/fullscreen_low_power_coordinator.h",
+        "cocoa/fullscreen_low_power_coordinator.mm",
+        "cocoa/fullscreen_toolbar_controller.h",
+        "cocoa/fullscreen_toolbar_controller.mm",
+        "cocoa/fullscreen_window.h",
+        "cocoa/fullscreen_window.mm",
+        "cocoa/global_error_bubble_controller.h",
+        "cocoa/global_error_bubble_controller.mm",
+        "cocoa/gradient_button_cell.h",
+        "cocoa/gradient_button_cell.mm",
+        "cocoa/has_weak_browser_pointer.h",
+        "cocoa/hover_close_button.h",
+        "cocoa/hover_close_button.mm",
+        "cocoa/hung_renderer_controller.h",
+        "cocoa/hung_renderer_controller.mm",
+        "cocoa/image_button_cell.h",
+        "cocoa/image_button_cell.mm",
+        "cocoa/importer/import_lock_dialog_cocoa.mm",
+        "cocoa/info_bubble_view.h",
+        "cocoa/info_bubble_view.mm",
+        "cocoa/info_bubble_window.h",
+        "cocoa/info_bubble_window.mm",
+        "cocoa/infobars/after_translate_infobar_controller.h",
+        "cocoa/infobars/after_translate_infobar_controller.mm",
+        "cocoa/infobars/alternate_nav_infobar_controller.h",
+        "cocoa/infobars/alternate_nav_infobar_controller.mm",
+        "cocoa/infobars/before_translate_infobar_controller.h",
+        "cocoa/infobars/before_translate_infobar_controller.mm",
+        "cocoa/infobars/confirm_infobar_controller.h",
+        "cocoa/infobars/confirm_infobar_controller.mm",
+        "cocoa/infobars/infobar_cocoa.h",
+        "cocoa/infobars/infobar_cocoa.mm",
+        "cocoa/infobars/infobar_container_cocoa.h",
+        "cocoa/infobars/infobar_container_cocoa.mm",
+        "cocoa/infobars/infobar_container_controller.h",
+        "cocoa/infobars/infobar_container_controller.mm",
+        "cocoa/infobars/infobar_controller.h",
+        "cocoa/infobars/infobar_controller.mm",
+        "cocoa/infobars/infobar_gradient_view.h",
+        "cocoa/infobars/infobar_gradient_view.mm",
+        "cocoa/infobars/infobar_utilities.h",
+        "cocoa/infobars/infobar_utilities.mm",
+        "cocoa/infobars/translate_infobar_base.h",
+        "cocoa/infobars/translate_infobar_base.mm",
+        "cocoa/infobars/translate_message_infobar_controller.h",
+        "cocoa/infobars/translate_message_infobar_controller.mm",
+        "cocoa/javascript_app_modal_dialog_cocoa.h",
+        "cocoa/javascript_app_modal_dialog_cocoa.mm",
+        "cocoa/location_bar/autocomplete_text_field.h",
+        "cocoa/location_bar/autocomplete_text_field.mm",
+        "cocoa/location_bar/autocomplete_text_field_cell.h",
+        "cocoa/location_bar/autocomplete_text_field_cell.mm",
+        "cocoa/location_bar/autocomplete_text_field_editor.h",
+        "cocoa/location_bar/autocomplete_text_field_editor.mm",
+        "cocoa/location_bar/bubble_decoration.h",
+        "cocoa/location_bar/bubble_decoration.mm",
+        "cocoa/location_bar/content_setting_decoration.h",
+        "cocoa/location_bar/content_setting_decoration.mm",
+        "cocoa/location_bar/ev_bubble_decoration.h",
+        "cocoa/location_bar/ev_bubble_decoration.mm",
+        "cocoa/location_bar/image_decoration.h",
+        "cocoa/location_bar/image_decoration.mm",
+        "cocoa/location_bar/keyword_hint_decoration.h",
+        "cocoa/location_bar/keyword_hint_decoration.mm",
+        "cocoa/location_bar/location_bar_decoration.h",
+        "cocoa/location_bar/location_bar_decoration.mm",
+        "cocoa/location_bar/location_bar_view_mac.h",
+        "cocoa/location_bar/location_bar_view_mac.mm",
+        "cocoa/location_bar/location_icon_decoration.h",
+        "cocoa/location_bar/location_icon_decoration.mm",
+        "cocoa/location_bar/manage_passwords_decoration.h",
+        "cocoa/location_bar/manage_passwords_decoration.mm",
+        "cocoa/location_bar/page_action_decoration.h",
+        "cocoa/location_bar/page_action_decoration.mm",
+        "cocoa/location_bar/save_credit_card_decoration.h",
+        "cocoa/location_bar/save_credit_card_decoration.mm",
+        "cocoa/location_bar/selected_keyword_decoration.h",
+        "cocoa/location_bar/selected_keyword_decoration.mm",
+        "cocoa/location_bar/star_decoration.h",
+        "cocoa/location_bar/star_decoration.mm",
+        "cocoa/location_bar/translate_decoration.h",
+        "cocoa/location_bar/translate_decoration.mm",
+        "cocoa/location_bar/zoom_decoration.h",
+        "cocoa/location_bar/zoom_decoration.mm",
+        "cocoa/login_handler_cocoa.h",
+        "cocoa/login_handler_cocoa.mm",
+        "cocoa/main_menu_item.h",
+        "cocoa/menu_button.h",
+        "cocoa/menu_button.mm",
+        "cocoa/multi_key_equivalent_button.h",
+        "cocoa/multi_key_equivalent_button.mm",
+        "cocoa/new_tab_button.h",
+        "cocoa/new_tab_button.mm",
+        "cocoa/omnibox/omnibox_popup_cell.h",
+        "cocoa/omnibox/omnibox_popup_cell.mm",
+        "cocoa/omnibox/omnibox_popup_matrix.h",
+        "cocoa/omnibox/omnibox_popup_matrix.mm",
+        "cocoa/omnibox/omnibox_popup_separator_view.h",
+        "cocoa/omnibox/omnibox_popup_separator_view.mm",
+        "cocoa/omnibox/omnibox_popup_view_mac.h",
+        "cocoa/omnibox/omnibox_popup_view_mac.mm",
+        "cocoa/omnibox/omnibox_view_mac.h",
+        "cocoa/omnibox/omnibox_view_mac.mm",
+        "cocoa/one_click_signin_dialog_controller.h",
+        "cocoa/one_click_signin_dialog_controller.mm",
+        "cocoa/one_click_signin_view_controller.h",
+        "cocoa/one_click_signin_view_controller.mm",
+        "cocoa/passwords/account_avatar_fetcher_manager.h",
+        "cocoa/passwords/account_avatar_fetcher_manager.mm",
+        "cocoa/passwords/account_chooser_view_controller.h",
+        "cocoa/passwords/account_chooser_view_controller.mm",
+        "cocoa/passwords/auto_signin_view_controller.h",
+        "cocoa/passwords/auto_signin_view_controller.mm",
+        "cocoa/passwords/autosignin_prompt_view_controller.h",
+        "cocoa/passwords/autosignin_prompt_view_controller.mm",
+        "cocoa/passwords/base_passwords_content_view_controller.h",
+        "cocoa/passwords/base_passwords_content_view_controller.mm",
+        "cocoa/passwords/confirmation_password_saved_view_controller.h",
+        "cocoa/passwords/confirmation_password_saved_view_controller.mm",
+        "cocoa/passwords/credential_item_button.h",
+        "cocoa/passwords/credential_item_button.mm",
+        "cocoa/passwords/credentials_selection_view.h",
+        "cocoa/passwords/credentials_selection_view.mm",
+        "cocoa/passwords/manage_passwords_view_controller.h",
+        "cocoa/passwords/manage_passwords_view_controller.mm",
+        "cocoa/passwords/password_item_views.h",
+        "cocoa/passwords/password_prompt_view_bridge.h",
+        "cocoa/passwords/password_prompt_view_bridge.mm",
+        "cocoa/passwords/passwords_bubble_cocoa.h",
+        "cocoa/passwords/passwords_bubble_cocoa.mm",
+        "cocoa/passwords/passwords_bubble_controller.h",
+        "cocoa/passwords/passwords_bubble_controller.mm",
+        "cocoa/passwords/passwords_bubble_utils.h",
+        "cocoa/passwords/passwords_bubble_utils.mm",
+        "cocoa/passwords/passwords_list_view_controller.h",
+        "cocoa/passwords/passwords_list_view_controller.mm",
+        "cocoa/passwords/pending_password_view_controller.h",
+        "cocoa/passwords/pending_password_view_controller.mm",
+        "cocoa/passwords/save_pending_password_view_controller.h",
+        "cocoa/passwords/save_pending_password_view_controller.mm",
+        "cocoa/passwords/signin_promo_view_controller.h",
+        "cocoa/passwords/signin_promo_view_controller.mm",
+        "cocoa/passwords/update_pending_password_view_controller.h",
+        "cocoa/passwords/update_pending_password_view_controller.mm",
+        "cocoa/profiles/avatar_base_controller.h",
+        "cocoa/profiles/avatar_base_controller.mm",
+        "cocoa/profiles/avatar_button.h",
+        "cocoa/profiles/avatar_button.mm",
+        "cocoa/profiles/avatar_button_controller.h",
+        "cocoa/profiles/avatar_button_controller.mm",
+        "cocoa/profiles/avatar_icon_controller.h",
+        "cocoa/profiles/avatar_icon_controller.mm",
+        "cocoa/profiles/avatar_menu_bubble_controller.h",
+        "cocoa/profiles/avatar_menu_bubble_controller.mm",
+        "cocoa/profiles/profile_chooser_controller.h",
+        "cocoa/profiles/profile_chooser_controller.mm",
+        "cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h",
+        "cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm",
+        "cocoa/profiles/profile_signin_confirmation_view_controller.h",
+        "cocoa/profiles/profile_signin_confirmation_view_controller.mm",
+        "cocoa/profiles/signin_view_controller_delegate_mac.h",
+        "cocoa/profiles/signin_view_controller_delegate_mac.mm",
+        "cocoa/profiles/user_manager_mac.h",
+        "cocoa/profiles/user_manager_mac.mm",
+        "cocoa/rect_path_utils.h",
+        "cocoa/rect_path_utils.mm",
+        "cocoa/restart_browser.h",
+        "cocoa/restart_browser.mm",
+        "cocoa/screen_capture_notification_ui_cocoa.h",
+        "cocoa/screen_capture_notification_ui_cocoa.mm",
+        "cocoa/session_crashed_bubble.mm",
+        "cocoa/simple_message_box_mac.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/sprite_view.h",
+        "cocoa/sprite_view.mm",
+        "cocoa/ssl_client_certificate_selector_cocoa.h",
+        "cocoa/ssl_client_certificate_selector_cocoa.mm",
+        "cocoa/status_bubble_mac.h",
+        "cocoa/status_bubble_mac.mm",
+        "cocoa/styled_text_field.h",
+        "cocoa/styled_text_field.mm",
+        "cocoa/styled_text_field_cell.h",
+        "cocoa/styled_text_field_cell.mm",
+        "cocoa/tab_contents/favicon_util_mac.h",
+        "cocoa/tab_contents/favicon_util_mac.mm",
+        "cocoa/tab_contents/overlayable_contents_controller.h",
+        "cocoa/tab_contents/overlayable_contents_controller.mm",
+        "cocoa/tab_contents/tab_contents_controller.h",
+        "cocoa/tab_contents/tab_contents_controller.mm",
+        "cocoa/tab_dialogs_cocoa.h",
+        "cocoa/tab_dialogs_cocoa.mm",
+        "cocoa/tab_modal_confirm_dialog_mac.h",
+        "cocoa/tab_modal_confirm_dialog_mac.mm",
+        "cocoa/tabs/alert_indicator_button_cocoa.h",
+        "cocoa/tabs/alert_indicator_button_cocoa.mm",
+        "cocoa/tabs/tab_controller.h",
+        "cocoa/tabs/tab_controller.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/task_manager_mac.h",
+        "cocoa/task_manager_mac.mm",
+        "cocoa/themed_window.h",
+        "cocoa/themed_window.mm",
+        "cocoa/toolbar/app_toolbar_button.h",
+        "cocoa/toolbar/app_toolbar_button.mm",
+        "cocoa/toolbar/app_toolbar_button_cell.h",
+        "cocoa/toolbar/app_toolbar_button_cell.mm",
+        "cocoa/toolbar/back_forward_menu_controller.h",
+        "cocoa/toolbar/back_forward_menu_controller.mm",
+        "cocoa/toolbar/media_router_action_platform_delegate_cocoa.h",
+        "cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm",
+        "cocoa/toolbar/reload_button_cocoa.h",
+        "cocoa/toolbar/reload_button_cocoa.mm",
+        "cocoa/toolbar/toolbar_button_cocoa.h",
+        "cocoa/toolbar/toolbar_button_cocoa.mm",
+        "cocoa/toolbar/toolbar_controller.h",
+        "cocoa/toolbar/toolbar_controller.mm",
+        "cocoa/toolbar/toolbar_view_cocoa.h",
+        "cocoa/toolbar/toolbar_view_cocoa.mm",
+        "cocoa/translate/translate_bubble_controller.h",
+        "cocoa/translate/translate_bubble_controller.mm",
+        "cocoa/url_drop_target.h",
+        "cocoa/url_drop_target.mm",
+        "cocoa/validation_message_bubble_cocoa.h",
+        "cocoa/validation_message_bubble_cocoa.mm",
+        "cocoa/validation_message_bubble_controller.h",
+        "cocoa/vertical_gradient_view.h",
+        "cocoa/vertical_gradient_view.mm",
+        "cocoa/view_id_util.h",
+        "cocoa/view_id_util.mm",
+        "cocoa/view_resizer.h",
+        "cocoa/web_contents_modal_dialog_manager_views_mac.h",
+        "cocoa/web_contents_modal_dialog_manager_views_mac.mm",
+        "cocoa/website_settings/chooser_bubble_ui_cocoa.h",
+        "cocoa/website_settings/chooser_bubble_ui_cocoa.mm",
+        "cocoa/website_settings/permission_bubble_cocoa.h",
+        "cocoa/website_settings/permission_bubble_cocoa.mm",
+        "cocoa/website_settings/permission_bubble_controller.h",
+        "cocoa/website_settings/permission_bubble_controller.mm",
+        "cocoa/website_settings/permission_prompt_impl_views_mac.mm",
+        "cocoa/website_settings/permission_selector_button.h",
+        "cocoa/website_settings/permission_selector_button.mm",
+        "cocoa/website_settings/split_block_button.h",
+        "cocoa/website_settings/split_block_button.mm",
+        "cocoa/website_settings/website_settings_bubble_controller.h",
+        "cocoa/website_settings/website_settings_bubble_controller.mm",
+        "cocoa/website_settings/website_settings_utils_cocoa.h",
+        "cocoa/website_settings/website_settings_utils_cocoa.mm",
+        "cocoa/window_size_autosaver.h",
+        "cocoa/window_size_autosaver.mm",
+
+        # TODO(estade): this class should be deleted in favor of a combobox model.
+        # See crbug.com/590850
+        "content_settings/content_setting_media_menu_model.cc",
+        "content_settings/content_setting_media_menu_model.h",
+        "proximity_auth/proximity_auth_error_bubble_stub.cc",
+      ]
     }
     include_dirs = [ "$target_gen_dir" ]
     libs += [
@@ -501,14 +2866,35 @@
       "Quartz.framework",
     ]
   } else {  # non-Mac.
-    sources += rebase_path(gypi_values.chrome_browser_ui_non_mac_sources,
-                           ".",
-                           "//chrome")
+    sources += [ "web_contents_sizer.cc" ]
   }
 
   if (is_win) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_win_sources, ".", "//chrome")
+    sources += [
+      "input_method/input_method_engine.cc",
+      "input_method/input_method_engine.h",
+      "input_method/input_method_engine_base.cc",
+      "input_method/input_method_engine_base.h",
+      "network_profile_bubble.cc",
+      "network_profile_bubble.h",
+      "views/color_chooser_dialog.cc",
+      "views/color_chooser_dialog.h",
+      "views/critical_notification_bubble_view.cc",
+      "views/critical_notification_bubble_view.h",
+      "views/frame/browser_desktop_window_tree_host.h",
+      "views/frame/browser_desktop_window_tree_host_win.cc",
+      "views/frame/browser_desktop_window_tree_host_win.h",
+      "views/frame/glass_browser_frame_view.cc",
+      "views/frame/glass_browser_frame_view.h",
+      "views/frame/native_browser_frame_factory_aurawin.cc",
+      "views/network_profile_bubble_view.cc",
+      "views/uninstall_view.cc",
+      "views/uninstall_view.h",
+      "webui/cast/cast_ui.cc",
+      "webui/cast/cast_ui.h",
+      "webui/conflicts_ui.cc",
+      "webui/conflicts_ui.h",
+    ]
     public_deps += [
       "//ui/views",
       "//ui/views/controls/webview",
@@ -539,18 +2925,45 @@
     }
   }
   if (is_desktop_linux) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_desktop_linux_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "input_method/input_method_engine.cc",
+      "input_method/input_method_engine.h",
+      "input_method/input_method_engine_base.cc",
+      "input_method/input_method_engine_base.h",
+      "views/apps/chrome_app_window_client_views_linux.cc",
+      "views/first_run_dialog.cc",
+      "views/first_run_dialog.h",
+      "views/frame/browser_desktop_window_tree_host.h",
+      "views/frame/browser_desktop_window_tree_host_x11.cc",
+      "views/frame/browser_desktop_window_tree_host_x11.h",
+      "views/frame/desktop_browser_frame_auralinux.cc",
+      "views/frame/desktop_browser_frame_auralinux.h",
+      "views/frame/global_menu_bar_registrar_x11.cc",
+      "views/frame/global_menu_bar_registrar_x11.h",
+      "views/frame/global_menu_bar_x11.cc",
+      "views/frame/global_menu_bar_x11.h",
+      "views/frame/native_browser_frame_factory_auralinux.cc",
+      "views/javascript_app_modal_dialog_views_x11.cc",
+      "views/javascript_app_modal_dialog_views_x11.h",
+      "views/status_icons/status_icon_linux_wrapper.cc",
+      "views/status_icons/status_icon_linux_wrapper.h",
+      "webui/help/version_updater_basic.cc",
+      "webui/help/version_updater_basic.h",
+    ]
     deps += [
       "//ui/base/ime",
       "//ui/events:dom_keycode_converter",
     ]
   }
   if (is_linux) {  # Both desktop Linux and ChromeOS.
-    sources += rebase_path(gypi_values.chrome_browser_ui_linux_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "certificate_dialogs.cc",
+      "certificate_dialogs.h",
+      "webui/certificate_viewer_ui.cc",
+      "webui/certificate_viewer_ui.h",
+      "webui/certificate_viewer_webui.cc",
+      "webui/certificate_viewer_webui.h",
+    ]
     if (use_aura) {
       deps += [ "//build/linux:fontconfig" ]
       if (use_dbus) {
@@ -558,9 +2971,11 @@
       }
     }
     if (use_x11) {
-      sources += rebase_path(gypi_values.chrome_browser_ui_x11_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "views/javascript_app_modal_event_blocker_x11.cc",
+        "views/javascript_app_modal_event_blocker_x11.h",
+        "views/tabs/window_finder_x11.cc",
+      ]
       configs += [ "//build/config/linux:x11" ]
       deps += [
         "//ui/events/devices",
@@ -577,31 +2992,179 @@
   }
 
   if (enable_app_list) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_app_list_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "app_list/app_context_menu.cc",
+      "app_list/app_context_menu.h",
+      "app_list/app_context_menu_delegate.h",
+      "app_list/app_list_controller_delegate.cc",
+      "app_list/app_list_controller_delegate.h",
+      "app_list/app_list_controller_delegate_impl.cc",
+      "app_list/app_list_controller_delegate_impl.h",
+      "app_list/app_list_model_builder.cc",
+      "app_list/app_list_model_builder.h",
+      "app_list/app_list_positioner.cc",
+      "app_list/app_list_positioner.h",
+      "app_list/app_list_prefs.cc",
+      "app_list/app_list_prefs.h",
+      "app_list/app_list_prefs_factory.cc",
+      "app_list/app_list_prefs_factory.h",
+      "app_list/app_list_presenter_delegate.h",
+      "app_list/app_list_service.cc",
+      "app_list/app_list_service.h",
+      "app_list/app_list_service_impl.cc",
+      "app_list/app_list_service_impl.h",
+      "app_list/app_list_syncable_service.cc",
+      "app_list/app_list_syncable_service.h",
+      "app_list/app_list_syncable_service_factory.cc",
+      "app_list/app_list_syncable_service_factory.h",
+      "app_list/app_list_view_delegate.cc",
+      "app_list/app_list_view_delegate.h",
+      "app_list/chrome_app_list_item.cc",
+      "app_list/chrome_app_list_item.h",
+      "app_list/extension_app_context_menu.cc",
+      "app_list/extension_app_context_menu.h",
+      "app_list/extension_app_item.cc",
+      "app_list/extension_app_item.h",
+      "app_list/extension_app_model_builder.cc",
+      "app_list/extension_app_model_builder.h",
+      "app_list/extension_uninstaller.cc",
+      "app_list/extension_uninstaller.h",
+      "app_list/fast_show_pickler.cc",
+      "app_list/fast_show_pickler.h",
+      "app_list/google_now_extension.cc",
+      "app_list/google_now_extension.h",
+      "app_list/launcher_page_event_dispatcher.cc",
+      "app_list/launcher_page_event_dispatcher.h",
+      "app_list/model_pref_updater.cc",
+      "app_list/model_pref_updater.h",
+      "app_list/profile_loader.cc",
+      "app_list/profile_loader.h",
+      "app_list/profile_store.h",
+      "app_list/search/app_result.cc",
+      "app_list/search/app_result.h",
+      "app_list/search/app_search_provider.cc",
+      "app_list/search/app_search_provider.h",
+      "app_list/search/common/json_response_fetcher.cc",
+      "app_list/search/common/json_response_fetcher.h",
+      "app_list/search/common/url_icon_source.cc",
+      "app_list/search/common/url_icon_source.h",
+      "app_list/search/common/webservice_cache.cc",
+      "app_list/search/common/webservice_cache.h",
+      "app_list/search/common/webservice_cache_factory.cc",
+      "app_list/search/common/webservice_cache_factory.h",
+      "app_list/search/common/webservice_search_provider.cc",
+      "app_list/search/common/webservice_search_provider.h",
+      "app_list/search/extension_app_result.cc",
+      "app_list/search/extension_app_result.h",
+      "app_list/search/history_factory.cc",
+      "app_list/search/history_factory.h",
+      "app_list/search/omnibox_provider.cc",
+      "app_list/search/omnibox_provider.h",
+      "app_list/search/omnibox_result.cc",
+      "app_list/search/omnibox_result.h",
+      "app_list/search/search_controller_factory.cc",
+      "app_list/search/search_controller_factory.h",
+      "app_list/search/search_resource_manager.cc",
+      "app_list/search/search_resource_manager.h",
+      "app_list/search/search_util.cc",
+      "app_list/search/search_util.h",
+      "app_list/search/search_webstore_result.cc",
+      "app_list/search/search_webstore_result.h",
+      "app_list/search/suggestions/suggestions_search_provider.cc",
+      "app_list/search/suggestions/suggestions_search_provider.h",
+      "app_list/search/suggestions/url_suggestion_result.cc",
+      "app_list/search/suggestions/url_suggestion_result.h",
+      "app_list/search/webstore/webstore_installer.cc",
+      "app_list/search/webstore/webstore_installer.h",
+      "app_list/search/webstore/webstore_provider.cc",
+      "app_list/search/webstore/webstore_provider.h",
+      "app_list/search/webstore/webstore_result.cc",
+      "app_list/search/webstore/webstore_result.h",
+      "app_list/speech_auth_helper.cc",
+      "app_list/speech_auth_helper.h",
+      "app_list/speech_recognizer.cc",
+      "app_list/speech_recognizer.h",
+      "app_list/speech_recognizer_delegate.h",
+      "app_list/start_page_observer.h",
+      "app_list/start_page_service.cc",
+      "app_list/start_page_service.h",
+      "app_list/start_page_service_factory.cc",
+      "app_list/start_page_service_factory.h",
+      "webui/app_list/start_page_handler.cc",
+      "webui/app_list/start_page_handler.h",
+      "webui/app_list/start_page_ui.cc",
+      "webui/app_list/start_page_ui.h",
+    ]
     if (is_chromeos) {
-      sources += rebase_path(gypi_values.chrome_browser_ui_chromeos_arc_sources,
-                             ".",
-                             "//chrome")
+      sources += [
+        "app_list/arc/arc_app_context_menu.cc",
+        "app_list/arc/arc_app_context_menu.h",
+        "app_list/arc/arc_app_icon.cc",
+        "app_list/arc/arc_app_icon.h",
+        "app_list/arc/arc_app_icon_loader.cc",
+        "app_list/arc/arc_app_icon_loader.h",
+        "app_list/arc/arc_app_item.cc",
+        "app_list/arc/arc_app_item.h",
+        "app_list/arc/arc_app_launcher.cc",
+        "app_list/arc/arc_app_launcher.h",
+        "app_list/arc/arc_app_list_prefs.cc",
+        "app_list/arc/arc_app_list_prefs.h",
+        "app_list/arc/arc_app_list_prefs_factory.cc",
+        "app_list/arc/arc_app_list_prefs_factory.h",
+        "app_list/arc/arc_app_model_builder.cc",
+        "app_list/arc/arc_app_model_builder.h",
+        "app_list/arc/arc_app_utils.cc",
+        "app_list/arc/arc_app_utils.h",
+        "app_list/arc/arc_default_app_list.cc",
+        "app_list/arc/arc_default_app_list.h",
+        "app_list/arc/arc_package_sync_data_type_controller.cc",
+        "app_list/arc/arc_package_sync_data_type_controller.h",
+        "app_list/arc/arc_package_syncable_service.cc",
+        "app_list/arc/arc_package_syncable_service.h",
+        "app_list/arc/arc_package_syncable_service_factory.cc",
+        "app_list/arc/arc_package_syncable_service_factory.h",
+        "app_list/search/arc_app_result.cc",
+        "app_list/search/arc_app_result.h",
+        "ash/launcher/arc_app_deferred_launcher_controller.cc",
+        "ash/launcher/arc_app_deferred_launcher_controller.h",
+        "ash/launcher/arc_app_deferred_launcher_item_controller.cc",
+        "ash/launcher/arc_app_deferred_launcher_item_controller.h",
+        "ash/launcher/arc_app_window_launcher_controller.cc",
+        "ash/launcher/arc_app_window_launcher_controller.h",
+        "ash/launcher/arc_app_window_launcher_item_controller.cc",
+        "ash/launcher/arc_app_window_launcher_item_controller.h",
+        "ash/launcher/arc_launcher_context_menu.cc",
+        "ash/launcher/arc_launcher_context_menu.h",
+        "ash/launcher/launcher_arc_app_updater.cc",
+        "ash/launcher/launcher_arc_app_updater.h",
+      ]
     }
     if (is_desktop_linux) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_app_list_linux_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "views/app_list/linux/app_list_linux.cc",
+        "views/app_list/linux/app_list_linux.h",
+        "views/app_list/linux/app_list_service_linux.cc",
+        "views/app_list/linux/app_list_service_linux.h",
+      ]
     }
     if (!is_mac && !use_ash) {
-      sources +=
-          rebase_path(gypi_values.chrome_browser_ui_app_list_views_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "app_list/app_list_controller_delegate_views.cc",
+        "app_list/app_list_controller_delegate_views.h",
+        "app_list/app_list_service_views.cc",
+        "app_list/app_list_service_views.h",
+        "app_list/app_list_shower_views.cc",
+        "app_list/app_list_shower_views.h",
+      ]
     }
     deps += [ "//ui/app_list" ]
   } else {
-    sources += rebase_path(gypi_values.chrome_browser_ui_non_app_list_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "app_list/app_list_service.h",
+      "app_list/app_list_service_disabled.cc",
+      "app_list/app_list_service_disabled_mac.h",
+      "app_list/app_list_service_disabled_mac.mm",
+    ]
   }
   if (!android_java_ui) {
     deps += [
@@ -616,20 +3179,78 @@
       "//chrome/common/extensions/api:api_registration",
     ]
     allow_circular_includes_from += [ "//chrome/browser/extensions" ]
-    sources += rebase_path(gypi_values.chrome_browser_ui_extensions_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "extensions/accelerator_priority.cc",
+      "extensions/accelerator_priority.h",
+      "extensions/app_launch_params.cc",
+      "extensions/app_launch_params.h",
+      "extensions/application_launch.cc",
+      "extensions/application_launch.h",
+      "extensions/blocked_action_bubble_delegate.cc",
+      "extensions/blocked_action_bubble_delegate.h",
+      "extensions/extension_action_platform_delegate.h",
+      "extensions/extension_action_view_controller.cc",
+      "extensions/extension_action_view_controller.h",
+      "extensions/extension_enable_flow.cc",
+      "extensions/extension_enable_flow.h",
+      "extensions/extension_enable_flow_delegate.h",
+      "extensions/extension_install_ui_default.cc",
+      "extensions/extension_install_ui_default.h",
+      "extensions/extension_install_ui_factory.cc",
+      "extensions/extension_install_ui_factory.h",
+      "extensions/extension_installed_bubble.cc",
+      "extensions/extension_installed_bubble.h",
+      "extensions/extension_message_bubble_bridge.cc",
+      "extensions/extension_message_bubble_bridge.h",
+      "extensions/extension_message_bubble_factory.cc",
+      "extensions/extension_message_bubble_factory.h",
+      "extensions/hosted_app_browser_controller.cc",
+      "extensions/hosted_app_browser_controller.h",
+      "extensions/icon_with_badge_image_source.cc",
+      "extensions/icon_with_badge_image_source.h",
+      "extensions/settings_api_bubble_helpers.cc",
+      "extensions/settings_api_bubble_helpers.h",
+      "webui/extensions/chromeos/kiosk_apps_handler.cc",
+      "webui/extensions/chromeos/kiosk_apps_handler.h",
+      "webui/extensions/extension_basic_info.cc",
+      "webui/extensions/extension_basic_info.h",
+      "webui/extensions/extension_icon_source.cc",
+      "webui/extensions/extension_icon_source.h",
+    ]
   }
   if (enable_google_now && !is_android) {
-    sources += rebase_path(
-            gypi_values.chrome_browser_ui_google_now_non_android_sources,
-            ".",
-            "//chrome")
+    sources += [
+      # These are non-Android because Android excludes all of options.
+      "webui/options/geolocation_options_handler.cc",
+      "webui/options/geolocation_options_handler.h",
+    ]
   }
   if (enable_media_router && !is_android) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_media_router_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "toolbar/media_router_action.cc",
+      "toolbar/media_router_action.h",
+      "toolbar/media_router_action_platform_delegate.h",
+      "toolbar/media_router_contextual_menu.cc",
+      "toolbar/media_router_contextual_menu.h",
+      "views/toolbar/media_router_action_platform_delegate_views.cc",
+      "views/toolbar/media_router_action_platform_delegate_views.h",
+      "webui/media_router/media_cast_mode.cc",
+      "webui/media_router/media_cast_mode.h",
+      "webui/media_router/media_router_dialog_controller_impl.cc",
+      "webui/media_router/media_router_dialog_controller_impl.h",
+      "webui/media_router/media_router_localized_strings_provider.cc",
+      "webui/media_router/media_router_localized_strings_provider.h",
+      "webui/media_router/media_router_resources_provider.cc",
+      "webui/media_router/media_router_resources_provider.h",
+      "webui/media_router/media_router_ui.cc",
+      "webui/media_router/media_router_ui.h",
+      "webui/media_router/media_router_webui_message_handler.cc",
+      "webui/media_router/media_router_webui_message_handler.h",
+      "webui/media_router/media_sink_with_cast_modes.cc",
+      "webui/media_router/media_sink_with_cast_modes.h",
+      "webui/media_router/query_result_manager.cc",
+      "webui/media_router/query_result_manager.h",
+    ]
     if (is_mac && !mac_views_browser) {
       sources -= [
         # This file is compiled on GYP but never referenced on Mac. Since it's
@@ -646,15 +3267,18 @@
     ]
   }
   if (enable_webrtc) {
-    sources += rebase_path(gypi_values.chrome_browser_ui_webrtc_sources,
-                           ".",
-                           "//chrome")
+    sources += [
+      "webui/media/webrtc_logs_ui.cc",
+      "webui/media/webrtc_logs_ui.h",
+    ]
   }
   if (enable_service_discovery) {
-    sources +=
-        rebase_path(gypi_values.chrome_browser_ui_service_discovery_sources,
-                    ".",
-                    "//chrome")
+    sources += [
+      "webui/local_discovery/local_discovery_ui.cc",
+      "webui/local_discovery/local_discovery_ui.h",
+      "webui/local_discovery/local_discovery_ui_handler.cc",
+      "webui/local_discovery/local_discovery_ui_handler.h",
+    ]
   }
 }
 
diff --git a/chrome/browser/ui/android/bluetooth_chooser_android.cc b/chrome/browser/ui/android/bluetooth_chooser_android.cc
index 034624e6..61116924 100644
--- a/chrome/browser/ui/android/bluetooth_chooser_android.cc
+++ b/chrome/browser/ui/android/bluetooth_chooser_android.cc
@@ -174,6 +174,6 @@
 
 void BluetoothChooserAndroid::OpenURL(const char* url) {
   web_contents_->OpenURL(content::OpenURLParams(
-      GURL(url), content::Referrer(), NEW_FOREGROUND_TAB,
+      GURL(url), content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initiated */));
 }
diff --git a/chrome/browser/ui/android/infobars/confirm_infobar.cc b/chrome/browser/ui/android/infobars/confirm_infobar.cc
index 2b5b5f7..d5ffed45 100644
--- a/chrome/browser/ui/android/infobars/confirm_infobar.cc
+++ b/chrome/browser/ui/android/infobars/confirm_infobar.cc
@@ -76,7 +76,7 @@
   if (!owner())
       return; // We're closing; don't call anything, it might access the owner.
 
-  if (GetDelegate()->LinkClicked(NEW_FOREGROUND_TAB))
+  if (GetDelegate()->LinkClicked(WindowOpenDisposition::NEW_FOREGROUND_TAB))
     RemoveSelf();
 }
 
diff --git a/chrome/browser/ui/android/infobars/save_password_infobar.cc b/chrome/browser/ui/android/infobars/save_password_infobar.cc
index f3592e2..0f285bb 100644
--- a/chrome/browser/ui/android/infobars/save_password_infobar.cc
+++ b/chrome/browser/ui/android/infobars/save_password_infobar.cc
@@ -45,7 +45,7 @@
 
 void SavePasswordInfoBar::OnLinkClicked(JNIEnv* env,
                                         const JavaParamRef<jobject>& obj) {
-  GetDelegate()->LinkClicked(NEW_FOREGROUND_TAB);
+  GetDelegate()->LinkClicked(WindowOpenDisposition::NEW_FOREGROUND_TAB);
 }
 
 std::unique_ptr<infobars::InfoBar> CreateSavePasswordInfoBar(
diff --git a/chrome/browser/ui/android/infobars/update_password_infobar.cc b/chrome/browser/ui/android/infobars/update_password_infobar.cc
index 39591563..f81853a95 100644
--- a/chrome/browser/ui/android/infobars/update_password_infobar.cc
+++ b/chrome/browser/ui/android/infobars/update_password_infobar.cc
@@ -62,5 +62,5 @@
 
 void UpdatePasswordInfoBar::OnLinkClicked(JNIEnv* env,
                                           const JavaParamRef<jobject>& obj) {
-  GetDelegate()->LinkClicked(NEW_FOREGROUND_TAB);
+  GetDelegate()->LinkClicked(WindowOpenDisposition::NEW_FOREGROUND_TAB);
 }
diff --git a/chrome/browser/ui/android/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
index c9d8b91..c779222b2ae 100644
--- a/chrome/browser/ui/android/usb_chooser_dialog_android.cc
+++ b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
@@ -218,10 +218,11 @@
 
 void UsbChooserDialogAndroid::OpenUrl(const std::string& url) {
   content::WebContents::FromRenderFrameHost(render_frame_host_)
-      ->OpenURL(content::OpenURLParams(GURL(url), content::Referrer(),
-                                       NEW_FOREGROUND_TAB,
-                                       ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                       false));  // is_renderer_initiated
+      ->OpenURL(
+          content::OpenURLParams(GURL(url), content::Referrer(),
+                                 WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                 ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
+                                 false));  // is_renderer_initiated
 }
 
 bool UsbChooserDialogAndroid::DisplayDevice(
diff --git a/chrome/browser/ui/app_list/app_list_controller_delegate.cc b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
index 8127a3e2d..17140ef 100644
--- a/chrome/browser/ui/app_list/app_list_controller_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
@@ -143,12 +143,9 @@
       is_search_result ?
           AppListControllerDelegate::LAUNCH_FROM_APP_LIST_SEARCH :
           AppListControllerDelegate::LAUNCH_FROM_APP_LIST);
-  OpenURL(profile,
-          net::AppendQueryParameter(url,
-                                    extension_urls::kWebstoreSourceField,
-                                    source),
-          ui::PAGE_TRANSITION_LINK,
-          CURRENT_TAB);
+  OpenURL(profile, net::AppendQueryParameter(
+                       url, extension_urls::kWebstoreSourceField, source),
+          ui::PAGE_TRANSITION_LINK, WindowOpenDisposition::CURRENT_TAB);
 }
 
 bool AppListControllerDelegate::HasOptionsPage(
@@ -166,10 +163,8 @@
   if (!extension)
     return;
 
-  OpenURL(profile,
-          extensions::OptionsPageInfo::GetOptionsPage(extension),
-          ui::PAGE_TRANSITION_LINK,
-          CURRENT_TAB);
+  OpenURL(profile, extensions::OptionsPageInfo::GetOptionsPage(extension),
+          ui::PAGE_TRANSITION_LINK, WindowOpenDisposition::CURRENT_TAB);
 }
 
 extensions::LaunchType AppListControllerDelegate::GetExtensionLaunchType(
diff --git a/chrome/browser/ui/app_list/app_list_controller_delegate_impl.cc b/chrome/browser/ui/app_list/app_list_controller_delegate_impl.cc
index 053a6476..40b00405 100644
--- a/chrome/browser/ui/app_list/app_list_controller_delegate_impl.cc
+++ b/chrome/browser/ui/app_list/app_list_controller_delegate_impl.cc
@@ -115,7 +115,8 @@
   AppListServiceImpl::RecordAppListAppLaunch();
 
   AppLaunchParams params = CreateAppLaunchParamsUserContainer(
-      profile, extension, NEW_FOREGROUND_TAB, extensions::SOURCE_APP_LAUNCHER);
+      profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      extensions::SOURCE_APP_LAUNCHER);
 
   if (source != LAUNCH_FROM_UNKNOWN &&
       extension->id() == extensions::kWebStoreAppId) {
diff --git a/chrome/browser/ui/app_list/app_list_view_delegate.cc b/chrome/browser/ui/app_list/app_list_view_delegate.cc
index 3196888..272c29a 100644
--- a/chrome/browser/ui/app_list/app_list_view_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_view_delegate.cc
@@ -528,9 +528,8 @@
   chrome::ScopedTabbedBrowserDisplayer displayer(profile_);
   content::OpenURLParams params(GURL(chrome::kAppLauncherHelpURL),
                                 content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   displayer.browser()->OpenURL(params);
 }
 
@@ -761,7 +760,8 @@
 
 void AppListViewDelegate::OpenLearnMoreLink() {
   controller_->OpenURL(profile_, GURL(GetLearnMoreLink()),
-                       ui::PAGE_TRANSITION_LINK, CURRENT_TAB);
+                       ui::PAGE_TRANSITION_LINK,
+                       WindowOpenDisposition::CURRENT_TAB);
 }
 #endif  // !defined(OS_CHROMEOS)
 
diff --git a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
index 0efa35f..e4d4628 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
+++ b/chrome/browser/ui/app_list/arc/arc_package_syncable_service.cc
@@ -15,6 +15,7 @@
 #include "components/sync/api/sync_change_processor.h"
 #include "components/sync/api/sync_data.h"
 #include "components/sync/api/sync_merge_result.h"
+#include "components/sync/driver/pref_names.h"
 #include "components/sync/driver/sync_prefs.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/protocol/sync.pb.h"
@@ -72,6 +73,26 @@
       package_info->last_backup_android_id, package_info->last_backup_time);
 }
 
+bool ValidateEnableArcPackageSyncPref(Profile* profile) {
+  PrefService* pref_service = profile->GetPrefs();
+  // If device is set to sync everything, Arc package should be synced.
+  if (pref_service->GetBoolean(sync_driver::prefs::kSyncKeepEverythingSynced))
+    return true;
+
+  bool apps_sync_enable = pref_service->GetBoolean(
+      sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::APPS));
+  // ArcPackage sync service is controlled by apps checkbox in sync settings.
+  // Update ArcPackage sync setting pref if it is different from apps sync
+  // setting pref.
+  const char* arc_sync_path =
+      sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::ARC_PACKAGE);
+  if (apps_sync_enable != pref_service->GetBoolean(arc_sync_path)) {
+    pref_service->SetBoolean(arc_sync_path, apps_sync_enable);
+  }
+
+  return apps_sync_enable;
+}
+
 }  // namespace
 
 // ArcPackageSyncableService::SyncItem
@@ -231,8 +252,8 @@
   sync_driver::SyncService* sync_service =
       ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile_);
   // ArcPackage sync service is controlled by apps checkbox in sync settings.
-  bool arc_package_sync_should_enable = profile_->GetPrefs()->GetBoolean(
-      sync_driver::SyncPrefs::GetPrefNameForDataType(syncer::ARC_PACKAGE));
+  bool arc_package_sync_should_enable =
+      ValidateEnableArcPackageSyncPref(profile_);
 
   if (!sync_service || !arc_package_sync_should_enable)
     return false;
diff --git a/chrome/browser/ui/app_list/start_page_service.cc b/chrome/browser/ui/app_list/start_page_service.cc
index e94c8d2..a8bd07a 100644
--- a/chrome/browser/ui/app_list/start_page_service.cc
+++ b/chrome/browser/ui/app_list/start_page_service.cc
@@ -182,15 +182,11 @@
     chrome::ScopedTabbedBrowserDisplayer displayer(profile_);
     // Force all links to open in a new tab, even if they were trying to open a
     // new window.
-    disposition =
-        disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB;
-    chrome::AddWebContents(displayer.browser(),
-                           nullptr,
-                           new_contents,
-                           disposition,
-                           initial_pos,
-                           user_gesture,
-                           was_blocked);
+    disposition = disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB
+                      ? disposition
+                      : WindowOpenDisposition::NEW_FOREGROUND_TAB;
+    chrome::AddWebContents(displayer.browser(), nullptr, new_contents,
+                           disposition, initial_pos, user_gesture, was_blocked);
   }
 
   content::WebContents* OpenURLFromTab(
@@ -200,10 +196,10 @@
     // window.
     chrome::NavigateParams new_tab_params(
         static_cast<Browser*>(nullptr), params.url, params.transition);
-    if (params.disposition == NEW_BACKGROUND_TAB) {
-      new_tab_params.disposition = NEW_BACKGROUND_TAB;
+    if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) {
+      new_tab_params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
     } else {
-      new_tab_params.disposition = NEW_FOREGROUND_TAB;
+      new_tab_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
       new_tab_params.window_action = chrome::NavigateParams::SHOW_WINDOW;
     }
 
diff --git a/chrome/browser/ui/apps/chrome_app_delegate.cc b/chrome/browser/ui/apps/chrome_app_delegate.cc
index bf65365..1bd2086 100644
--- a/chrome/browser/ui/apps/chrome_app_delegate.cc
+++ b/chrome/browser/ui/apps/chrome_app_delegate.cc
@@ -66,10 +66,10 @@
   // window.
   chrome::NavigateParams new_tab_params(
       static_cast<Browser*>(NULL), params.url, params.transition);
-  if (params.disposition == NEW_BACKGROUND_TAB) {
-    new_tab_params.disposition = NEW_BACKGROUND_TAB;
+  if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) {
+    new_tab_params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   } else {
-    new_tab_params.disposition = NEW_FOREGROUND_TAB;
+    new_tab_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
     new_tab_params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   }
 
@@ -244,8 +244,9 @@
       Profile::FromBrowserContext(context));
   // Force all links to open in a new tab, even if they were trying to open a
   // new window.
-  disposition =
-      disposition == NEW_BACKGROUND_TAB ? disposition : NEW_FOREGROUND_TAB;
+  disposition = disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB
+                    ? disposition
+                    : WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::AddWebContents(displayer.browser(),
                          NULL,
                          new_contents,
diff --git a/chrome/browser/ui/ash/cast_config_delegate_chromeos.cc b/chrome/browser/ui/ash/cast_config_delegate_chromeos.cc
index 462d8081..1860200 100644
--- a/chrome/browser/ui/ash/cast_config_delegate_chromeos.cc
+++ b/chrome/browser/ui/ash/cast_config_delegate_chromeos.cc
@@ -109,7 +109,7 @@
       ProfileManager::GetActiveUserProfile(),
       FindCastExtension()->GetResourceURL("options.html"),
       ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/ui/ash/chrome_new_window_delegate.cc b/chrome/browser/ui/ash/chrome_new_window_delegate.cc
index 68ac5df..57088d9 100644
--- a/chrome/browser/ui/ash/chrome_new_window_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_delegate.cc
@@ -133,7 +133,8 @@
   const extensions::Extension* const extension =
       service->GetInstalledExtension(kFileManagerAppId);
   OpenApplication(CreateAppLaunchParamsUserContainer(
-      profile, extension, NEW_FOREGROUND_TAB, extensions::SOURCE_KEYBOARD));
+      profile, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      extensions::SOURCE_KEYBOARD));
 }
 
 void ChromeNewWindowDelegate::OpenCrosh() {
@@ -144,9 +145,9 @@
     return;
   chrome::ScopedTabbedBrowserDisplayer displayer(profile);
   Browser* browser = displayer.browser();
-  content::WebContents* page = browser->OpenURL(
-      content::OpenURLParams(crosh_url, content::Referrer(), NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_GENERATED, false));
+  content::WebContents* page = browser->OpenURL(content::OpenURLParams(
+      crosh_url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_GENERATED, false));
   browser->window()->Show();
   browser->window()->Activate();
   page->Focus();
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 962435d..c4e185a 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -466,7 +466,7 @@
 
   chrome::NavigateParams params(browser, GURL(kKeyboardShortcutHelpPageUrl),
                                 ui::PAGE_TRANSITION_AUTO_BOOKMARK);
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
index c128427..24e15b5 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc
@@ -873,7 +873,7 @@
   TabStripModel* tab_strip = browser()->tab_strip_model();
   int tab_count = tab_strip->count();
   LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
-                         NEW_FOREGROUND_TAB);
+                         WindowOpenDisposition::NEW_FOREGROUND_TAB);
   EXPECT_EQ(++tab_count, tab_strip->count());
   ash::ShelfID shortcut_id = CreateShortcut("app1");
   EXPECT_EQ(ash::STATUS_ACTIVE, (*model_->ItemByID(shortcut_id)).status);
@@ -891,7 +891,7 @@
   TabStripModel* tab_strip = browser()->tab_strip_model();
   int tab_count = tab_strip->count();
   LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
-                         NEW_BACKGROUND_TAB);
+                         WindowOpenDisposition::NEW_BACKGROUND_TAB);
   EXPECT_EQ(++tab_count, tab_strip->count());
   controller_->LaunchApp(last_loaded_extension_id(),
                                                ash::LAUNCH_FROM_UNKNOWN,
@@ -935,13 +935,9 @@
   const Extension* extension =
       LoadExtension(test_data_dir_.AppendASCII("app1"));
 
-  controller_->ActivateApp(extension->id(),
-                                                 ash::LAUNCH_FROM_UNKNOWN,
-                                                 0);
+  controller_->ActivateApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
-  controller_->ActivateApp(extension->id(),
-                                                 ash::LAUNCH_FROM_UNKNOWN,
-                                                 0);
+  controller_->ActivateApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0);
   EXPECT_EQ(tab_count, tab_strip->count());
 }
 
@@ -952,13 +948,9 @@
   const Extension* extension =
       LoadExtension(test_data_dir_.AppendASCII("app1"));
 
-  controller_->LaunchApp(extension->id(),
-                                               ash::LAUNCH_FROM_UNKNOWN,
-                                               0);
+  controller_->LaunchApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
-  controller_->LaunchApp(extension->id(),
-                                               ash::LAUNCH_FROM_UNKNOWN,
-                                               0);
+  controller_->LaunchApp(extension->id(), ash::LAUNCH_FROM_UNKNOWN, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
 }
 
@@ -995,10 +987,8 @@
 
   // Open second tab for second app. This should activate it.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path3/foo.html"),
-      NEW_FOREGROUND_TAB,
-      0);
+      browser(), GURL("http://www.example.com/path3/foo.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
   EXPECT_EQ(ash::STATUS_RUNNING, (*model_->ItemByID(shortcut1)).status);
   EXPECT_EQ(ash::STATUS_ACTIVE, (*model_->ItemByID(shortcut2)).status);
@@ -1091,9 +1081,8 @@
 
   // Create new tab owned by app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path2/bar.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.example.com/path2/bar.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(++tab_count, tab_strip->count());
   // Confirm app is still active.
@@ -1101,10 +1090,8 @@
 
   // Create new tab not owned by app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path3/foo.html"),
-      NEW_FOREGROUND_TAB,
-      0);
+      browser(), GURL("http://www.example.com/path3/foo.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
   // No longer active.
   EXPECT_EQ(ash::STATUS_RUNNING, model_->ItemByID(shortcut_id)->status);
@@ -1128,9 +1115,8 @@
       shortcut_id, GURL("http://www.example.com/path1/*"));
   // Create new tab owned by app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path2/bar.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.example.com/path2/bar.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(++tab_count, tab_strip->count());
   // Confirm app is still active.
@@ -1138,10 +1124,8 @@
 
   // Create new tab not owned by app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path3/foo.html"),
-      NEW_FOREGROUND_TAB,
-      0);
+      browser(), GURL("http://www.example.com/path3/foo.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
   EXPECT_EQ(++tab_count, tab_strip->count());
   // No longer active.
   EXPECT_EQ(ash::STATUS_RUNNING, model_->ItemByID(shortcut_id)->status);
@@ -1162,9 +1146,8 @@
 
   // Create new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example2.com/path2/bar.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.example2.com/path2/bar.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(++tab_count, tab_strip->count());
   WebContents* first_tab = tab_strip->GetActiveWebContents();
@@ -1200,9 +1183,8 @@
 
   // Create new tab which would be the running app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path1/bar.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.example.com/path1/bar.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // There should never be two items active at the same time.
@@ -1236,9 +1218,8 @@
 
   // Create new tab which would be the running app.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.example.com/path1/bar.html"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.example.com/path1/bar.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   EXPECT_EQ(ash::STATUS_ACTIVE, model_->ItemByID(shortcut_id)->status);
@@ -1257,8 +1238,9 @@
 // before it was closed.
 IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest, AppWindowRestoreBehaviorTest) {
   // Open an App, maximized its window, and close it.
-  const Extension* extension = LoadAndLaunchExtension(
-      "app1", extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW);
+  const Extension* extension =
+      LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_WINDOW,
+                             WindowOpenDisposition::NEW_WINDOW);
   Browser* app_browser = FindBrowserForApp(extension->id());
   ASSERT_TRUE(app_browser);
   aura::Window* window = app_browser->window()->GetNativeWindow();
@@ -1268,8 +1250,9 @@
   CloseAppBrowserWindow(app_browser);
 
   // Reopen the App. It should start maximized. Un-maximize it and close it.
-  extension = LoadAndLaunchExtension(
-      "app1", extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW);
+  extension =
+      LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_WINDOW,
+                             WindowOpenDisposition::NEW_WINDOW);
   app_browser = FindBrowserForApp(extension->id());
   ASSERT_TRUE(app_browser);
   window = app_browser->window()->GetNativeWindow();
@@ -1281,8 +1264,9 @@
   CloseAppBrowserWindow(app_browser);
 
   // Reopen the App. It should start un-maximized.
-  extension = LoadAndLaunchExtension(
-      "app1", extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW);
+  extension =
+      LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_WINDOW,
+                             WindowOpenDisposition::NEW_WINDOW);
   app_browser = FindBrowserForApp(extension->id());
   ASSERT_TRUE(app_browser);
   window = app_browser->window()->GetNativeWindow();
@@ -1298,14 +1282,15 @@
   EXPECT_EQ(0u, items);
   EXPECT_EQ(0u, running_browser);
 
-  LoadAndLaunchExtension(
-      "app1", extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW);
+  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_WINDOW,
+                         WindowOpenDisposition::NEW_WINDOW);
 
   // No new browser should get detected, even though one more is running.
   EXPECT_EQ(0u, NumberOfDetectedLauncherBrowsers(false));
   EXPECT_EQ(++running_browser, chrome::GetTotalBrowserCount());
 
-  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB, NEW_WINDOW);
+  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
+                         WindowOpenDisposition::NEW_WINDOW);
 
   // A new browser should get detected and one more should be running.
   EXPECT_EQ(NumberOfDetectedLauncherBrowsers(false), 1u);
@@ -1314,21 +1299,23 @@
 
 // Checks the functionality to enumerate all browsers vs. all tabs.
 IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTestNoDefaultBrowser,
-                       EnumerateALlBrowsersAndTabs) {
+                       EnumerateAllBrowsersAndTabs) {
   // Create at least one browser.
-  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB, NEW_WINDOW);
+  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
+                         WindowOpenDisposition::NEW_WINDOW);
   size_t browsers = NumberOfDetectedLauncherBrowsers(false);
   size_t tabs = NumberOfDetectedLauncherBrowsers(true);
 
   // Create a second browser.
-  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB, NEW_WINDOW);
+  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
+                         WindowOpenDisposition::NEW_WINDOW);
 
   EXPECT_EQ(++browsers, NumberOfDetectedLauncherBrowsers(false));
   EXPECT_EQ(++tabs, NumberOfDetectedLauncherBrowsers(true));
 
   // Create only a tab.
   LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
-                         NEW_FOREGROUND_TAB);
+                         WindowOpenDisposition::NEW_FOREGROUND_TAB);
 
   EXPECT_EQ(browsers, NumberOfDetectedLauncherBrowsers(false));
   EXPECT_EQ(++tabs, NumberOfDetectedLauncherBrowsers(true));
@@ -1348,18 +1335,15 @@
 
   // Create an application handled browser tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   content::WebContents* content1 = tab_strip->GetActiveWebContents();
 
   // Create some other browser tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("http://www.test.com"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("http://www.test.com"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* content1a = tab_strip->GetActiveWebContents();
 
@@ -1375,9 +1359,7 @@
   EXPECT_EQ(content1, tab_strip->GetActiveWebContents());
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(url), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* content2 = tab_strip->GetActiveWebContents();
 
@@ -1676,7 +1658,8 @@
   EXPECT_EQ(window1, ash::wm::GetActiveWindow());
 
   // Create anther app and make sure that none of our browsers is active.
-  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB, NEW_WINDOW);
+  LoadAndLaunchExtension("app1", extensions::LAUNCH_CONTAINER_TAB,
+                         WindowOpenDisposition::NEW_WINDOW);
   EXPECT_NE(window1, ash::wm::GetActiveWindow());
   EXPECT_NE(window2, ash::wm::GetActiveWindow());
 
@@ -1701,9 +1684,7 @@
       shortcut_id, GURL("http://www.example.com/path/*"));
   std::string url = "http://www.example.com/path/bla";
   ui_test_utils::NavigateToURLWithDisposition(
-      browser2,
-      GURL(url),
-      NEW_FOREGROUND_TAB,
+      browser2, GURL(url), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Remember the number of tabs for each browser.
@@ -2217,7 +2198,7 @@
   // Create a windowed application.
   AppLaunchParams params = CreateAppLaunchParamsUserContainer(
       profile(), GetExtensionForAppID(extensions::kWebStoreAppId, profile()),
-      NEW_FOREGROUND_TAB, extensions::SOURCE_TEST);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, extensions::SOURCE_TEST);
   params.container = extensions::LAUNCH_CONTAINER_WINDOW;
   OpenApplication(params);
   EXPECT_EQ(ash::STATUS_ACTIVE, model_->ItemByID(id)->status);
@@ -2302,7 +2283,7 @@
       browser(), extensions::AppLaunchInfo::GetLaunchWebURL(hosted_app));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), extensions::AppLaunchInfo::GetLaunchWebURL(bookmark_app),
-      NEW_FOREGROUND_TAB, 0);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
 
   // The apps should now be running, with the last opened app active.
   EXPECT_EQ(ash::STATUS_RUNNING, model_->ItemByID(hosted_app_shelf_id)->status);
@@ -2353,7 +2334,7 @@
       browser(), extensions::AppLaunchInfo::GetLaunchWebURL(hosted_app));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), extensions::AppLaunchInfo::GetLaunchWebURL(bookmark_app),
-      NEW_FOREGROUND_TAB, 0);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
 
   // The apps should still be closed.
   EXPECT_EQ(ash::STATUS_CLOSED, model_->ItemByID(hosted_app_shelf_id)->status);
diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
index db270d7..1092a281 100644
--- a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
@@ -225,9 +225,9 @@
 }
 
 void SaveCardBubbleControllerImpl::OpenUrl(const GURL& url) {
-  web_contents()->OpenURL(
-      content::OpenURLParams(url, content::Referrer(), NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_LINK, false));
+  web_contents()->OpenURL(content::OpenURLParams(
+      url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false));
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc
index 1e8b2b34..b47c524a 100644
--- a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc
+++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller.cc
@@ -122,8 +122,8 @@
 void BluetoothChooserController::OpenHelpCenterUrl() const {
   GetBrowser()->OpenURL(content::OpenURLParams(
       GURL(chrome::kChooserBluetoothOverviewURL), content::Referrer(),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-      false /* is_renderer_initialized */));
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initialized */));
 }
 
 void BluetoothChooserController::OnAdapterPresenceChanged(
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
index b9d163a..49242ccc 100644
--- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
@@ -145,15 +145,15 @@
     case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: {
       WindowOpenDisposition initial_disposition;
       if (id == IDC_BOOKMARK_BAR_OPEN_ALL) {
-        initial_disposition = NEW_BACKGROUND_TAB;
+        initial_disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
         content::RecordAction(
             UserMetricsAction("BookmarkBar_ContextMenu_OpenAll"));
       } else if (id == IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW) {
-        initial_disposition = NEW_WINDOW;
+        initial_disposition = WindowOpenDisposition::NEW_WINDOW;
         content::RecordAction(
             UserMetricsAction("BookmarkBar_ContextMenu_OpenAllInNewWindow"));
       } else {
-        initial_disposition = OFF_THE_RECORD;
+        initial_disposition = WindowOpenDisposition::OFF_THE_RECORD;
         content::RecordAction(
             UserMetricsAction("BookmarkBar_ContextMenu_OpenAllIncognito"));
       }
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
index 2143adce9..c9f9b79 100644
--- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
@@ -112,7 +112,8 @@
 // Tests open all on a folder with a couple of bookmarks.
 TEST_F(BookmarkContextMenuControllerTest, OpenAll) {
   const BookmarkNode* folder = model_->bookmark_bar_node()->GetChild(1);
-  chrome::OpenAll(NULL, &navigator_, folder, NEW_FOREGROUND_TAB, NULL);
+  chrome::OpenAll(NULL, &navigator_, folder,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB, NULL);
 
   // Should have navigated to F1's child, but not F11's child.
   ASSERT_EQ(static_cast<size_t>(1), navigator_.urls_.size());
diff --git a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc
index 62fc536c..b5d7dbb1 100644
--- a/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_utils_desktop.cc
@@ -196,7 +196,7 @@
     // When |initial_disposition| is OFF_THE_RECORD, a node which can't be
     // opened in incognito window, it is detected using |browser_context|, is
     // not opened.
-    if (initial_disposition == OFF_THE_RECORD &&
+    if (initial_disposition == WindowOpenDisposition::OFF_THE_RECORD &&
         !IsURLAllowedInIncognito(*url, browser_context))
       continue;
 
@@ -206,7 +206,7 @@
 
     if (!opened_first_url) {
       opened_first_url = true;
-      disposition = NEW_BACKGROUND_TAB;
+      disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
       // We opened the first URL which may have opened a new window or clobbered
       // the current page, reset the navigator just to be sure. |opened_tab| may
       // be NULL in tests.
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index e9bc27e..1483086b 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1013,7 +1013,7 @@
   // TODO(georgesak): Validate the usefulness of this. And if needed then move
   // to TabManager.
   if (g_browser_process->GetTabManager()->IsTabDiscarded(new_contents))
-    chrome::Reload(this, CURRENT_TAB);
+    chrome::Reload(this, WindowOpenDisposition::CURRENT_TAB);
 
   // If we have any update pending, do it now.
   if (chrome_updater_factory_.HasWeakPtrs() && old_contents)
@@ -1368,10 +1368,10 @@
     popup_blocker_helper = PopupBlockerTabHelper::FromWebContents(source);
 
   if (popup_blocker_helper) {
-    if ((params.disposition == NEW_POPUP ||
-         params.disposition == NEW_FOREGROUND_TAB ||
-         params.disposition == NEW_BACKGROUND_TAB ||
-         params.disposition == NEW_WINDOW) &&
+    if ((params.disposition == WindowOpenDisposition::NEW_POPUP ||
+         params.disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+         params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+         params.disposition == WindowOpenDisposition::NEW_WINDOW) &&
         !params.user_gesture &&
         !base::CommandLine::ForCurrentProcess()->HasSwitch(
             switches::kDisablePopupBlocking)) {
@@ -1942,8 +1942,8 @@
   if (url.is_empty())
     return;
 
-  OpenURL(OpenURLParams(
-      url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+  OpenURL(OpenURLParams(url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                        ui::PAGE_TRANSITION_TYPED, false));
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index ad3ebe0..e9f356e 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -520,7 +520,8 @@
         content::NOTIFICATION_LOAD_STOP,
         content::Source<NavigationController>(
             &web_contents->GetController()));
-    browser()->OpenURL(OpenURLParams(abort_url, Referrer(), CURRENT_TAB,
+    browser()->OpenURL(OpenURLParams(abort_url, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
                                      ui::PAGE_TRANSITION_TYPED, false));
     stop_observer.Wait();
     EXPECT_TRUE(web_contents->GetController().GetPendingEntry());
@@ -538,7 +539,8 @@
         content::NOTIFICATION_LOAD_STOP,
         content::Source<NavigationController>(
             &web_contents->GetController()));
-    browser()->OpenURL(OpenURLParams(abort_url, Referrer(), CURRENT_TAB,
+    browser()->OpenURL(OpenURLParams(abort_url, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
                                      ui::PAGE_TRANSITION_TYPED, false));
     stop_observer.Wait();
     EXPECT_FALSE(web_contents->GetController().GetPendingEntry());
@@ -667,7 +669,7 @@
 
   // Navigate to another page, but click cancel in the dialog.  Make sure that
   // the throbber stops spinning.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
   alert->CloseModalDialog();
   EXPECT_FALSE(
@@ -788,7 +790,8 @@
   GURL https_url(https_test_server.GetURL("/title1.html"));
   GURL redirect_url(
       embedded_test_server()->GetURL("/server-redirect?" + https_url.spec()));
-  browser()->OpenURL(OpenURLParams(redirect_url, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(redirect_url, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
   EXPECT_TRUE(
@@ -810,8 +813,9 @@
   // Navigate to a page that triggers a cross-site transition.
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url2(embedded_test_server()->GetURL("/title1.html"));
-  browser()->OpenURL(OpenURLParams(
-      url2, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(OpenURLParams(url2, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
 
   content::WindowedNotificationObserver host_destroyed_observer(
       content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
@@ -884,7 +888,7 @@
   ui_test_utils::NavigateToURL(browser(), url);
 
   // Reload the page, and check that we get a "before reload" dialog.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
   EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
 
@@ -893,8 +897,9 @@
 
   // Navigate to another url, and check that we get a "before unload" dialog.
   GURL url2(url::kAboutBlankURL);
-  browser()->OpenURL(OpenURLParams(
-      url2, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+  browser()->OpenURL(OpenURLParams(url2, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
 
   alert = ui_test_utils::WaitForAppModalDialog();
   EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
@@ -1426,7 +1431,7 @@
   // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
   WebContents* app_window = OpenApplication(AppLaunchParams(
       browser()->profile(), extension_app, extensions::LAUNCH_CONTAINER_WINDOW,
-      NEW_WINDOW, extensions::SOURCE_TEST));
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
   ASSERT_TRUE(app_window);
 
   DevToolsWindow* devtools_window =
@@ -1546,7 +1551,7 @@
   // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
   WebContents* app_window = OpenApplication(AppLaunchParams(
       browser()->profile(), extension_app, extensions::LAUNCH_CONTAINER_WINDOW,
-      NEW_WINDOW, extensions::SOURCE_TEST));
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
   ASSERT_TRUE(app_window);
 
   // Apps launched in a window from the NTP have an extensions tab helper but
@@ -1622,7 +1627,7 @@
       content::Source<NavigationController>(
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   back_nav_load_observer.Wait();
   CommandUpdater* command_updater =
       browser()->command_controller()->command_updater();
@@ -1633,7 +1638,7 @@
       content::Source<NavigationController>(
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
-  chrome::GoForward(browser(), CURRENT_TAB);
+  chrome::GoForward(browser(), WindowOpenDisposition::CURRENT_TAB);
   // This check will happen before the navigation completes, since the browser
   // won't process the renderer's response until the Wait() call below.
   EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_FORWARD));
@@ -1986,7 +1991,7 @@
   EXPECT_TRUE(mock_observer.got_user_gesture());
 
   mock_observer.set_got_user_gesture(false);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   EXPECT_TRUE(mock_observer.got_user_gesture());
 }
 
@@ -2371,7 +2376,7 @@
         browser->tab_strip_model()->GetActiveWebContents();
     EXPECT_EQ(url, web_contents->GetURL());
 
-    if (disposition == CURRENT_TAB) {
+    if (disposition == WindowOpenDisposition::CURRENT_TAB) {
       content::WebContents* web_contents =
           browser->tab_strip_model()->GetActiveWebContents();
       content::TestNavigationObserver same_tab_observer(web_contents);
@@ -2389,7 +2394,7 @@
     SimulateMouseClick(web_contents, modifiers, button);
     observer.Wait();
 
-    if (disposition == NEW_WINDOW) {
+    if (disposition == WindowOpenDisposition::NEW_WINDOW) {
       EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile()));
       return;
     }
@@ -2398,10 +2403,10 @@
     EXPECT_EQ(2, browser->tab_strip_model()->count());
     web_contents = browser->tab_strip_model()->GetActiveWebContents();
     WaitForLoadStop(web_contents);
-    if (disposition == NEW_FOREGROUND_TAB) {
+    if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB) {
       EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
     } else {
-      ASSERT_EQ(NEW_BACKGROUND_TAB, disposition);
+      ASSERT_EQ(WindowOpenDisposition::NEW_BACKGROUND_TAB, disposition);
       EXPECT_EQ(getFirstPageTitle(), web_contents->GetTitle());
     }
   }
@@ -2415,7 +2420,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenBasicClickTest) {
   int modifiers = 0;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
 }
 
@@ -2426,7 +2431,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftClickTest) {
   int modifiers = blink::WebInputEvent::ShiftKey;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_WINDOW;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_WINDOW;
   RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
 }
 
@@ -2439,7 +2444,7 @@
   int modifiers = blink::WebInputEvent::ControlKey;
 #endif
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
 }
 
@@ -2453,7 +2458,7 @@
 #endif
   modifiers |= blink::WebInputEvent::ShiftKey;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
 }
 
@@ -2462,7 +2467,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefBasicClickTest) {
   int modifiers = 0;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = CURRENT_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
@@ -2473,7 +2478,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftClickTest) {
   int modifiers = blink::WebInputEvent::ShiftKey;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_WINDOW;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_WINDOW;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
@@ -2486,7 +2491,7 @@
   int modifiers = blink::WebInputEvent::ControlKey;
 #endif
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
@@ -2501,7 +2506,7 @@
 #endif
   modifiers |= blink::WebInputEvent::ShiftKey;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Left;
-  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
@@ -2509,7 +2514,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefMiddleClickTest) {
   int modifiers = 0;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Middle;
-  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
@@ -2518,7 +2523,7 @@
 IN_PROC_BROWSER_TEST_F(ClickModifierTest, DISABLED_HrefShiftMiddleClickTest) {
   int modifiers = blink::WebInputEvent::ShiftKey;
   blink::WebMouseEvent::Button button = blink::WebMouseEvent::Button::Middle;
-  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
 }
 
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index ef5a797..baafa1b 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -106,7 +106,7 @@
       command_updater_(this),
       block_command_execution_(false),
       last_blocked_command_id_(-1),
-      last_blocked_command_disposition_(CURRENT_TAB) {
+      last_blocked_command_disposition_(WindowOpenDisposition::CURRENT_TAB) {
   browser_->tab_strip_model()->AddObserver(this);
   PrefService* local_state = g_browser_process->local_state();
   if (local_state) {
@@ -222,7 +222,7 @@
   block_command_execution_ = block;
   if (block) {
     last_blocked_command_id_ = -1;
-    last_blocked_command_disposition_ = CURRENT_TAB;
+    last_blocked_command_disposition_ = WindowOpenDisposition::CURRENT_TAB;
   }
 }
 
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index b67422e8..fefd9004 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -186,18 +186,19 @@
                                         WindowOpenDisposition disposition) {
   WebContents* current_tab = browser->tab_strip_model()->GetActiveWebContents();
   switch (disposition) {
-    case NEW_FOREGROUND_TAB:
-    case NEW_BACKGROUND_TAB: {
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
+    case WindowOpenDisposition::NEW_BACKGROUND_TAB: {
       WebContents* new_tab = current_tab->Clone();
-      if (disposition == NEW_BACKGROUND_TAB)
+      if (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)
         new_tab->WasHidden();
       browser->tab_strip_model()->AddWebContents(
           new_tab, -1, ui::PAGE_TRANSITION_LINK,
-          (disposition == NEW_FOREGROUND_TAB) ?
-              TabStripModel::ADD_ACTIVE : TabStripModel::ADD_NONE);
+          (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB)
+              ? TabStripModel::ADD_ACTIVE
+              : TabStripModel::ADD_NONE);
       return new_tab;
     }
-    case NEW_WINDOW: {
+    case WindowOpenDisposition::NEW_WINDOW: {
       WebContents* new_tab = current_tab->Clone();
       Browser* new_browser =
           new Browser(Browser::CreateParams(browser->profile()));
@@ -469,7 +470,8 @@
     url = extensions::AppLaunchInfo::GetLaunchWebURL(extension);
   }
 
-  if (disposition == CURRENT_TAB || disposition == NEW_FOREGROUND_TAB)
+  if (disposition == WindowOpenDisposition::CURRENT_TAB ||
+      disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB)
     extensions::MaybeShowExtensionControlledHomeNotification(browser);
 #endif
 
diff --git a/chrome/browser/ui/browser_focus_uitest.cc b/chrome/browser/ui/browser_focus_uitest.cc
index fd03279..e7e0449 100644
--- a/chrome/browser/ui/browser_focus_uitest.cc
+++ b/chrome/browser/ui/browser_focus_uitest.cc
@@ -599,7 +599,7 @@
         content::Source<content::NavigationController>(
             &browser()->tab_strip_model()->GetActiveWebContents()->
                 GetController()));
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
   // Focus should stay on the location bar.
@@ -616,7 +616,7 @@
         content::Source<content::NavigationController>(
             &browser()->tab_strip_model()->GetActiveWebContents()->
                 GetController()));
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
 
@@ -639,7 +639,7 @@
         content::Source<content::NavigationController>(
             &browser()->tab_strip_model()->GetActiveWebContents()->
                 GetController()));
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     observer.Wait();
   }
 
@@ -669,7 +669,7 @@
   // Navigate to url.
   chrome::NavigateParams p(browser(), url, ui::PAGE_TRANSITION_LINK);
   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
-  p.disposition = CURRENT_TAB;
+  p.disposition = WindowOpenDisposition::CURRENT_TAB;
   chrome::Navigate(&p);
 
   // Focus the omnibox.
@@ -679,9 +679,9 @@
       GetOmniboxView()->model()->controller();
 
   // Simulate an alt-enter.
-  controller->OnAutocompleteAccept(url2, NEW_FOREGROUND_TAB,
-                                   ui::PAGE_TRANSITION_TYPED,
-                                   AutocompleteMatchType::URL_WHAT_YOU_TYPED);
+  controller->OnAutocompleteAccept(
+      url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_TYPED, AutocompleteMatchType::URL_WHAT_YOU_TYPED);
 
   // Make sure the second tab is selected.
   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
@@ -724,7 +724,7 @@
     content::WindowedNotificationObserver back_nav_observer(
         content::NOTIFICATION_NAV_ENTRY_COMMITTED,
         content::NotificationService::AllSources());
-    chrome::GoBack(browser(), CURRENT_TAB);
+    chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
     back_nav_observer.Wait();
   }
 
@@ -736,7 +736,7 @@
     content::WindowedNotificationObserver forward_nav_observer(
         content::NOTIFICATION_NAV_ENTRY_COMMITTED,
         content::NotificationService::AllSources());
-    chrome::GoForward(browser(), CURRENT_TAB);
+    chrome::GoForward(browser(), WindowOpenDisposition::CURRENT_TAB);
     forward_nav_observer.Wait();
   }
 
diff --git a/chrome/browser/ui/browser_instant_controller.cc b/chrome/browser/ui/browser_instant_controller.cc
index 08b8d6f..442ba27 100644
--- a/chrome/browser/ui/browser_instant_controller.cc
+++ b/chrome/browser/ui/browser_instant_controller.cc
@@ -106,14 +106,16 @@
 bool BrowserInstantController::OpenInstant(WindowOpenDisposition disposition,
                                            const GURL& url) {
   // Unsupported dispositions.
-  if (disposition == NEW_BACKGROUND_TAB || disposition == NEW_WINDOW ||
-      disposition == NEW_FOREGROUND_TAB)
+  if (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_WINDOW ||
+      disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB)
     return false;
 
   // The omnibox currently doesn't use other dispositions, so we don't attempt
   // to handle them. If you hit this DCHECK file a bug and I'll (sky) add
   // support for the new disposition.
-  DCHECK(disposition == CURRENT_TAB) << disposition;
+  DCHECK(disposition == WindowOpenDisposition::CURRENT_TAB)
+      << static_cast<int>(disposition);
 
   const base::string16& search_terms =
       search::ExtractSearchTermsFromURL(profile(), url);
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 1f60c7a..816f1d77 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -102,7 +102,8 @@
 
   Profile* profile = params->initiating_profile;
 
-  if (profile->IsOffTheRecord() || params->disposition == OFF_THE_RECORD) {
+  if (profile->IsOffTheRecord() ||
+      params->disposition == WindowOpenDisposition::OFF_THE_RECORD) {
     profile = profile->GetOriginalProfile();
 
     // If incognito is forced, we punt.
@@ -112,7 +113,7 @@
       return false;
     }
 
-    params->disposition = SINGLETON_TAB;
+    params->disposition = WindowOpenDisposition::SINGLETON_TAB;
     params->browser = GetOrCreateBrowser(profile);
     params->window_action = chrome::NavigateParams::SHOW_WINDOW;
   }
@@ -136,22 +137,22 @@
   Profile* profile = params->initiating_profile;
 
   switch (params->disposition) {
-    case CURRENT_TAB:
+    case WindowOpenDisposition::CURRENT_TAB:
       if (params->browser)
         return params->browser;
       // Find a compatible window and re-execute this command in it. Otherwise
       // re-run with NEW_WINDOW.
       return GetOrCreateBrowser(profile);
-    case SINGLETON_TAB:
-    case NEW_FOREGROUND_TAB:
-    case NEW_BACKGROUND_TAB:
+    case WindowOpenDisposition::SINGLETON_TAB:
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
+    case WindowOpenDisposition::NEW_BACKGROUND_TAB:
       // See if we can open the tab in the window this navigator is bound to.
       if (params->browser && WindowCanOpenTabs(params->browser))
         return params->browser;
       // Find a compatible window and re-execute this command in it. Otherwise
       // re-run with NEW_WINDOW.
       return GetOrCreateBrowser(profile);
-    case NEW_POPUP: {
+    case WindowOpenDisposition::NEW_POPUP: {
       // Make a new popup window.
       // Coerce app-style if |source| represents an app.
       std::string app_name;
@@ -180,16 +181,16 @@
       return new Browser(Browser::CreateParams::CreateForApp(
           app_name, params->trusted_source, params->window_bounds, profile));
     }
-    case NEW_WINDOW: {
+    case WindowOpenDisposition::NEW_WINDOW: {
       // Make a new normal browser window.
       return new Browser(Browser::CreateParams(profile));
     }
-    case OFF_THE_RECORD:
+    case WindowOpenDisposition::OFF_THE_RECORD:
       // Make or find an incognito window.
       return GetOrCreateBrowser(profile->GetOffTheRecordProfile());
     // The following types result in no navigation.
-    case SAVE_TO_DISK:
-    case IGNORE_ACTION:
+    case WindowOpenDisposition::SAVE_TO_DISK:
+    case WindowOpenDisposition::IGNORE_ACTION:
       return NULL;
     default:
       NOTREACHED();
@@ -202,35 +203,37 @@
 void NormalizeDisposition(chrome::NavigateParams* params) {
   // Calculate the WindowOpenDisposition if necessary.
   if (params->browser->tab_strip_model()->empty() &&
-      (params->disposition == NEW_BACKGROUND_TAB ||
-       params->disposition == CURRENT_TAB ||
-       params->disposition == SINGLETON_TAB)) {
-    params->disposition = NEW_FOREGROUND_TAB;
+      (params->disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+       params->disposition == WindowOpenDisposition::CURRENT_TAB ||
+       params->disposition == WindowOpenDisposition::SINGLETON_TAB)) {
+    params->disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   }
   if (params->browser->profile()->IsOffTheRecord() &&
-      params->disposition == OFF_THE_RECORD) {
-    params->disposition = NEW_FOREGROUND_TAB;
+      params->disposition == WindowOpenDisposition::OFF_THE_RECORD) {
+    params->disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   }
-  if (!params->source_contents && params->disposition == CURRENT_TAB)
-    params->disposition = NEW_FOREGROUND_TAB;
+  if (!params->source_contents &&
+      params->disposition == WindowOpenDisposition::CURRENT_TAB)
+    params->disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
 
   switch (params->disposition) {
-    case NEW_BACKGROUND_TAB:
+    case WindowOpenDisposition::NEW_BACKGROUND_TAB:
       // Disposition trumps add types. ADD_ACTIVE is a default, so we need to
       // remove it if disposition implies the tab is going to open in the
       // background.
       params->tabstrip_add_types &= ~TabStripModel::ADD_ACTIVE;
       break;
 
-    case NEW_WINDOW:
-    case NEW_POPUP:
+    case WindowOpenDisposition::NEW_WINDOW:
+    case WindowOpenDisposition::NEW_POPUP: {
       // Code that wants to open a new window typically expects it to be shown
       // automatically.
       if (params->window_action == chrome::NavigateParams::NO_ACTION)
         params->window_action = chrome::NavigateParams::SHOW_WINDOW;
       // Fall-through.
-    case NEW_FOREGROUND_TAB:
-    case SINGLETON_TAB:
+    }
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
+    case WindowOpenDisposition::SINGLETON_TAB:
       params->tabstrip_add_types |= TabStripModel::ADD_ACTIVE;
       break;
 
@@ -286,7 +289,8 @@
     } else if (params_->window_action == chrome::NavigateParams::SHOW_WINDOW) {
       params_->browser->window()->Show();
       // If a user gesture opened a popup window, focus the contents.
-      if (params_->user_gesture && params_->disposition == NEW_POPUP &&
+      if (params_->user_gesture &&
+          params_->disposition == WindowOpenDisposition::NEW_POPUP &&
           params_->target_contents) {
         params_->target_contents->Focus();
       }
@@ -345,7 +349,7 @@
         params.source_contents->GetContainerBounds().size();
     create_params.created_with_opener = params.created_with_opener;
   }
-  if (params.disposition == NEW_BACKGROUND_TAB)
+  if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)
     create_params.initially_hidden = true;
 
 #if defined(USE_AURA)
@@ -410,9 +414,8 @@
 #endif
 
   // The browser window may want to adjust the disposition.
-  if (params->disposition == NEW_POPUP &&
-      source_browser &&
-      source_browser->window()) {
+  if (params->disposition == WindowOpenDisposition::NEW_POPUP &&
+      source_browser && source_browser->window()) {
     params->disposition =
         source_browser->window()->GetDispositionForPopupBounds(
             params->window_bounds);
@@ -473,7 +476,7 @@
 
   // If we create a popup window from a non user-gesture, don't activate it.
   if (params->window_action == NavigateParams::SHOW_WINDOW &&
-      params->disposition == NEW_POPUP &&
+      params->disposition == WindowOpenDisposition::NEW_POPUP &&
       params->user_gesture == false) {
     params->window_action = NavigateParams::SHOW_WINDOW_INACTIVE;
   }
@@ -506,7 +509,7 @@
   // exists.
   if (!params->target_contents && singleton_index < 0) {
     DCHECK(!params->url.is_empty());
-    if (params->disposition != CURRENT_TAB) {
+    if (params->disposition != WindowOpenDisposition::CURRENT_TAB) {
       params->target_contents = CreateTargetContents(*params, params->url);
 
       // This function takes ownership of |params->target_contents| until it
@@ -546,13 +549,14 @@
   // lose focus, then make sure the focus for the source tab goes away from the
   // omnibox.
   if (params->source_contents &&
-      (params->disposition == NEW_FOREGROUND_TAB ||
-       params->disposition == NEW_WINDOW) &&
+      (params->disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+       params->disposition == WindowOpenDisposition::NEW_WINDOW) &&
       (params->tabstrip_add_types & TabStripModel::ADD_INHERIT_OPENER))
     params->source_contents->Focus();
 
   if (params->source_contents == params->target_contents ||
-      (swapped_in_prerender && params->disposition == CURRENT_TAB)) {
+      (swapped_in_prerender &&
+       params->disposition == WindowOpenDisposition::CURRENT_TAB)) {
     // The navigation occurred in the source tab.
     params->browser->UpdateUIForNavigationInTab(
         params->target_contents, params->transition, params->window_action,
@@ -592,7 +596,7 @@
     }
   }
 
-  if (params->disposition != CURRENT_TAB) {
+  if (params->disposition != WindowOpenDisposition::CURRENT_TAB) {
     content::NotificationService::current()->Notify(
         chrome::NOTIFICATION_TAB_ADDED,
         content::Source<content::WebContentsDelegate>(params->browser),
diff --git a/chrome/browser/ui/browser_navigator_browsertest.cc b/chrome/browser/ui/browser_navigator_browsertest.cc
index efae8f1..dad1b0a 100644
--- a/chrome/browser/ui/browser_navigator_browsertest.cc
+++ b/chrome/browser/ui/browser_navigator_browsertest.cc
@@ -92,7 +92,7 @@
     const GURL& url, const std::string& post_data, bool is_browser_initiated,
     base::string16* title) {
   chrome::NavigateParams param(MakeNavigateParams());
-  param.disposition = NEW_FOREGROUND_TAB;
+  param.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   param.url = url;
   param.is_renderer_initiated = !is_browser_initiated;
   param.uses_post = true;
@@ -164,7 +164,7 @@
 
   // Navigate to the page.
   chrome::NavigateParams params(MakeNavigateParams(incognito_browser));
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = url;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
@@ -191,7 +191,7 @@
 
   // Navigate to the page.
   chrome::NavigateParams params(MakeNavigateParams(browser));
-  params.disposition = OFF_THE_RECORD;
+  params.disposition = WindowOpenDisposition::OFF_THE_RECORD;
   params.url = url;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
@@ -262,7 +262,7 @@
 
   // Navigate to singleton_url1.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_url1;
   chrome::Navigate(&params);
 
@@ -291,7 +291,7 @@
 
   // Navigate to singleton_url2.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_ref_url2;
   chrome::Navigate(&params);
 
@@ -302,7 +302,7 @@
 
   // Navigate to singleton_url2, but with respect ref set.
   params = MakeNavigateParams();
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_ref_url2;
   params.ref_behavior = chrome::NavigateParams::RESPECT_REF;
   chrome::Navigate(&params);
@@ -314,7 +314,7 @@
 
   // Navigate to singleton_url3.
   params = MakeNavigateParams();
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_ref_url3;
   params.ref_behavior = chrome::NavigateParams::RESPECT_REF;
   chrome::Navigate(&params);
@@ -335,7 +335,7 @@
 
   // Navigate to singleton_url1.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_url1;
   chrome::Navigate(&params);
 
@@ -352,7 +352,7 @@
   WebContents* old_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
   EXPECT_NE(old_contents,
             browser()->tab_strip_model()->GetActiveWebContents());
@@ -367,7 +367,7 @@
   WebContents* old_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_BACKGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   chrome::Navigate(&params);
   WebContents* new_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -387,7 +387,7 @@
   Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP,
                                              browser()->profile());
   chrome::NavigateParams params(MakeNavigateParams(popup));
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 
   // Navigate() should have opened the tab in a different browser since the
@@ -420,7 +420,7 @@
       Browser::TYPE_POPUP,
       browser()->profile()->GetOffTheRecordProfile());
   chrome::NavigateParams params(MakeNavigateParams(popup));
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 
   // Navigate() should have opened the tab in a different browser since the
@@ -446,7 +446,7 @@
 // from a normal Browser results in a new Browser with TYPE_POPUP.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_bounds = gfx::Rect(0, 0, 200, 200);
   // Wait for new popup to to load and gain focus.
   ui_test_utils::NavigateToURL(&params);
@@ -471,7 +471,7 @@
 // from a normal Browser results in a new Browser with is_app() true.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup_ExtensionId) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.extension_app_id = "extensionappid";
   params.window_bounds = gfx::Rect(0, 0, 200, 200);
   // Wait for new popup to to load and gain focus.
@@ -494,12 +494,12 @@
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) {
   // Open a popup.
   chrome::NavigateParams params1(MakeNavigateParams());
-  params1.disposition = NEW_POPUP;
+  params1.disposition = WindowOpenDisposition::NEW_POPUP;
   params1.window_bounds = gfx::Rect(0, 0, 200, 200);
   chrome::Navigate(&params1);
   // Open another popup.
   chrome::NavigateParams params2(MakeNavigateParams(params1.browser));
-  params2.disposition = NEW_POPUP;
+  params2.disposition = WindowOpenDisposition::NEW_POPUP;
   params2.window_bounds = gfx::Rect(0, 0, 200, 200);
   chrome::Navigate(&params2);
 
@@ -522,7 +522,7 @@
                        Disposition_NewPopupFromAppWindow) {
   Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
   chrome::NavigateParams params(MakeNavigateParams(app_browser));
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_bounds = gfx::Rect(0, 0, 200, 200);
   chrome::Navigate(&params);
 
@@ -547,12 +547,12 @@
   Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
   // Open an app popup.
   chrome::NavigateParams params1(MakeNavigateParams(app_browser));
-  params1.disposition = NEW_POPUP;
+  params1.disposition = WindowOpenDisposition::NEW_POPUP;
   params1.window_bounds = gfx::Rect(0, 0, 200, 200);
   chrome::Navigate(&params1);
   // Now open another app popup.
   chrome::NavigateParams params2(MakeNavigateParams(params1.browser));
-  params2.disposition = NEW_POPUP;
+  params2.disposition = WindowOpenDisposition::NEW_POPUP;
   params2.window_bounds = gfx::Rect(0, 0, 200, 200);
   chrome::Navigate(&params2);
 
@@ -582,7 +582,7 @@
 // does not focus a new new popup window.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_bounds = gfx::Rect(0, 0, 200, 200);
   params.window_action = chrome::NavigateParams::SHOW_WINDOW_INACTIVE;
   // Wait for new popup to load (and gain focus if the test fails).
@@ -602,7 +602,7 @@
 // is true.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupTrusted) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.trusted_source = true;
   params.window_bounds = gfx::Rect(0, 0, 200, 200);
   // Wait for new popup to to load and gain focus.
@@ -619,7 +619,7 @@
 // always opens a new window.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_WINDOW;
+  params.disposition = WindowOpenDisposition::NEW_WINDOW;
   chrome::Navigate(&params);
 
   // Navigate() should have opened a new toplevel window.
@@ -637,7 +637,7 @@
 // opens a new incognito window if no existing incognito window is present.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = OFF_THE_RECORD;
+  params.disposition = WindowOpenDisposition::OFF_THE_RECORD;
   chrome::Navigate(&params);
 
   // Navigate() should have opened a new toplevel incognito window.
@@ -663,7 +663,7 @@
       CreateEmptyBrowserForType(Browser::TYPE_TABBED,
                                 browser()->profile()->GetOffTheRecordProfile());
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = OFF_THE_RECORD;
+  params.disposition = WindowOpenDisposition::OFF_THE_RECORD;
   chrome::Navigate(&params);
 
   // Navigate() should have opened a new tab in the existing incognito window.
@@ -680,19 +680,19 @@
 // This test verifies that no navigation action occurs when
 // WindowOpenDisposition = SAVE_TO_DISK.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) {
-  RunSuppressTest(SAVE_TO_DISK);
+  RunSuppressTest(WindowOpenDisposition::SAVE_TO_DISK);
 }
 
 // This test verifies that no navigation action occurs when
 // WindowOpenDisposition = IGNORE_ACTION.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) {
-  RunSuppressTest(IGNORE_ACTION);
+  RunSuppressTest(WindowOpenDisposition::IGNORE_ACTION);
 }
 
 // This tests adding a foreground tab with a predefined WebContents.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.target_contents = CreateWebContents(false);
   chrome::Navigate(&params);
 
@@ -711,7 +711,7 @@
 // This tests adding a popup with a predefined WebContents.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.target_contents = CreateWebContents(false);
   params.window_bounds = gfx::Rect(10, 10, 500, 500);
   chrome::Navigate(&params);
@@ -751,7 +751,7 @@
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
                        CreateWebContentsWithRendererProcess) {
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.target_contents = CreateWebContents(true);
   ASSERT_TRUE(params.target_contents);
 
@@ -793,7 +793,7 @@
   // covered by the unit tests for TabStripModel. This merely verifies that
   // insertion index preference is reflected in common cases.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.tabstrip_index = 0;
   params.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX;
   chrome::Navigate(&params);
@@ -823,7 +823,7 @@
 
   // Navigate to a new singleton tab with a sub-page.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = GetContentSettingsURL();
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -857,7 +857,7 @@
 
   // Navigate to singleton_url1.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = GetContentSettingsURL();
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -891,7 +891,7 @@
 
   // Navigate to singleton_url1.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = GetClearBrowsingDataURL();
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -925,7 +925,7 @@
 
   // Navigate to singleton_url1.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = GetClearBrowsingDataURL();
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_STAY_PUT;
@@ -957,7 +957,7 @@
   // Navigate to a different settings path.
   GURL singleton_url_target(GetClearBrowsingDataURL());
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_url_target;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -990,7 +990,7 @@
       "chrome://settings/internet?"
       "guid=ethernet_00aa00aa00aa&networkType=1");
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_url_target;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -1039,7 +1039,7 @@
     DISABLED_Disposition_Settings_UseNonIncognitoWindowForBookmark) {
   chrome::NavigateParams params(browser(), GetSettingsURL(),
                                 ui::PAGE_TRANSITION_AUTO_BOOKMARK);
-  params.disposition = OFF_THE_RECORD;
+  params.disposition = WindowOpenDisposition::OFF_THE_RECORD;
   {
     content::WindowedNotificationObserver observer(
         content::NOTIFICATION_LOAD_STOP,
@@ -1098,7 +1098,7 @@
   EXPECT_TRUE(web_contents->IsCrashed());
 
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = singleton_url;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -1376,7 +1376,7 @@
   chrome::NavigateParams singleton_params(browser(),
                                           GURL(chrome::kChromeUIVersionURL),
                                           ui::PAGE_TRANSITION_LINK);
-  singleton_params.disposition = SINGLETON_TAB;
+  singleton_params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   EXPECT_EQ(-1, chrome::GetIndexOfSingletonTab(&singleton_params));
 }
 
@@ -1433,7 +1433,7 @@
 
   // Navigate to the page.
   chrome::NavigateParams params(MakeNavigateParams());
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.url = GURL(data_url);
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   ui_test_utils::NavigateToURL(&params);
diff --git a/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc b/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
index e125acb..3b8bc4b 100644
--- a/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
+++ b/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
@@ -50,7 +50,7 @@
 
   // Navigate to the settings page.
   chrome::NavigateParams params(MakeNavigateParams(incognito_browser));
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.url = GURL("chrome://chrome/settings");
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -83,7 +83,7 @@
 
     // Navigate to the settings page.
     chrome::NavigateParams params(MakeNavigateParams(browser()));
-    params.disposition = NEW_POPUP;
+    params.disposition = WindowOpenDisposition::NEW_POPUP;
     params.url = GURL("chrome://chrome/settings");
     params.window_action = chrome::NavigateParams::SHOW_WINDOW;
     params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
@@ -107,7 +107,7 @@
 
     // Navigate to the settings page.
     chrome::NavigateParams params(MakeNavigateParams(browser()));
-    params.disposition = NEW_POPUP;
+    params.disposition = WindowOpenDisposition::NEW_POPUP;
     params.url = GURL("chrome://chrome/settings");
     params.window_action = chrome::NavigateParams::SHOW_WINDOW;
     params.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
diff --git a/chrome/browser/ui/browser_navigator_params.cc b/chrome/browser/ui/browser_navigator_params.cc
index d60cc75e..40ddeaa 100644
--- a/chrome/browser/ui/browser_navigator_params.cc
+++ b/chrome/browser/ui/browser_navigator_params.cc
@@ -25,7 +25,7 @@
       uses_post(false),
       target_contents(a_target_contents),
       source_contents(nullptr),
-      disposition(CURRENT_TAB),
+      disposition(WindowOpenDisposition::CURRENT_TAB),
       trusted_source(false),
       transition(ui::PAGE_TRANSITION_LINK),
       is_renderer_initiated(false),
@@ -37,8 +37,7 @@
       ref_behavior(IGNORE_REF),
       initiating_profile(nullptr),
       should_replace_current_entry(false),
-      created_with_opener(false) {
-}
+      created_with_opener(false) {}
 #else
 NavigateParams::NavigateParams(Browser* a_browser,
                                const GURL& a_url,
@@ -48,7 +47,7 @@
       uses_post(false),
       target_contents(NULL),
       source_contents(NULL),
-      disposition(CURRENT_TAB),
+      disposition(WindowOpenDisposition::CURRENT_TAB),
       trusted_source(false),
       transition(a_transition),
       is_renderer_initiated(false),
@@ -61,8 +60,7 @@
       browser(a_browser),
       initiating_profile(NULL),
       should_replace_current_entry(false),
-      created_with_opener(false) {
-}
+      created_with_opener(false) {}
 
 NavigateParams::NavigateParams(Browser* a_browser,
                                WebContents* a_target_contents)
@@ -70,7 +68,7 @@
       uses_post(false),
       target_contents(a_target_contents),
       source_contents(NULL),
-      disposition(CURRENT_TAB),
+      disposition(WindowOpenDisposition::CURRENT_TAB),
       trusted_source(false),
       transition(ui::PAGE_TRANSITION_LINK),
       is_renderer_initiated(false),
@@ -83,8 +81,7 @@
       browser(a_browser),
       initiating_profile(NULL),
       should_replace_current_entry(false),
-      created_with_opener(false) {
-}
+      created_with_opener(false) {}
 #endif  // !defined(OS_ANDROID)
 
 NavigateParams::NavigateParams(Profile* a_profile,
@@ -95,7 +92,7 @@
       uses_post(false),
       target_contents(NULL),
       source_contents(NULL),
-      disposition(NEW_FOREGROUND_TAB),
+      disposition(WindowOpenDisposition::NEW_FOREGROUND_TAB),
       trusted_source(false),
       transition(a_transition),
       is_renderer_initiated(false),
diff --git a/chrome/browser/ui/browser_tabrestore_browsertest.cc b/chrome/browser/ui/browser_tabrestore_browsertest.cc
index 90af588..5fd6ac3 100644
--- a/chrome/browser/ui/browser_tabrestore_browsertest.cc
+++ b/chrome/browser/ui/browser_tabrestore_browsertest.cc
@@ -47,10 +47,10 @@
   GURL test_page(ui_test_utils::GetTestUrl(base::FilePath(),
       base::FilePath(FILE_PATH_LITERAL("tab-restore-visibility.html"))));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser, test_page, NEW_FOREGROUND_TAB,
+      browser, test_page, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser, test_page, NEW_BACKGROUND_TAB,
+      browser, test_page, WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 }
 
@@ -69,9 +69,7 @@
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_WINDOW,
+      browser(), GURL(url::kAboutBlankURL), WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   BrowserList* active_browser_list = BrowserList::GetInstance();
   EXPECT_EQ(2u, active_browser_list->size());
@@ -104,9 +102,7 @@
 
   // Create a new browser.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url::kAboutBlankURL),
-      NEW_WINDOW,
+      browser(), GURL(url::kAboutBlankURL), WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER);
   BrowserList* active_browser_list = BrowserList::GetInstance();
   EXPECT_EQ(2u, active_browser_list->size());
diff --git a/chrome/browser/ui/browser_tabstrip.cc b/chrome/browser/ui/browser_tabstrip.cc
index 995e0de..f75af14 100644
--- a/chrome/browser/ui/browser_tabstrip.cc
+++ b/chrome/browser/ui/browser_tabstrip.cc
@@ -27,7 +27,8 @@
   chrome::NavigateParams params(browser,
       url.is_empty() ? GURL(chrome::kChromeUINewTabURL) : url,
       ui::PAGE_TRANSITION_TYPED);
-  params.disposition = foreground ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
+  params.disposition = foreground ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                                  : WindowOpenDisposition::NEW_BACKGROUND_TAB;
   params.tabstrip_index = idx;
   chrome::Navigate(&params);
   CoreTabHelper* core_tab_helper =
@@ -40,7 +41,7 @@
     const GURL& url,
     ui::PageTransition transition) {
   NavigateParams params(browser, url, transition);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   Navigate(&params);
   return params.target_contents;
 }
@@ -53,9 +54,9 @@
                     bool user_gesture,
                     bool* was_blocked) {
   // No code for this yet.
-  DCHECK(disposition != SAVE_TO_DISK);
+  DCHECK(disposition != WindowOpenDisposition::SAVE_TO_DISK);
   // Can't create a new contents for the current tab - invalid case.
-  DCHECK(disposition != CURRENT_TAB);
+  DCHECK(disposition != WindowOpenDisposition::CURRENT_TAB);
 
   NavigateParams params(browser, new_contents);
   params.source_contents = source_contents;
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index cb5d5c5..0d4739e 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -104,11 +104,11 @@
     default:
       NOTREACHED() << "Unhandled help source" << source;
   }
-  OpenApplication(
-      AppLaunchParams(profile, extension,
-                      extensions::GetLaunchContainer(
-                          extensions::ExtensionPrefs::Get(profile), extension),
-                      NEW_FOREGROUND_TAB, app_launch_source, true));
+  OpenApplication(AppLaunchParams(
+      profile, extension,
+      extensions::GetLaunchContainer(extensions::ExtensionPrefs::Get(profile),
+                                     extension),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, app_launch_source, true));
 #else
   GURL url;
   switch (source) {
diff --git a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
index b43b88b..4552193 100644
--- a/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/tab_applescript.mm
@@ -146,11 +146,8 @@
 
   const GURL& previousURL = entry->GetVirtualURL();
   webContents_->OpenURL(OpenURLParams(
-      url,
-      content::Referrer(previousURL, blink::WebReferrerPolicyDefault),
-      CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED,
-      false));
+      url, content::Referrer(previousURL, blink::WebReferrerPolicyDefault),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
 }
 
 - (NSString*)title {
@@ -284,10 +281,8 @@
     webContents_->OpenURL(
         OpenURLParams(GURL(content::kViewSourceScheme + std::string(":") +
                            entry->GetURL().spec()),
-                      Referrer(),
-                      NEW_FOREGROUND_TAB,
-                      ui::PAGE_TRANSITION_LINK,
-                      false));
+                      Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      ui::PAGE_TRANSITION_LINK, false));
   }
 }
 
diff --git a/chrome/browser/ui/cocoa/applescript/window_applescript.mm b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
index 66fd7c55..e77835b 100644
--- a/chrome/browser/ui/cocoa/applescript/window_applescript.mm
+++ b/chrome/browser/ui/cocoa/applescript/window_applescript.mm
@@ -200,7 +200,7 @@
   base::TimeTicks newTabStartTime = base::TimeTicks::Now();
   chrome::NavigateParams params(browser_, GURL(chrome::kChromeUINewTabURL),
                                 ui::PAGE_TRANSITION_TYPED);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   params.tabstrip_index = index;
   chrome::Navigate(&params);
   CoreTabHelper* core_tab_helper =
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 6c49dca..87552244 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
@@ -66,9 +66,9 @@
       content::WindowedNotificationObserver app_loaded_observer(
           content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME,
           content::NotificationService::AllSources());
-      OpenApplication(
-          AppLaunchParams(profile(), app_, extensions::LAUNCH_CONTAINER_NONE,
-                          NEW_WINDOW, extensions::SOURCE_TEST));
+      OpenApplication(AppLaunchParams(
+          profile(), app_, extensions::LAUNCH_CONTAINER_NONE,
+          WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST));
       app_loaded_observer.Wait();
     }
   }
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
index fb15b7d8..1a798307 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bar_controller_unittest.mm
@@ -747,7 +747,7 @@
 
   [bar_ openBookmark:button];
   EXPECT_EQ(noOpenBar()->urls_[0], node->url());
-  EXPECT_EQ(noOpenBar()->dispositions_[0], CURRENT_TAB);
+  EXPECT_EQ(noOpenBar()->dispositions_[0], WindowOpenDisposition::CURRENT_TAB);
 }
 
 TEST_F(BookmarkBarControllerTest, TestAddRemoveAndClear) {
@@ -1793,8 +1793,9 @@
   [first performClick:first];
 
   size_t dispositionCount = noOpenBar()->dispositions_.size();
-  EXPECT_EQ(originalDispositionCount+1, dispositionCount);
-  EXPECT_EQ(noOpenBar()->dispositions_[dispositionCount-1], NEW_BACKGROUND_TAB);
+  EXPECT_EQ(originalDispositionCount + 1, dispositionCount);
+  EXPECT_EQ(noOpenBar()->dispositions_[dispositionCount - 1],
+            WindowOpenDisposition::NEW_BACKGROUND_TAB);
 
   // Replace NSApp
   NSApp = oldApp;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.mm
index 147a798..fd8c94f 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_folder_target.mm
@@ -65,10 +65,9 @@
   NSEvent* event = [NSApp currentEvent];
   WindowOpenDisposition disposition =
       ui::WindowOpenDispositionFromNSEvent(event);
-  if (([event type] != NSMouseEntered) &&
-      ([event type] != NSMouseMoved) &&
+  if (([event type] != NSMouseEntered) && ([event type] != NSMouseMoved) &&
       ([event type] != NSScrollWheel) &&
-      (disposition == NEW_BACKGROUND_TAB)) {
+      (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)) {
     [controller_ closeAllBookmarkFolders];
     [controller_ openAll:[sender bookmarkNode] disposition:disposition];
     return;
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm
index 169beadc..88b94229 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm
@@ -122,9 +122,9 @@
 
   chrome::OpenAll(NULL, browser, node, disposition, browser->profile());
 
-  if (disposition == NEW_FOREGROUND_TAB) {
+  if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB) {
     content::RecordAction(UserMetricsAction("OpenAllBookmarks"));
-  } else if (disposition == NEW_WINDOW) {
+  } else if (disposition == WindowOpenDisposition::NEW_WINDOW) {
     content::RecordAction(UserMetricsAction("OpenAllBookmarksNewWindow"));
   } else {
     content::RecordAction(
@@ -144,15 +144,18 @@
 }
 
 - (IBAction)openAllBookmarks:(id)sender {
-  [self openAll:[sender tag] withDisposition:NEW_FOREGROUND_TAB];
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+  [self openAll:[sender tag] withDisposition:disposition];
 }
 
 - (IBAction)openAllBookmarksNewWindow:(id)sender {
-  [self openAll:[sender tag] withDisposition:NEW_WINDOW];
+  WindowOpenDisposition disposition = WindowOpenDisposition::NEW_WINDOW;
+  [self openAll:[sender tag] withDisposition:disposition];
 }
 
 - (IBAction)openAllBookmarksIncognitoWindow:(id)sender {
-  [self openAll:[sender tag] withDisposition:OFF_THE_RECORD];
+  WindowOpenDisposition disposition = WindowOpenDisposition::OFF_THE_RECORD;
+  [self openAll:[sender tag] withDisposition:disposition];
 }
 
 @end  // BookmarkMenuCocoaController
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm
index 3aad9f8..f8266e3c 100644
--- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm
@@ -56,11 +56,11 @@
 
 - (void)openAll:(NSInteger)tag
     withDisposition:(WindowOpenDisposition)disposition {
-  if (disposition == NEW_FOREGROUND_TAB) {
+  if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB) {
     opened_new_foreground_tab = YES;
-  } else if (disposition == NEW_WINDOW) {
+  } else if (disposition == WindowOpenDisposition::NEW_WINDOW) {
     opened_new_window = YES;
-  } else if (disposition == OFF_THE_RECORD) {
+  } else if (disposition == WindowOpenDisposition::OFF_THE_RECORD) {
     opened_off_the_record = YES;
   }
 }
diff --git a/chrome/browser/ui/cocoa/browser_window_cocoa.mm b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
index 1d2228c..ecbada6 100644
--- a/chrome/browser/ui/cocoa/browser_window_cocoa.mm
+++ b/chrome/browser/ui/cocoa/browser_window_cocoa.mm
@@ -752,8 +752,8 @@
     const gfx::Rect& bounds) {
   // When using Cocoa's System Fullscreen mode, convert popups into tabs.
   if ([controller_ isInAppKitFullscreen])
-    return NEW_FOREGROUND_TAB;
-  return NEW_POPUP;
+    return WindowOpenDisposition::NEW_FOREGROUND_TAB;
+  return WindowOpenDisposition::NEW_POPUP;
 }
 
 FindBar* BrowserWindowCocoa::CreateFindBar() {
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
index b0d72ada..46e17a9 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller_browsertest.mm
@@ -446,7 +446,7 @@
   void AddTabAtBackground(int index, GURL url) {
     chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
     params.tabstrip_index = index;
-    params.disposition = NEW_BACKGROUND_TAB;
+    params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
     chrome::Navigate(&params);
     content::WaitForLoadStopWithoutSuccessCheck(params.target_contents);
   }
diff --git a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm
index 1f9582a..ac2d480 100644
--- a/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm
@@ -99,7 +99,8 @@
           content::WebContents::CreateParams(browser()->profile())));
   bool was_blocked = false;
   chrome::AddWebContents(browser(), NULL, web_contents.release(),
-                         NEW_BACKGROUND_TAB, gfx::Rect(), false, &was_blocked);
+                         WindowOpenDisposition::NEW_BACKGROUND_TAB, gfx::Rect(),
+                         false, &was_blocked);
   content::WebContents* tab2 =
       browser()->tab_strip_model()->GetWebContentsAt(2);
   ASSERT_TRUE(tab2);
diff --git a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
index 279270e..1d5ca18 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_install_view_controller.mm
@@ -252,8 +252,9 @@
 - (IBAction)storeLinkClicked:(id)sender {
   GURL store_url(extension_urls::GetWebstoreItemDetailURLPrefix() +
                  prompt_->extension()->id());
-  OpenURLParams params(store_url, Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false);
+  OpenURLParams params(store_url, Referrer(),
+                       WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
   if (navigator_) {
     navigator_->OpenURL(params);
   } else {
diff --git a/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm b/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
index 6d672cb..0f7c796 100644
--- a/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
+++ b/chrome/browser/ui/cocoa/history_menu_cocoa_controller.mm
@@ -49,7 +49,8 @@
     Browser* browser = chrome::FindTabbedBrowser(bridge_->profile(), false);
     BrowserLiveTabContext* context =
         browser ? browser->live_tab_context() : NULL;
-    service->RestoreEntryById(context, node->session_id, UNKNOWN);
+    service->RestoreEntryById(context, node->session_id,
+                              WindowOpenDisposition::UNKNOWN);
   } else {
     DCHECK(node->url.is_valid());
     WindowOpenDisposition disposition =
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm
index ad7b278c..ee0a228 100644
--- a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm
+++ b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm
@@ -162,7 +162,7 @@
 
 void OmniboxPopupViewMac::OnMatrixRowMiddleClicked(OmniboxPopupMatrix* matrix,
                                                    size_t row) {
-  OpenURLForRow(row, NEW_BACKGROUND_TAB);
+  OpenURLForRow(row, WindowOpenDisposition::NEW_BACKGROUND_TAB);
 }
 
 const AutocompleteResult& OmniboxPopupViewMac::GetResult() const {
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
index 3a0f688..3c202f5e 100644
--- a/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
+++ b/chrome/browser/ui/cocoa/omnibox/omnibox_view_mac.mm
@@ -879,7 +879,7 @@
 
   // Option-Return
   if (cmd == @selector(insertNewlineIgnoringFieldEditor:)) {
-    model()->AcceptInput(NEW_FOREGROUND_TAB, false);
+    model()->AcceptInput(WindowOpenDisposition::NEW_FOREGROUND_TAB, false);
     return true;
   }
 
diff --git a/chrome/browser/ui/cocoa/one_click_signin_view_controller.mm b/chrome/browser/ui/cocoa/one_click_signin_view_controller.mm
index afba24fc..6ed318a 100644
--- a/chrome/browser/ui/cocoa/one_click_signin_view_controller.mm
+++ b/chrome/browser/ui/cocoa/one_click_signin_view_controller.mm
@@ -111,9 +111,9 @@
         OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST);
   }
   else {
-    content::OpenURLParams params(GURL(chrome::kChromeUISettingsURL),
-                                  content::Referrer(), CURRENT_TAB,
-                                  ui::PAGE_TRANSITION_LINK, false);
+    content::OpenURLParams params(
+        GURL(chrome::kChromeUISettingsURL), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_LINK, false);
     webContents_->OpenURL(params);
   }
   [self close];
@@ -288,8 +288,9 @@
     signin_metrics::LogSigninConfirmHistogramValue(
         signin_metrics::HISTOGRAM_CONFIRM_LEARN_MORE);
   }
-  WindowOpenDisposition location = isSyncDialog_ ?
-                                   NEW_WINDOW : NEW_FOREGROUND_TAB;
+  WindowOpenDisposition location =
+      isSyncDialog_ ? WindowOpenDisposition::NEW_WINDOW
+                    : WindowOpenDisposition::NEW_FOREGROUND_TAB;
   content::OpenURLParams params(GURL(chrome::kChromeSyncLearnMoreURL),
                                 content::Referrer(), location,
                                 ui::PAGE_TRANSITION_LINK, false);
diff --git a/chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.mm b/chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.mm
index 48afe78..1b3086c19 100644
--- a/chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/profiles/avatar_menu_bubble_controller.mm
@@ -91,8 +91,9 @@
 
 - (IBAction)switchToProfile:(id)sender {
   // Check the event flags to see if a new window should be crated.
-  bool always_create = ui::WindowOpenDispositionFromNSEvent(
-      [NSApp currentEvent]) == NEW_WINDOW;
+  bool always_create =
+      ui::WindowOpenDispositionFromNSEvent([NSApp currentEvent]) ==
+      WindowOpenDisposition::NEW_WINDOW;
   menu_->SwitchToProfile([sender menuIndex], always_create,
                          ProfileMetrics::SWITCH_PROFILE_ICON);
 }
diff --git a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm
index 59f80c64..01ac15d 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_chooser_controller.mm
@@ -1099,8 +1099,9 @@
 
 - (IBAction)switchToProfile:(id)sender {
   // Check the event flags to see if a new window should be created.
-  bool alwaysCreate = ui::WindowOpenDispositionFromNSEvent(
-      [NSApp currentEvent]) == NEW_WINDOW;
+  bool alwaysCreate =
+      ui::WindowOpenDispositionFromNSEvent([NSApp currentEvent]) ==
+      WindowOpenDisposition::NEW_WINDOW;
   avatarMenu_->SwitchToProfile([sender tag], alwaysCreate,
                                ProfileMetrics::SWITCH_PROFILE_ICON);
 }
diff --git a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
index 9d80639..a1475c79 100644
--- a/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
+++ b/chrome/browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm
@@ -409,7 +409,7 @@
   chrome::NavigateParams params(
       browser_, GURL(chrome::kChromeEnterpriseSignInLearnMoreURL),
       ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.mm b/chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.mm
index f8d9fa69..9ec05b0 100644
--- a/chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.mm
+++ b/chrome/browser/ui/cocoa/tab_contents/sad_tab_controller.mm
@@ -90,7 +90,8 @@
 
 - (void)sadTabView:(SadTabView*)sadTabView
     helpLinkClickedWithURL:(NSString*)url {
-  OpenURLParams params(GURL(url.UTF8String), Referrer(), CURRENT_TAB,
+  OpenURLParams params(GURL(url.UTF8String), Referrer(),
+                       WindowOpenDisposition::CURRENT_TAB,
                        ui::PAGE_TRANSITION_LINK, false);
   webContents_->OpenURL(params);
 }
diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
index 42b280c9..fa209a73 100644
--- a/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
+++ b/chrome/browser/ui/cocoa/tabs/tab_strip_controller.mm
@@ -2018,7 +2018,7 @@
     // Drop in a new tab to the left of tab |i|?
     if (point.x < (frame.origin.x + kLRProportion * frame.size.width)) {
       *index = i;
-      *disposition = NEW_FOREGROUND_TAB;
+      *disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
       return;
     }
 
@@ -2026,7 +2026,7 @@
     if (point.x <= (frame.origin.x +
                        (1.0 - kLRProportion) * frame.size.width)) {
       *index = i;
-      *disposition = CURRENT_TAB;
+      *disposition = WindowOpenDisposition::CURRENT_TAB;
       return;
     }
 
@@ -2037,7 +2037,7 @@
 
   // If we've made it here, we want to append a new tab to the end.
   *index = -1;
-  *disposition = NEW_FOREGROUND_TAB;
+  *disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
 }
 
 - (void)openURL:(GURL*)url inView:(NSView*)view at:(NSPoint)point {
@@ -2050,7 +2050,7 @@
 
   // Either insert a new tab or open in a current tab.
   switch (disposition) {
-    case NEW_FOREGROUND_TAB: {
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB: {
       content::RecordAction(UserMetricsAction("Tab_DropURLBetweenTabs"));
       chrome::NavigateParams params(browser_, *url,
                                     ui::PAGE_TRANSITION_TYPED);
@@ -2061,10 +2061,10 @@
       chrome::Navigate(&params);
       break;
     }
-    case CURRENT_TAB: {
+    case WindowOpenDisposition::CURRENT_TAB: {
       content::RecordAction(UserMetricsAction("Tab_DropURLOnTab"));
-      OpenURLParams params(
-          *url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+      OpenURLParams params(*url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                           ui::PAGE_TRANSITION_TYPED, false);
       tabStripModel_->GetWebContentsAt(index)->OpenURL(params);
       tabStripModel_->ActivateTabAt(index, true);
       break;
@@ -2129,18 +2129,18 @@
   NSPoint arrowPos = NSMakePoint(0, arrowBaseY);
   if (index == -1) {
     // Append a tab at the end.
-    DCHECK(disposition == NEW_FOREGROUND_TAB);
+    DCHECK(disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB);
     NSInteger lastIndex = [tabArray_ count] - 1;
     NSRect overRect = [[[tabArray_ objectAtIndex:lastIndex] view] frame];
     arrowPos.x = overRect.origin.x + overRect.size.width - kTabOverlap / 2.0;
   } else {
     NSRect overRect = [[[tabArray_ objectAtIndex:index] view] frame];
     switch (disposition) {
-      case NEW_FOREGROUND_TAB:
+      case WindowOpenDisposition::NEW_FOREGROUND_TAB:
         // Insert tab (to the left of the given tab).
         arrowPos.x = overRect.origin.x + kTabOverlap / 2.0;
         break;
-      case CURRENT_TAB:
+      case WindowOpenDisposition::CURRENT_TAB:
         // Overwrite the given tab.
         arrowPos.x = overRect.origin.x + overRect.size.width / 2.0;
         break;
@@ -2154,7 +2154,7 @@
   [tabStripView_ setNeedsDisplay:YES];
 
   // Perform a delayed tab transition if hovering directly over a tab.
-  if (index != -1 && disposition == CURRENT_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).
diff --git a/chrome/browser/ui/cocoa/task_manager_mac_browsertest.mm b/chrome/browser/ui/cocoa/task_manager_mac_browsertest.mm
index 5c4b992..ff8e7ccf 100644
--- a/chrome/browser/ui/cocoa/task_manager_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/task_manager_mac_browsertest.mm
@@ -210,10 +210,12 @@
       browser(), embedded_test_server()->GetURL("a.com", "/title2.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("b.com", "/title2.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("c.com", "/title2.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Wait for their titles to appear in the TaskManager. There should be three
   // rows.
@@ -286,7 +288,7 @@
   // Focus and reload one of the sad tabs. It should reappear in the TM. The
   // other sad tab should not reappear.
   tabs[1]->GetDelegate()->ActivateContents(tabs[1]);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows((rows += 1), pattern));
 
   // tabs[2] should still be selected.
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index de26ecc..f52d2b95 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -1154,8 +1154,8 @@
     browser_->window()->GetLocationBar()->GetOmniboxView()->SetUserText(
           OmniboxView::StripJavascriptSchemas(base::UTF8ToUTF16(url.spec())));
   }
-  OpenURLParams params(
-      url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+  OpenURLParams params(url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                       ui::PAGE_TRANSITION_TYPED, false);
   browser_->tab_strip_model()->GetActiveWebContents()->OpenURL(params);
 }
 
@@ -1172,8 +1172,8 @@
       metrics::OmniboxEventProto::BLANK, &match, NULL);
   GURL url(match.destination_url);
 
-  OpenURLParams params(
-      url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
+  OpenURLParams params(url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                       ui::PAGE_TRANSITION_TYPED, false);
   browser_->tab_strip_model()->GetActiveWebContents()->OpenURL(params);
 }
 
diff --git a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
index 27e11baa..d46839811 100644
--- a/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/translate/translate_bubble_controller.mm
@@ -840,9 +840,9 @@
 
 - (IBAction)handleLanguageSettingsLinkButtonPressed:(id)sender {
   GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
-  webContents_->OpenURL(
-      content::OpenURLParams(url, content::Referrer(), NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_LINK, false));
+  webContents_->OpenURL(content::OpenURLParams(
+      url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false));
   translate::ReportUiAction(translate::SETTINGS_LINK_CLICKED);
   [self close];
 }
diff --git a/chrome/browser/ui/cocoa/view_id_util_browsertest.mm b/chrome/browser/ui/cocoa/view_id_util_browsertest.mm
index 55103fe..b935b4c 100644
--- a/chrome/browser/ui/cocoa/view_id_util_browsertest.mm
+++ b/chrome/browser/ui/cocoa/view_id_util_browsertest.mm
@@ -115,21 +115,17 @@
   // 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(),
-                                     NEW_BACKGROUND_TAB,
-                                     ui::PAGE_TRANSITION_TYPED,
-                                     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(),
-                                   NEW_BACKGROUND_TAB,
-                                   ui::PAGE_TRANSITION_TYPED,
-                                   false));
+  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/cocoa/website_settings/website_settings_bubble_controller.mm b/chrome/browser/ui/cocoa/website_settings/website_settings_bubble_controller.mm
index 79f2c3d..2af827c 100644
--- a/chrome/browser/ui/cocoa/website_settings/website_settings_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/website_settings/website_settings_bubble_controller.mm
@@ -393,7 +393,8 @@
       WebsiteSettings::WEBSITE_SETTINGS_SITE_SETTINGS_OPENED);
   webContents_->OpenURL(content::OpenURLParams(
       GURL(chrome::kChromeUIContentSettingsURL), content::Referrer(),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, false));
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+      false));
 }
 
 // Handler for the site settings button below the list of permissions.
diff --git a/chrome/browser/ui/exclusive_access/fullscreen_controller_test.cc b/chrome/browser/ui/exclusive_access/fullscreen_controller_test.cc
index 362c1ab..c348742b 100644
--- a/chrome/browser/ui/exclusive_access/fullscreen_controller_test.cc
+++ b/chrome/browser/ui/exclusive_access/fullscreen_controller_test.cc
@@ -71,14 +71,14 @@
 void FullscreenControllerTest::GoBack() {
   content::TestNavigationObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents(), 1);
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
 }
 
 void FullscreenControllerTest::Reload() {
   content::TestNavigationObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents(), 1);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
 }
 
diff --git a/chrome/browser/ui/extensions/app_launch_params.cc b/chrome/browser/ui/extensions/app_launch_params.cc
index 46ad142..7306b9d 100644
--- a/chrome/browser/ui/extensions/app_launch_params.cc
+++ b/chrome/browser/ui/extensions/app_launch_params.cc
@@ -71,11 +71,11 @@
 
   extensions::LaunchContainer container;
   WindowOpenDisposition disposition;
-  if (raw_disposition == NEW_FOREGROUND_TAB ||
-      raw_disposition == NEW_BACKGROUND_TAB) {
+  if (raw_disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+      raw_disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) {
     container = extensions::LAUNCH_CONTAINER_TAB;
     disposition = raw_disposition;
-  } else if (raw_disposition == NEW_WINDOW) {
+  } else if (raw_disposition == WindowOpenDisposition::NEW_WINDOW) {
     container = extensions::LAUNCH_CONTAINER_WINDOW;
     disposition = raw_disposition;
   } else {
@@ -83,7 +83,7 @@
     // is set, launch as a regular tab.
     container =
         extensions::GetLaunchContainer(ExtensionPrefs::Get(profile), extension);
-    disposition = NEW_FOREGROUND_TAB;
+    disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   }
   return AppLaunchParams(profile, extension, container, disposition, source);
 }
diff --git a/chrome/browser/ui/extensions/application_launch.cc b/chrome/browser/ui/extensions/application_launch.cc
index 7262dfe1..3331731 100644
--- a/chrome/browser/ui/extensions/application_launch.cc
+++ b/chrome/browser/ui/extensions/application_launch.cc
@@ -231,7 +231,7 @@
     browser = new Browser(Browser::CreateParams(Browser::TYPE_TABBED, profile));
     browser->window()->Show();
     // There's no current tab in this browser window, so add a new one.
-    disposition = NEW_FOREGROUND_TAB;
+    disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   } else {
     // For existing browser, ensure its window is shown and activated.
     browser->window()->Show();
@@ -251,7 +251,7 @@
   params.tabstrip_add_types = add_type;
   params.disposition = disposition;
 
-  if (disposition == CURRENT_TAB) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
     WebContents* existing_tab =
         browser->tab_strip_model()->GetActiveWebContents();
     TabStripModel* model = browser->tab_strip_model();
@@ -385,7 +385,8 @@
                                    const GURL& url) {
   AppLaunchParams launch_params(profile,
                                 NULL,  // this is a URL app.  No extension.
-                                extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW,
+                                extensions::LAUNCH_CONTAINER_WINDOW,
+                                WindowOpenDisposition::NEW_WINDOW,
                                 extensions::SOURCE_COMMAND_LINE);
   launch_params.override_url = url;
 
diff --git a/chrome/browser/ui/extensions/extension_installed_notification.cc b/chrome/browser/ui/extensions/extension_installed_notification.cc
index 87b155d..e424177 100644
--- a/chrome/browser/ui/extensions/extension_installed_notification.cc
+++ b/chrome/browser/ui/extensions/extension_installed_notification.cc
@@ -69,7 +69,7 @@
     return;
 
   AppLaunchParams params = CreateAppLaunchParamsUserContainer(
-      profile_, extension, NEW_FOREGROUND_TAB,
+      profile_, extension, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       extensions::SOURCE_INSTALLED_NOTIFICATION);
   OpenApplication(params);
 }
diff --git a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
index 35dec77a..2283780 100644
--- a/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
+++ b/chrome/browser/ui/extensions/extension_message_bubble_browsertest.cc
@@ -222,8 +222,8 @@
 
   CheckBubbleIsNotPresent(browser(), false, false);
 
-  chrome::ExecuteCommandWithDisposition(browser(),
-                                        IDC_HOME, NEW_FOREGROUND_TAB);
+  chrome::ExecuteCommandWithDisposition(
+      browser(), IDC_HOME, WindowOpenDisposition::NEW_FOREGROUND_TAB);
   base::RunLoop().RunUntilIdle();
 
   CheckBubble(browser(), ANCHOR_BROWSER_ACTION, false);
@@ -249,7 +249,7 @@
   omnibox->OnBeforePossibleChange();
   omnibox->SetUserText(base::ASCIIToUTF16("search for this"));
   omnibox->OnAfterPossibleChange(true);
-  omnibox->model()->AcceptInput(CURRENT_TAB, false);
+  omnibox->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB, false);
   base::RunLoop().RunUntilIdle();
 
   CheckBubble(browser(), ANCHOR_BROWSER_ACTION, false);
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index 07b1874f..48b387a 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -60,7 +60,7 @@
     // Launch it in a window.
     ASSERT_TRUE(OpenApplication(AppLaunchParams(
         browser()->profile(), app, extensions::LAUNCH_CONTAINER_WINDOW,
-        NEW_WINDOW, extensions::SOURCE_TEST)));
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST)));
 
     for (auto* b : *BrowserList::GetInstance()) {
       if (b == browser())
@@ -199,7 +199,7 @@
   // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
   WebContents* bookmark_app_window = OpenApplication(AppLaunchParams(
       browser()->profile(), bookmark_app, extensions::LAUNCH_CONTAINER_WINDOW,
-      NEW_WINDOW, extensions::SOURCE_UNTRACKED));
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_UNTRACKED));
   ASSERT_TRUE(bookmark_app_window);
 
   //  Load a packaged app.
@@ -217,7 +217,7 @@
   // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
   WebContents* packaged_app_window = OpenApplication(AppLaunchParams(
       browser()->profile(), packaged_app, extensions::LAUNCH_CONTAINER_WINDOW,
-      NEW_WINDOW, extensions::SOURCE_UNTRACKED));
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_UNTRACKED));
   ASSERT_TRUE(packaged_app_window);
 
   DevToolsWindow* devtools_window =
diff --git a/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc b/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc
index c6748fe..1224010 100644
--- a/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc
+++ b/chrome/browser/ui/find_bar/find_bar_host_browsertest.cc
@@ -864,7 +864,7 @@
       content::Source<NavigationController>(
           &browser()->tab_strip_model()->GetActiveWebContents()->
               GetController()));
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
   EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
   EXPECT_FALSE(fully_visible);
@@ -1420,7 +1420,7 @@
   // Open another tab.
   GURL url = GetURL(kSimple);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Close it.
@@ -1438,7 +1438,7 @@
   chrome::ToggleBookmarkBar(browser());
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   EnsureFindBoxOpen();
@@ -1446,7 +1446,7 @@
   EXPECT_TRUE(GetFindBarWindowInfo(&position, NULL));
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   chrome::CloseTab(browser());
   EXPECT_TRUE(GetFindBarWindowInfo(&position2, NULL));
diff --git a/chrome/browser/ui/ime/ime_window.cc b/chrome/browser/ui/ime/ime_window.cc
index 0e5a428..534a5ea 100644
--- a/chrome/browser/ui/ime/ime_window.cc
+++ b/chrome/browser/ui/ime/ime_window.cc
@@ -71,7 +71,8 @@
   }
   web_contents_.reset(content::WebContents::Create(create_params));
   web_contents_->SetDelegate(this);
-  content::OpenURLParams params(gurl, content::Referrer(), SINGLETON_TAB,
+  content::OpenURLParams params(gurl, content::Referrer(),
+                                WindowOpenDisposition::SINGLETON_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   web_contents_->OpenURL(params);
 
diff --git a/chrome/browser/ui/login/login_handler_browsertest.cc b/chrome/browser/ui/login/login_handler_browsertest.cc
index 84fe0e9..ea67384 100644
--- a/chrome/browser/ui/login/login_handler_browsertest.cc
+++ b/chrome/browser/ui/login/login_handler_browsertest.cc
@@ -154,9 +154,9 @@
   observer.Register(content::Source<NavigationController>(controller));
 
   WindowedLoadStopObserver load_stop_waiter(controller, 1);
-  browser()->OpenURL(OpenURLParams(
-      test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-      false));
+  browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
+                                   ui::PAGE_TRANSITION_TYPED, false));
 
   load_stop_waiter.Wait();
   EXPECT_TRUE(observer.handlers().empty());
@@ -176,9 +176,9 @@
 
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -226,9 +226,9 @@
 
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -275,9 +275,7 @@
 
   // Open a new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("about:blank"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("about:blank"), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   content::WebContents* contents2 =
@@ -290,7 +288,7 @@
     WindowedAuthNeededObserver auth_needed_waiter(controller1);
     contents1->OpenURL(OpenURLParams(
         embedded_test_server()->GetURL(kAuthBasicPage), Referrer(),
-        CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -298,7 +296,7 @@
     WindowedAuthNeededObserver auth_needed_waiter(controller2);
     contents2->OpenURL(OpenURLParams(
         embedded_test_server()->GetURL(kAuthDigestPage), Referrer(),
-        CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -336,7 +334,8 @@
 
   WindowedLoadStopObserver load_stop_waiter(controller, 1);
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_needed_waiter.Wait();
   WindowedAuthCancelledObserver auth_cancelled_waiter(controller);
@@ -364,12 +363,14 @@
   const int kLoadStopEvents = 2;
   WindowedLoadStopObserver load_stop_waiter(controller, kLoadStopEvents);
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_needed_waiter.Wait();
   WindowedAuthCancelledObserver auth_cancelled_waiter(controller);
   // Navigating while auth is requested is the same as cancelling.
-  browser()->OpenURL(OpenURLParams(kNoAuthURL, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(kNoAuthURL, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_cancelled_waiter.Wait();
   load_stop_waiter.Wait();
@@ -396,7 +397,8 @@
   const int kLoadStopEvents = 2;
   WindowedLoadStopObserver load_stop_waiter(controller, kLoadStopEvents);
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_needed_waiter.Wait();
   WindowedAuthCancelledObserver auth_cancelled_waiter(controller);
@@ -436,7 +438,8 @@
   const int kLoadStopEvents = 2;
   WindowedLoadStopObserver load_stop_waiter(controller, kLoadStopEvents);
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(kAuthURL, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_needed_waiter.Wait();
   WindowedAuthCancelledObserver auth_cancelled_waiter(controller);
@@ -467,9 +470,9 @@
 
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -519,9 +522,9 @@
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
 
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -565,9 +568,9 @@
 
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -637,9 +640,9 @@
   {
     GURL test_page = embedded_test_server()->GetURL(kFaviconTestPage);
     WindowedLoadStopObserver load_stop_waiter(controller, 1);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     load_stop_waiter.Wait();
   }
 
@@ -649,9 +652,9 @@
     GURL test_page = embedded_test_server()->GetURL(kFaviconResource);
     WindowedLoadStopObserver load_stop_waiter(controller, 1);
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
     ASSERT_EQ(1u, observer.handlers().size());
 
@@ -700,9 +703,9 @@
     test_page = test_page.ReplaceComponents(replacements);
 
     WindowedLoadStopObserver load_stop_waiter(controller, 1);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     load_stop_waiter.Wait();
   }
 
@@ -721,9 +724,9 @@
     test_page = test_page.ReplaceComponents(replacements);
 
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
     ASSERT_EQ(1u, observer.handlers().size());
 
@@ -768,9 +771,9 @@
     test_page = test_page.ReplaceComponents(replacements);
 
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
     ASSERT_EQ(1u, observer.handlers().size());
 
@@ -805,9 +808,7 @@
 
   // Open a new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("about:blank"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("about:blank"), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // Get NavigationController for tab 2.
@@ -825,17 +826,11 @@
     WindowedAuthNeededObserver auth_needed_waiter_1(controller_1);
     WindowedAuthNeededObserver auth_needed_waiter_2(controller_2);
     contents_1->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/1"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/1"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     contents_2->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/2"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/2"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter_1.Wait();
     auth_needed_waiter_2.Wait();
 
@@ -868,9 +863,7 @@
 
   // Open a new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL("about:blank"),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL("about:blank"), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // Get NavigationController for tab 2.
@@ -888,17 +881,11 @@
     WindowedAuthNeededObserver auth_needed_waiter_1(controller_1);
     WindowedAuthNeededObserver auth_needed_waiter_2(controller_2);
     contents_1->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/1"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/1"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     contents_2->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/2"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/2"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter_1.Wait();
     auth_needed_waiter_2.Wait();
 
@@ -952,17 +939,11 @@
     WindowedAuthNeededObserver auth_needed_waiter_incognito(
         controller_incognito);
     contents->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/1"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/1"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     contents_incognito->OpenURL(OpenURLParams(
-        embedded_test_server()->GetURL("/auth-basic/2"),
-        content::Referrer(),
-        CURRENT_TAB,
-        ui::PAGE_TRANSITION_TYPED,
-        false));
+        embedded_test_server()->GetURL("/auth-basic/2"), content::Referrer(),
+        WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
     auth_needed_waiter_incognito.Wait();
 
@@ -1013,9 +994,9 @@
   {
     GURL test_page = embedded_test_server()->GetURL(kXHRTestPage);
     WindowedLoadStopObserver load_stop_waiter(controller, 1);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     load_stop_waiter.Wait();
   }
 
@@ -1047,9 +1028,9 @@
   {
     GURL test_page = embedded_test_server()->GetURL(kXHRTestPage);
     WindowedLoadStopObserver load_stop_waiter(controller, 1);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     load_stop_waiter.Wait();
   }
 
@@ -1081,9 +1062,9 @@
   {
     GURL test_page = embedded_test_server()->GetURL(kXHRTestPage);
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -1144,9 +1125,9 @@
   {
     GURL test_page = embedded_test_server()->GetURL(kXHRTestPage);
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     auth_needed_waiter.Wait();
   }
 
@@ -1183,7 +1164,8 @@
 
   // Load a page which will trigger a login prompt.
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(visit_url, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(visit_url, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   ASSERT_EQ(visit_url.host(), contents->GetVisibleURL().host());
   auth_needed_waiter.Wait();
@@ -1325,9 +1307,9 @@
     ASSERT_EQ("127.0.0.1", test_page.host());
 
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(
-        test_page, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
-        false));
+    browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
+                                     ui::PAGE_TRANSITION_TYPED, false));
     ASSERT_EQ("127.0.0.1", contents->GetURL().host());
     content::WaitForInterstitialAttach(contents);
 
@@ -1396,7 +1378,8 @@
   // Navigate to an auth url and wait for the login prompt.
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(auth_url, Referrer(), CURRENT_TAB,
+    browser()->OpenURL(OpenURLParams(auth_url, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
                                      ui::PAGE_TRANSITION_TYPED, false));
     ASSERT_EQ("127.0.0.1", contents->GetURL().host());
     ASSERT_TRUE(contents->GetURL().SchemeIs("http"));
@@ -1421,7 +1404,8 @@
   // schemes don't match (http vs https).
   {
     ASSERT_EQ("127.0.0.1", broken_ssl_page.host());
-    browser()->OpenURL(OpenURLParams(broken_ssl_page, Referrer(), CURRENT_TAB,
+    browser()->OpenURL(OpenURLParams(broken_ssl_page, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
                                      ui::PAGE_TRANSITION_TYPED, false));
     ASSERT_EQ("127.0.0.1", contents->GetURL().host());
     ASSERT_TRUE(contents->GetURL().SchemeIs("https"));
@@ -1440,7 +1424,8 @@
   // last committed URL and the new URL is the same.
   {
     WindowedAuthNeededObserver auth_needed_waiter(controller);
-    browser()->OpenURL(OpenURLParams(auth_url, Referrer(), CURRENT_TAB,
+    browser()->OpenURL(OpenURLParams(auth_url, Referrer(),
+                                     WindowOpenDisposition::CURRENT_TAB,
                                      ui::PAGE_TRANSITION_TYPED, false));
     ASSERT_EQ("127.0.0.1", contents->GetURL().host());
     ASSERT_TRUE(contents->GetURL().SchemeIs("http"));
@@ -1483,7 +1468,8 @@
   GURL broken_ssl_page = https_server.GetURL("/");
   ASSERT_EQ("127.0.0.1", test_page.host());
   WindowedAuthNeededObserver auth_needed_waiter(controller);
-  browser()->OpenURL(OpenURLParams(test_page, Referrer(), CURRENT_TAB,
+  browser()->OpenURL(OpenURLParams(test_page, Referrer(),
+                                   WindowOpenDisposition::CURRENT_TAB,
                                    ui::PAGE_TRANSITION_TYPED, false));
   auth_needed_waiter.Wait();
   ASSERT_EQ(1u, observer.handlers().size());
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
index 9fea9c0..35b02b47 100644
--- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
+++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -692,7 +692,7 @@
   GURL url2("data:text/html,page2");
   chrome::NavigateParams params(browser(), url2, ui::PAGE_TRANSITION_LINK);
   params.source_contents = contents;
-  params.disposition = CURRENT_TAB;
+  params.disposition = WindowOpenDisposition::CURRENT_TAB;
   ui_test_utils::NavigateToURL(&params);
 
   // Switch back to the first tab.  The user text should be cleared, and the
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
index 6a2c3b0..f73ebcde 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -327,7 +327,7 @@
       chrome::FindBrowserWithWebContents(web_contents()),
       GURL(password_manager::kPasswordManagerAccountDashboardURL),
       ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
@@ -335,7 +335,7 @@
   chrome::NavigateParams params(
       chrome::FindBrowserWithWebContents(web_contents()),
       GURL(chrome::kSmartLockHelpPage), ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
index 6622061..52a428e 100644
--- a/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
+++ b/chrome/browser/ui/pdf/pdf_unsupported_feature.cc
@@ -128,9 +128,9 @@
 
 // Launch the url to get the latest Adbobe Reader installer.
 void OpenReaderUpdateURL(WebContents* web_contents) {
-  OpenURLParams params(
-      GURL(kAdobeReaderUpdateUrl), Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false);
+  OpenURLParams params(GURL(kAdobeReaderUpdateUrl), Referrer(),
+                       WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
   web_contents->OpenURL(params);
 }
 
diff --git a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
index fbf196d..2e70e92 100644
--- a/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
+++ b/chrome/browser/ui/search/instant_extended_interactive_uitest.cc
@@ -395,11 +395,10 @@
 
   // Open new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
 
   // Make sure new tab received the onmostvisitedchanged event once.
@@ -428,11 +427,10 @@
   // The "Instant" New Tab should have access to chrome-search: scheme but not
   // chrome: scheme.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   content::RenderViewHost* rvh =
       browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost();
@@ -459,11 +457,10 @@
 
   // Open new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
 
   content::WebContents* active_tab =
@@ -501,11 +498,10 @@
 
   // Open new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
 
   // Make sure new tab received an onthemechanged event.
@@ -534,11 +530,10 @@
 
   // Open a new tab page.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   EXPECT_EQ(2, browser()->tab_strip_model()->count());
 
   SetOmniboxText("flowers");
@@ -568,11 +563,10 @@
 
   // Open new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   content::WebContents* active_tab =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -619,10 +613,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   new_tab_observer.Wait();
 
   OmniboxFieldTrial::kDefaultMinimumTimeBetweenSuggestQueriesMs = 0;
@@ -685,10 +677,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   new_tab_observer.Wait();
 
   OmniboxFieldTrial::kDefaultMinimumTimeBetweenSuggestQueriesMs = 0;
diff --git a/chrome/browser/ui/search/instant_extended_manual_interactive_uitest.cc b/chrome/browser/ui/search/instant_extended_manual_interactive_uitest.cc
index df4ec7f..578cac2 100644
--- a/chrome/browser/ui/search/instant_extended_manual_interactive_uitest.cc
+++ b/chrome/browser/ui/search/instant_extended_manual_interactive_uitest.cc
@@ -100,10 +100,8 @@
       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
       content::NotificationService::AllSources());
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      CURRENT_TAB,
-      ui_test_utils::BROWSER_TEST_NONE);
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
   observer.Wait();
   content::WebContents* active_tab =
       browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ui/search/instant_search_prerenderer.cc b/chrome/browser/ui/search/instant_search_prerenderer.cc
index 9aa3ffd..95d179f73 100644
--- a/chrome/browser/ui/search/instant_search_prerenderer.cc
+++ b/chrome/browser/ui/search/instant_search_prerenderer.cc
@@ -133,7 +133,7 @@
   if (search_terms.empty() || !params->target_contents ||
       !prerender_contents() || !prerender_manager ||
       !QueryMatchesPrefetch(search_terms) ||
-      params->disposition != CURRENT_TAB) {
+      params->disposition != WindowOpenDisposition::CURRENT_TAB) {
     Cancel();
     return false;
   }
diff --git a/chrome/browser/ui/search/instant_search_prerenderer_unittest.cc b/chrome/browser/ui/search/instant_search_prerenderer_unittest.cc
index 134d81f..b3b2424 100644
--- a/chrome/browser/ui/search/instant_search_prerenderer_unittest.cc
+++ b/chrome/browser/ui/search/instant_search_prerenderer_unittest.cc
@@ -355,9 +355,9 @@
   // Open a search results page. A prerendered page exists for |url|. Make sure
   // the browser swaps the current tab contents with the prerendered contents.
   GURL url("https://www.google.com/alt#quux=foo&strk");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(url, Referrer(),
+                                            WindowOpenDisposition::CURRENT_TAB,
+                                            ui::PAGE_TRANSITION_TYPED, false));
   EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
 }
@@ -373,9 +373,9 @@
   // Open a search results page. Prerendered page does not exists for |url|.
   // Make sure the browser navigates the current tab to this |url|.
   GURL url("https://www.google.com/alt#quux=foo&strk");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(url, Referrer(),
+                                            WindowOpenDisposition::CURRENT_TAB,
+                                            ui::PAGE_TRANSITION_TYPED, false));
   EXPECT_NE(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(url, GetActiveWebContents()->GetURL());
 }
@@ -388,9 +388,9 @@
   // prerendered search query("foo"). Make sure the browser swaps the current
   // tab contents with the prerendered contents.
   GURL url("https://www.google.com/alt#quux=pen&strk");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(url, Referrer(),
+                                            WindowOpenDisposition::CURRENT_TAB,
+                                            ui::PAGE_TRANSITION_TYPED, false));
   EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
 }
@@ -402,9 +402,9 @@
   // Open a search results page. Make sure the InstantSearchPrerenderer cancels
   // the active prerender request upon the receipt of empty search query.
   GURL url("https://www.google.com/alt#quux=&strk");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(url, Referrer(),
+                                            WindowOpenDisposition::CURRENT_TAB,
+                                            ui::PAGE_TRANSITION_TYPED, false));
   EXPECT_NE(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(url, GetActiveWebContents()->GetURL());
   EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
@@ -417,9 +417,9 @@
   // Open a search results page. Make sure the InstantSearchPrerenderer cancels
   // the active prerender request for unsupported window dispositions.
   GURL url("https://www.google.com/alt#quux=pen&strk");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), NEW_FOREGROUND_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(
+      url, Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_TYPED, false));
   content::WebContents* new_tab =
       browser()->tab_strip_model()->GetWebContentsAt(1);
   EXPECT_NE(GetPrerenderURL(), new_tab->GetURL());
@@ -482,9 +482,9 @@
   // key. Make sure UsePrerenderedPage() extracts the search terms from the URL
   // and uses the prerendered page contents.
   GURL url("https://www.google.com/alt#quux=foo");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_TYPED,
-                                            false));
+  browser()->OpenURL(content::OpenURLParams(url, Referrer(),
+                                            WindowOpenDisposition::CURRENT_TAB,
+                                            ui::PAGE_TRANSITION_TYPED, false));
   EXPECT_EQ(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
 }
@@ -494,9 +494,9 @@
 
   // Do not use prerendered page for renderer initiated search request.
   GURL url("https://www.google.com/alt#quux=foo");
-  browser()->OpenURL(content::OpenURLParams(url, Referrer(), CURRENT_TAB,
-                                            ui::PAGE_TRANSITION_LINK,
-                                            true  /* is_renderer_initiated */));
+  browser()->OpenURL(content::OpenURLParams(
+      url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+      ui::PAGE_TRANSITION_LINK, true /* is_renderer_initiated */));
   EXPECT_NE(GetPrerenderURL(), GetActiveWebContents()->GetURL());
   EXPECT_EQ(static_cast<PrerenderHandle*>(NULL), prerender_handle());
 }
@@ -509,7 +509,8 @@
   // trials. Search results page URL does not contain search terms replacement
   // key.
   GURL url("https://www.google.com/url?bar=foo&aqs=chrome...0&ie=utf-8&oq=f");
-  browser()->instant_controller()->OpenInstant(CURRENT_TAB, url);
+  browser()->instant_controller()->OpenInstant(
+      WindowOpenDisposition::CURRENT_TAB, url);
   content::MockRenderProcessHost* process =
       static_cast<content::MockRenderProcessHost*>(
           prerender_contents()->GetRenderViewHost()->GetProcess());
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index 4d3c4bf..61fcae05 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -37,11 +37,9 @@
   FocusOmnibox();
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      ntp_url(),
-      NEW_FOREGROUND_TAB,
+      browser(), ntp_url(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   content::WebContents* active_tab =
       browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(search::IsInstantNTP(active_tab));
@@ -76,11 +74,10 @@
 
   // Open a new tab.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUINewTabURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Verify that the NTP is in French.
   content::WebContents* active_tab =
diff --git a/chrome/browser/ui/settings_window_manager.cc b/chrome/browser/ui/settings_window_manager.cc
index 9a8d599..0567638 100644
--- a/chrome/browser/ui/settings_window_manager.cc
+++ b/chrome/browser/ui/settings_window_manager.cc
@@ -60,7 +60,7 @@
 
   // No existing browser window, create one.
   NavigateParams params(profile, gurl, ui::PAGE_TRANSITION_AUTO_BOOKMARK);
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.trusted_source = true;
   params.window_action = NavigateParams::SHOW_WINDOW;
   params.user_gesture = true;
diff --git a/chrome/browser/ui/singleton_tabs.cc b/chrome/browser/ui/singleton_tabs.cc
index 870e8df..042f85ff 100644
--- a/chrome/browser/ui/singleton_tabs.cc
+++ b/chrome/browser/ui/singleton_tabs.cc
@@ -54,7 +54,7 @@
          search::IsInstantNTP(contents) ||
          contents_url == GURL(url::kAboutBlankURL)) &&
         GetIndexOfSingletonTab(&local_params) < 0) {
-      local_params.disposition = CURRENT_TAB;
+      local_params.disposition = WindowOpenDisposition::CURRENT_TAB;
     }
   }
 
@@ -64,7 +64,7 @@
 NavigateParams GetSingletonTabNavigateParams(Browser* browser,
                                              const GURL& url) {
   NavigateParams params(browser, url, ui::PAGE_TRANSITION_AUTO_BOOKMARK);
-  params.disposition = SINGLETON_TAB;
+  params.disposition = WindowOpenDisposition::SINGLETON_TAB;
   params.window_action = NavigateParams::SHOW_WINDOW;
   params.user_gesture = true;
   params.tabstrip_add_types |= TabStripModel::ADD_INHERIT_OPENER;
@@ -74,7 +74,7 @@
 // Returns the index of an existing singleton tab in |params->browser| matching
 // the URL specified in |params|.
 int GetIndexOfSingletonTab(NavigateParams* params) {
-  if (params->disposition != SINGLETON_TAB)
+  if (params->disposition != WindowOpenDisposition::SINGLETON_TAB)
     return -1;
 
   // In case the URL was rewritten by the BrowserURLHandler we need to ensure
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index 54d468b..0e66bf5 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -323,9 +323,9 @@
     // specially here, otherwise it will be handled below.
     if (extension) {
       RecordCmdLineAppHistogram(extensions::Manifest::TYPE_PLATFORM_APP);
-      AppLaunchParams params(profile, extension,
-                             extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                             extensions::SOURCE_COMMAND_LINE);
+      AppLaunchParams params(
+          profile, extension, extensions::LAUNCH_CONTAINER_NONE,
+          WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_COMMAND_LINE);
       params.command_line = command_line_;
       params.current_directory = cur_dir_;
       ::OpenApplicationWithReenablePrompt(params);
@@ -426,7 +426,8 @@
 
   WebContents* app_tab = ::OpenApplication(
       AppLaunchParams(profile, extension, extensions::LAUNCH_CONTAINER_TAB,
-                      NEW_FOREGROUND_TAB, extensions::SOURCE_COMMAND_LINE));
+                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                      extensions::SOURCE_COMMAND_LINE));
   return (app_tab != NULL);
 }
 
@@ -454,7 +455,8 @@
 
     RecordCmdLineAppHistogram(extension->GetType());
 
-    AppLaunchParams params(profile, extension, launch_container, NEW_WINDOW,
+    AppLaunchParams params(profile, extension, launch_container,
+                           WindowOpenDisposition::NEW_WINDOW,
                            extensions::SOURCE_COMMAND_LINE);
     params.command_line = command_line_;
     params.current_directory = cur_dir_;
@@ -755,7 +757,8 @@
 
     chrome::NavigateParams params(browser, tabs[i].url,
                                   ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-    params.disposition = first_tab ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
+    params.disposition = first_tab ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                                   : WindowOpenDisposition::NEW_BACKGROUND_TAB;
     params.tabstrip_add_types = add_types;
 
 #if defined(ENABLE_RLZ)
diff --git a/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc b/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc
index 6c8a66d..71f0cbe5 100644
--- a/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc
+++ b/chrome/browser/ui/sync/one_click_signin_links_delegate_impl.cc
@@ -19,7 +19,8 @@
 void OneClickSigninLinksDelegateImpl::OnLearnMoreLinkClicked(bool is_dialog) {
   chrome::NavigateParams params(browser_, GURL(chrome::kChromeSyncLearnMoreURL),
                                 ui::PAGE_TRANSITION_LINK);
-  params.disposition = is_dialog ? NEW_WINDOW : NEW_FOREGROUND_TAB;
+  params.disposition = is_dialog ? WindowOpenDisposition::NEW_WINDOW
+                                 : WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
index 1041812..e333a75c 100644
--- a/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
+++ b/chrome/browser/ui/sync/one_click_signin_sync_starter.cc
@@ -627,11 +627,9 @@
   }
 
   GURL url = chrome::GetSettingsUrl(sub_page);
-  content::OpenURLParams params(url,
-                                content::Referrer(),
-                                CURRENT_TAB,
-                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                false);
+  content::OpenURLParams params(url, content::Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
+                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
   contents->OpenURL(params);
 
   // Activate the tab.
diff --git a/chrome/browser/ui/tab_contents/core_tab_helper.cc b/chrome/browser/ui/tab_contents/core_tab_helper.cc
index e1e9cd3..8a65be6 100644
--- a/chrome/browser/ui/tab_contents/core_tab_helper.cc
+++ b/chrome/browser/ui/tab_contents/core_tab_helper.cc
@@ -381,7 +381,7 @@
     return;
 
   content::OpenURLParams open_url_params(
-      result, content::Referrer(), NEW_FOREGROUND_TAB,
+      result, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui::PAGE_TRANSITION_LINK, false);
   const std::string& content_type = post_content.first;
   const std::string& post_data = post_content.second;
diff --git a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc
index 7f1d2f45..45bbfa29 100644
--- a/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc
+++ b/chrome/browser/ui/tab_modal_confirm_dialog_browsertest.cc
@@ -120,11 +120,9 @@
 }
 
 IN_PROC_BROWSER_TEST_F(TabModalConfirmDialogTest, Navigate) {
-  content::OpenURLParams params(GURL("about:blank"),
-                                content::Referrer(),
-                                CURRENT_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  content::OpenURLParams params(GURL("about:blank"), content::Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   browser()->tab_strip_model()->GetActiveWebContents()->OpenURL(params);
 
   EXPECT_EQ(0, accepted_count_);
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index a79c9d9..c450c4e7 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -292,8 +292,10 @@
 
   WindowOpenDisposition disposition =
       ui::DispositionFromEventFlags(event_flags);
-  if (disposition == CURRENT_TAB)  // Force to open a new foreground tab.
-    disposition = NEW_FOREGROUND_TAB;
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
+    // Force to open a new foreground tab.
+    disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+  }
 
   sessions::TabRestoreService* service =
       TabRestoreServiceFactory::GetForProfile(browser_->profile());
diff --git a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
index c92e364..49f4932 100644
--- a/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
+++ b/chrome/browser/ui/views/accessibility/invert_bubble_view.cc
@@ -154,7 +154,9 @@
       ui::DispositionFromEventFlags(event_flags);
   content::OpenURLParams params(
       GURL(url), content::Referrer(),
-      disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition,
+      disposition == WindowOpenDisposition::CURRENT_TAB
+          ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+          : disposition,
       ui::PAGE_TRANSITION_LINK, false);
   browser_->OpenURL(params);
 }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index 93d769c..a3d5c34 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -412,7 +412,8 @@
     // ignored.
     return BookmarkMenuButtonBase::IsTriggerableEventType(e) ||
            (e.IsMouseEvent() &&
-            ui::DispositionFromEventFlags(e.flags()) != CURRENT_TAB);
+            ui::DispositionFromEventFlags(e.flags()) !=
+                WindowOpenDisposition::CURRENT_TAB);
   }
 
  private:
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
index 5f4997e..e9eb06d 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
@@ -133,7 +133,8 @@
 // Tests open all on a folder with a couple of bookmarks.
 TEST_F(BookmarkContextMenuTest, OpenAll) {
   const BookmarkNode* folder = model_->bookmark_bar_node()->GetChild(1);
-  chrome::OpenAll(NULL, &navigator_, folder, NEW_FOREGROUND_TAB, NULL);
+  chrome::OpenAll(NULL, &navigator_, folder,
+                  WindowOpenDisposition::NEW_FOREGROUND_TAB, NULL);
 
   // Should have navigated to F1's child but not F11's child.
   ASSERT_EQ(static_cast<size_t>(2), navigator_.urls_.size());
@@ -143,7 +144,8 @@
 // Tests open all on a folder with a couple of bookmarks in incognito window.
 TEST_F(BookmarkContextMenuTest, OpenAllIngonito) {
   const BookmarkNode* folder = model_->bookmark_bar_node()->GetChild(1);
-  chrome::OpenAll(NULL, &navigator_, folder, OFF_THE_RECORD, NULL);
+  chrome::OpenAll(NULL, &navigator_, folder,
+                  WindowOpenDisposition::OFF_THE_RECORD, NULL);
 
   // Should have navigated to only f1a but not f2a.
   ASSERT_EQ(static_cast<size_t>(1), navigator_.urls_.size());
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
index 7d371348..30dd8ce 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.cc
@@ -176,7 +176,8 @@
     int id,
     const ui::Event& event) {
   return (event.flags() & ui::EF_LEFT_MOUSE_BUTTON) &&
-         ui::DispositionFromEventFlags(event.flags()) == NEW_BACKGROUND_TAB;
+         ui::DispositionFromEventFlags(event.flags()) ==
+             WindowOpenDisposition::NEW_BACKGROUND_TAB;
 }
 
 bool BookmarkMenuDelegate::GetDropFormats(
diff --git a/chrome/browser/ui/views/conflicting_module_view_win.cc b/chrome/browser/ui/views/conflicting_module_view_win.cc
index 2afe6b6e..e8b1797 100644
--- a/chrome/browser/ui/views/conflicting_module_view_win.cc
+++ b/chrome/browser/ui/views/conflicting_module_view_win.cc
@@ -115,9 +115,10 @@
 }
 
 bool ConflictingModuleView::Accept() {
-  browser_->OpenURL(content::OpenURLParams(
-      help_center_url_, content::Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false));
+  browser_->OpenURL(
+      content::OpenURLParams(help_center_url_, content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_LINK, false));
   EnumerateModulesModel::GetInstance()->AcknowledgeConflictNotification();
   return true;
 }
diff --git a/chrome/browser/ui/views/download/download_feedback_dialog_view.cc b/chrome/browser/ui/views/download/download_feedback_dialog_view.cc
index 87e155c8..9eed170 100644
--- a/chrome/browser/ui/views/download/download_feedback_dialog_view.cc
+++ b/chrome/browser/ui/views/download/download_feedback_dialog_view.cc
@@ -156,8 +156,9 @@
       ui::DispositionFromEventFlags(event_flags);
   content::OpenURLParams params(
       GURL(l10n_util::GetStringUTF8(IDS_SAFE_BROWSING_PRIVACY_POLICY_URL)),
-      content::Referrer(),
-      disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition,
+      content::Referrer(), disposition == WindowOpenDisposition::CURRENT_TAB
+                               ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                               : disposition,
       ui::PAGE_TRANSITION_LINK, false);
   navigator_->OpenURL(params);
 }
diff --git a/chrome/browser/ui/views/download/download_item_view.cc b/chrome/browser/ui/views/download/download_item_view.cc
index 7bd90e0..45c092bc4 100644
--- a/chrome/browser/ui/views/download/download_item_view.cc
+++ b/chrome/browser/ui/views/download/download_item_view.cc
@@ -987,20 +987,14 @@
     point.SetPoint(drop_down_x_left_, box_y_);
     size.SetSize(drop_down_x_right_ - drop_down_x_left_, box_height_);
   }
-  // Post a task to release the button.  When we call the Run method on the menu
-  // below, it runs an inner message loop that might cause us to be deleted.
-  // Posting a task with a WeakPtr lets us safely handle the button release.
-  base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-      FROM_HERE, base::Bind(&DownloadItemView::ReleaseDropDown,
-                            weak_ptr_factory_.GetWeakPtr()));
   views::View::ConvertPointToScreen(this, &point);
 
   if (!context_menu_.get())
     context_menu_.reset(new DownloadShelfContextMenuView(download()));
 
-  context_menu_->Run(GetWidget()->GetTopLevelWidget(),
-                     gfx::Rect(point, size), source_type);
-  // We could be deleted now.
+  context_menu_->Run(GetWidget()->GetTopLevelWidget(), gfx::Rect(point, size),
+                     source_type, base::Bind(&DownloadItemView::ReleaseDropDown,
+                                             weak_ptr_factory_.GetWeakPtr()));
 }
 
 void DownloadItemView::HandlePressEvent(const ui::LocatedEvent& event,
diff --git a/chrome/browser/ui/views/download/download_item_view_md.cc b/chrome/browser/ui/views/download/download_item_view_md.cc
index 87200361..55c4500bb 100644
--- a/chrome/browser/ui/views/download/download_item_view_md.cc
+++ b/chrome/browser/ui/views/download/download_item_view_md.cc
@@ -827,17 +827,11 @@
   static_cast<views::internal::RootView*>(GetWidget()->GetRootView())
       ->SetMouseHandler(NULL);
 
-  // Post a task to release the button.  When we call the Run method on the menu
-  // below, it runs an inner message loop that might cause us to be deleted.
-  // Posting a task with a WeakPtr lets us safely handle the button release.
-  base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-      FROM_HERE, base::Bind(&DownloadItemViewMd::ReleaseDropdown,
-                            weak_ptr_factory_.GetWeakPtr()));
-
   if (!context_menu_.get())
     context_menu_.reset(new DownloadShelfContextMenuView(download()));
-  context_menu_->Run(GetWidget()->GetTopLevelWidget(), rect, source_type);
-  // We could be deleted now.
+  context_menu_->Run(GetWidget()->GetTopLevelWidget(), rect, source_type,
+                     base::Bind(&DownloadItemViewMd::ReleaseDropdown,
+                                weak_ptr_factory_.GetWeakPtr()));
 }
 
 void DownloadItemViewMd::HandlePressEvent(const ui::LocatedEvent& event,
diff --git a/chrome/browser/ui/views/download/download_shelf_context_menu_view.cc b/chrome/browser/ui/views/download/download_shelf_context_menu_view.cc
index faa4d43..0d5f4559 100644
--- a/chrome/browser/ui/views/download/download_shelf_context_menu_view.cc
+++ b/chrome/browser/ui/views/download/download_shelf_context_menu_view.cc
@@ -20,16 +20,18 @@
 
 DownloadShelfContextMenuView::~DownloadShelfContextMenuView() {}
 
-void DownloadShelfContextMenuView::Run(views::Widget* parent_widget,
-                                       const gfx::Rect& rect,
-                                       ui::MenuSourceType source_type) {
+void DownloadShelfContextMenuView::Run(
+    views::Widget* parent_widget,
+    const gfx::Rect& rect,
+    ui::MenuSourceType source_type,
+    const base::Closure& on_menu_closed_callback) {
   ui::MenuModel* menu_model = GetMenuModel();
   // Run() should not be getting called if the DownloadItem was destroyed.
   DCHECK(menu_model);
 
   menu_model_adapter_.reset(new views::MenuModelAdapter(
       menu_model, base::Bind(&DownloadShelfContextMenuView::OnMenuClosed,
-                             base::Unretained(this))));
+                             base::Unretained(this), on_menu_closed_callback)));
 
   menu_runner_.reset(new views::MenuRunner(menu_model_adapter_->CreateMenu(),
                                            views::MenuRunner::HAS_MNEMONICS |
@@ -46,8 +48,15 @@
   menu_runner_->RunMenuAt(parent_widget, NULL, rect, position, source_type);
 }
 
-void DownloadShelfContextMenuView::OnMenuClosed() {
+void DownloadShelfContextMenuView::OnMenuClosed(
+    const base::Closure& on_menu_closed_callback) {
   close_time_ = base::TimeTicks::Now();
+
+  // This must be ran before clearing |menu_model_adapter_| who owns the
+  // reference.
+  if (!on_menu_closed_callback.is_null())
+    on_menu_closed_callback.Run();
+
   menu_model_adapter_.reset();
   menu_runner_.reset();
 }
diff --git a/chrome/browser/ui/views/download/download_shelf_context_menu_view.h b/chrome/browser/ui/views/download/download_shelf_context_menu_view.h
index 8a4d8ed..b956e6a 100644
--- a/chrome/browser/ui/views/download/download_shelf_context_menu_view.h
+++ b/chrome/browser/ui/views/download/download_shelf_context_menu_view.h
@@ -39,11 +39,12 @@
   // The menu will be positioned above or below but not overlapping |rect|.
   void Run(views::Widget* parent_widget,
            const gfx::Rect& rect,
-           ui::MenuSourceType source_type);
+           ui::MenuSourceType source_type,
+           const base::Closure& on_menu_closed_callback);
 
  private:
   // Callback for MenuModelAdapter
-  void OnMenuClosed();
+  void OnMenuClosed(const base::Closure& on_menu_closed_callback);
 
   std::unique_ptr<views::MenuModelAdapter> menu_model_adapter_;
   std::unique_ptr<views::MenuRunner> menu_runner_;
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index 817119c..5fb8287 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -537,10 +537,9 @@
                                              int event_flags) {
   GURL store_url(extension_urls::GetWebstoreItemDetailURLPrefix() +
                  prompt_->extension()->id());
-  OpenURLParams params(
-      store_url, Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK,
-      false);
+  OpenURLParams params(store_url, Referrer(),
+                       WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
 
   if (navigator_) {
     navigator_->OpenURL(params);
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 3bafc2bf..30fc8c47 100644
--- a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
@@ -498,7 +498,7 @@
   EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarText());
 
   // Reload the page to clear the matching result.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
 
   // Focus the Find bar again to make sure the text is selected.
   browser()->GetFindBarController()->Show();
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 9bdc2b2..e3cbe9f 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1517,7 +1517,7 @@
 
 WindowOpenDisposition BrowserView::GetDispositionForPopupBounds(
     const gfx::Rect& bounds) {
-  return NEW_POPUP;
+  return WindowOpenDisposition::NEW_POPUP;
 }
 
 FindBar* BrowserView::CreateFindBar() {
diff --git a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
index 0c19abe7..699c1a2b 100644
--- a/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
+++ b/chrome/browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc
@@ -241,7 +241,7 @@
 
   OpenApplication(AppLaunchParams(
       browser()->profile(), extension, extensions::LAUNCH_CONTAINER_WINDOW,
-      NEW_FOREGROUND_TAB, extensions::SOURCE_TEST));
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, extensions::SOURCE_TEST));
 
   // Check that the new browser has an app name.
   // The launch should have created a new browser.
diff --git a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
index f38f353..3e3e8a6e 100644
--- a/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
+++ b/chrome/browser/ui/views/frame/global_menu_bar_x11.cc
@@ -850,15 +850,13 @@
       TabRestoreServiceFactory::GetForProfile(profile_);
   if (item->session_id && service) {
     service->RestoreEntryById(browser_->live_tab_context(), item->session_id,
-                              UNKNOWN);
+                              WindowOpenDisposition::UNKNOWN);
   } else {
     DCHECK(item->url.is_valid());
-    browser_->OpenURL(content::OpenURLParams(
-        item->url,
-        content::Referrer(),
-        NEW_FOREGROUND_TAB,
-        ui::PAGE_TRANSITION_AUTO_BOOKMARK,
-        false));
+    browser_->OpenURL(
+        content::OpenURLParams(item->url, content::Referrer(),
+                               WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                               ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
   }
 }
 
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
index f53a1cf2..6a78a69 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
@@ -47,8 +47,9 @@
     // We create |web_contents| since the Bubble UI has an Observer that
     // depends on this, otherwise it wouldn't work.
     GURL url("http://www.google.com");
-    WebContents* web_contents = browser()->OpenURL(OpenURLParams(
-        url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
+    WebContents* web_contents = browser()->OpenURL(
+        OpenURLParams(url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                      ui::PAGE_TRANSITION_TYPED, false));
 
     bubble_ = IntentPickerBubbleView::CreateBubbleView(
         app_info_, base::Bind(&IntentPickerBubbleViewTest::OnBubbleClosed,
diff --git a/chrome/browser/ui/views/keyboard_access_browsertest.cc b/chrome/browser/ui/views/keyboard_access_browsertest.cc
index e97ee81..5f6abc8 100644
--- a/chrome/browser/ui/views/keyboard_access_browsertest.cc
+++ b/chrome/browser/ui/views/keyboard_access_browsertest.cc
@@ -399,7 +399,7 @@
       "</script></html>";
   GURL url("data:text/html," + kBadPage);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
@@ -407,7 +407,7 @@
   ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_EQ(2, browser()->tab_strip_model()->active_index());
 
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 979ddac9..fe83550 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -1092,7 +1092,8 @@
 }
 
 void LocationBarView::AcceptInput() {
-  omnibox_view_->model()->AcceptInput(CURRENT_TAB, false);
+  omnibox_view_->model()->AcceptInput(WindowOpenDisposition::CURRENT_TAB,
+                                      false);
 }
 
 void LocationBarView::FocusSearch() {
diff --git a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
index 217be79c..2659688 100644
--- a/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
+++ b/chrome/browser/ui/views/media_router/media_router_ui_browsertest.cc
@@ -116,7 +116,7 @@
   // Reload the browser and wait.
   content::TestNavigationObserver reload_observer(
       browser()->tab_strip_model()->GetActiveWebContents());
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   reload_observer.Wait();
 
   // The reload should have removed the previously created dialog.
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc
index 744c896..0e6e54e5 100644
--- a/chrome/browser/ui/views/network_profile_bubble_view.cc
+++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -110,9 +110,10 @@
       ui::DispositionFromEventFlags(event_flags);
   content::OpenURLParams params(
       GURL("https://sites.google.com/a/chromium.org/dev/administrators/"
-            "common-problems-and-solutions#network_profile"),
-      content::Referrer(),
-      disposition == CURRENT_TAB ? NEW_FOREGROUND_TAB : disposition,
+           "common-problems-and-solutions#network_profile"),
+      content::Referrer(), disposition == WindowOpenDisposition::CURRENT_TAB
+                               ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                               : disposition,
       ui::PAGE_TRANSITION_LINK, false);
   navigator_->OpenURL(params);
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 59b0f65..4081c79 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -367,8 +367,9 @@
   }
 
   if (event.IsOnlyMiddleMouseButton() || event.IsOnlyLeftMouseButton()) {
-    OpenSelectedLine(event, event.IsOnlyLeftMouseButton() ? CURRENT_TAB :
-                                                            NEW_BACKGROUND_TAB);
+    OpenSelectedLine(event, event.IsOnlyLeftMouseButton()
+                                ? WindowOpenDisposition::CURRENT_TAB
+                                : WindowOpenDisposition::NEW_BACKGROUND_TAB);
   }
 }
 
@@ -400,7 +401,7 @@
       break;
     case ui::ET_GESTURE_TAP:
     case ui::ET_GESTURE_SCROLL_END:
-      OpenSelectedLine(*event, CURRENT_TAB);
+      OpenSelectedLine(*event, WindowOpenDisposition::CURRENT_TAB);
       break;
     default:
       return;
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 30fc8ba..37fcfc8 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -903,7 +903,9 @@
   const bool alt = event.IsAltDown() || event.IsAltGrDown();
   switch (event.key_code()) {
     case ui::VKEY_RETURN:
-      model()->AcceptInput(alt ? NEW_FOREGROUND_TAB : CURRENT_TAB, false);
+      model()->AcceptInput(alt ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                               : WindowOpenDisposition::CURRENT_TAB,
+                           false);
       return true;
     case ui::VKEY_ESCAPE:
       return model()->OnEscapeKeyPressed();
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
index aac7ae19..f525c1dc 100644
--- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
+++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
@@ -125,9 +125,10 @@
                                 kNumIgnoredBuckets);
     content::RecordAction(
         base::UserMetricsAction("OutdatedUpgradeBubble.Reinstall"));
-    navigator_->OpenURL(content::OpenURLParams(
-        GURL(kDownloadChromeUrl), content::Referrer(), NEW_FOREGROUND_TAB,
-        ui::PAGE_TRANSITION_LINK, false));
+    navigator_->OpenURL(
+        content::OpenURLParams(GURL(kDownloadChromeUrl), content::Referrer(),
+                               WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                               ui::PAGE_TRANSITION_LINK, false));
 #if defined(OS_WIN)
   } else {
     DCHECK(UpgradeDetector::GetInstance()->is_outdated_install_no_au());
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index 50f4325e..cd0b63b 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -1101,8 +1101,8 @@
         open_other_profile_indexes_map_.find(sender);
     if (profile_match != open_other_profile_indexes_map_.end()) {
       avatar_menu_->SwitchToProfile(
-          profile_match->second,
-          ui::DispositionFromEventFlags(event.flags()) == NEW_WINDOW,
+          profile_match->second, ui::DispositionFromEventFlags(event.flags()) ==
+                                     WindowOpenDisposition::NEW_WINDOW,
           ProfileMetrics::SWITCH_PROFILE_ICON);
     } else {
       // This was a profile accounts button.
diff --git a/chrome/browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.cc b/chrome/browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.cc
index 7add3fb6e..306c9ecb 100644
--- a/chrome/browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.cc
+++ b/chrome/browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.cc
@@ -138,7 +138,7 @@
   if (!web_contents())
     return;
 
-  web_contents()->OpenURL(
-      content::OpenURLParams(link_url_, content::Referrer(), NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_LINK, false));
+  web_contents()->OpenURL(content::OpenURLParams(
+      link_url_, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false));
 }
diff --git a/chrome/browser/ui/views/sad_tab_view.cc b/chrome/browser/ui/views/sad_tab_view.cc
index 46198a4..0976a8f 100644
--- a/chrome/browser/ui/views/sad_tab_view.cc
+++ b/chrome/browser/ui/views/sad_tab_view.cc
@@ -206,10 +206,11 @@
 
 void SadTabView::LinkClicked(views::Link* source, int event_flags) {
   DCHECK(web_contents_);
-  OpenURLParams params(GURL(total_crashes_ > kCrashesBeforeFeedbackIsDisplayed ?
-                       chrome::kCrashReasonFeedbackDisplayedURL :
-                       chrome::kCrashReasonURL), content::Referrer(),
-                       CURRENT_TAB, ui::PAGE_TRANSITION_LINK, false);
+  OpenURLParams params(GURL(total_crashes_ > kCrashesBeforeFeedbackIsDisplayed
+                                ? chrome::kCrashReasonFeedbackDisplayedURL
+                                : chrome::kCrashReasonURL),
+                       content::Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
   web_contents_->OpenURL(params);
 }
 
diff --git a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
index 2da83f6..d8a54325 100644
--- a/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
+++ b/chrome/browser/ui/views/select_file_dialog_extension_browsertest.cc
@@ -366,7 +366,7 @@
   chrome::NavigateParams p(browser(), GURL("http://www.google.com"),
                            ui::PAGE_TRANSITION_LINK);
   p.window_action = chrome::NavigateParams::SHOW_WINDOW;
-  p.disposition = SINGLETON_TAB;
+  p.disposition = WindowOpenDisposition::SINGLETON_TAB;
   chrome::Navigate(&p);
 
   // Press cancel button.
diff --git a/chrome/browser/ui/views/session_crashed_bubble_view.cc b/chrome/browser/ui/views/session_crashed_bubble_view.cc
index f45bebb9..eb8caab 100644
--- a/chrome/browser/ui/views/session_crashed_bubble_view.cc
+++ b/chrome/browser/ui/views/session_crashed_bubble_view.cc
@@ -360,10 +360,8 @@
                                                       int event_flags) {
   browser_->OpenURL(content::OpenURLParams(
       GURL("https://support.google.com/chrome/answer/96817"),
-      content::Referrer(),
-      NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK,
-      false));
+      content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_LINK, false));
   RecordBubbleHistogramValue(SESSION_CRASHED_BUBBLE_HELP);
 }
 
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
index 62735775..c8308cf 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -235,7 +235,7 @@
       browser_,
       GURL("https://support.google.com/chromebook/answer/1331549"),
       ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_POPUP;
+  params.disposition = WindowOpenDisposition::NEW_POPUP;
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
   chrome::Navigate(&params);
 }
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index f73984c..4253caaa 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -352,10 +352,10 @@
 
   if (drop_before) {
     content::RecordAction(UserMetricsAction("Tab_DropURLBetweenTabs"));
-    params.disposition = NEW_FOREGROUND_TAB;
+    params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   } else {
     content::RecordAction(UserMetricsAction("Tab_DropURLOnTab"));
-    params.disposition = CURRENT_TAB;
+    params.disposition = WindowOpenDisposition::CURRENT_TAB;
     params.source_contents = model_->GetWebContentsAt(index);
   }
   params.window_action = chrome::NavigateParams::SHOW_WINDOW;
diff --git a/chrome/browser/ui/views/task_manager_view_browsertest.cc b/chrome/browser/ui/views/task_manager_view_browsertest.cc
index eb9ddc11..d6f996e 100644
--- a/chrome/browser/ui/views/task_manager_view_browsertest.cc
+++ b/chrome/browser/ui/views/task_manager_view_browsertest.cc
@@ -200,7 +200,8 @@
 
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("b.com", "/title3.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // When the task manager is initially shown, the row for the active tab should
   // be selected.
@@ -235,10 +236,12 @@
       browser(), embedded_test_server()->GetURL("a.com", "/title2.html"));
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("b.com", "/title2.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ui_test_utils::NavigateToURLWithDisposition(
       browser(), embedded_test_server()->GetURL("c.com", "/title2.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   // Wait for their titles to appear in the TaskManager. There should be three
   // rows.
@@ -310,7 +313,7 @@
   // Focus and reload one of the sad tabs. It should reappear in the TM. The
   // other sad tab should not reappear.
   tabs[1]->GetDelegate()->ActivateContents(tabs[1]);
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   ASSERT_NO_FATAL_FAILURE(WaitForTaskManagerRows((rows += 1), pattern));
 
   // tabs[2] should still be selected.
diff --git a/chrome/browser/ui/views/toolbar/reload_button.cc b/chrome/browser/ui/views/toolbar/reload_button.cc
index 3f331c5..6a73e534 100644
--- a/chrome/browser/ui/views/toolbar/reload_button.cc
+++ b/chrome/browser/ui/views/toolbar/reload_button.cc
@@ -139,7 +139,8 @@
 
   if (visible_mode_ == MODE_STOP) {
     if (command_updater_)
-      command_updater_->ExecuteCommandWithDisposition(IDC_STOP, CURRENT_TAB);
+      command_updater_->ExecuteCommandWithDisposition(
+          IDC_STOP, WindowOpenDisposition::CURRENT_TAB);
     // The user has clicked, so we can feel free to update the button,
     // even if the mouse is still hovering.
     ChangeMode(MODE_RELOAD, true);
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view.cc b/chrome/browser/ui/views/translate/translate_bubble_view.cc
index 3b6372d..dfc63dd5 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view.cc
@@ -465,9 +465,9 @@
     }
     case LINK_ID_LANGUAGE_SETTINGS: {
       GURL url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage);
-      web_contents()->OpenURL(
-          content::OpenURLParams(url, content::Referrer(), NEW_FOREGROUND_TAB,
-                                 ui::PAGE_TRANSITION_LINK, false));
+      web_contents()->OpenURL(content::OpenURLParams(
+          url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+          ui::PAGE_TRANSITION_LINK, false));
       translate::ReportUiAction(translate::SETTINGS_LINK_CLICKED);
       break;
     }
diff --git a/chrome/browser/ui/views/web_dialog_view_browsertest.cc b/chrome/browser/ui/views/web_dialog_view_browsertest.cc
index 3c5be53..4d987b0 100644
--- a/chrome/browser/ui/views/web_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_dialog_view_browsertest.cc
@@ -222,7 +222,7 @@
 IN_PROC_BROWSER_TEST_F(WebDialogBrowserTest, CloseParentWindow) {
   // Open a second browser window so we don't trigger shutdown.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(url::kAboutBlankURL), NEW_WINDOW,
+      browser(), GURL(url::kAboutBlankURL), WindowOpenDisposition::NEW_WINDOW,
       ui_test_utils::BROWSER_TEST_NONE);
 
   // TestWebDialogDelegate defaults to window-modal, so closing the browser
diff --git a/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc b/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
index a2fcb64a..a0095c1 100644
--- a/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
+++ b/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
@@ -809,7 +809,8 @@
     // desktop we should link to that here, too.
     web_contents()->OpenURL(content::OpenURLParams(
         GURL(chrome::kChromeUIContentSettingsURL), content::Referrer(),
-        NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK, false));
+        WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+        false));
     presenter_->RecordWebsiteSettingsAction(
         WebsiteSettings::WEBSITE_SETTINGS_SITE_SETTINGS_OPENED);
   } else {
diff --git a/chrome/browser/ui/website_settings/permission_bubble_browser_test_util.cc b/chrome/browser/ui/website_settings/permission_bubble_browser_test_util.cc
index 25b46b7..bfc40de 100644
--- a/chrome/browser/ui/website_settings/permission_bubble_browser_test_util.cc
+++ b/chrome/browser/ui/website_settings/permission_bubble_browser_test_util.cc
@@ -42,9 +42,9 @@
       LoadExtension(test_data_dir_.AppendASCII("app_with_panel_container/"));
   CHECK(extension);
 
-  AppLaunchParams params(browser()->profile(), extension,
-                         extensions::LAUNCH_CONTAINER_PANEL, NEW_WINDOW,
-                         extensions::SOURCE_TEST);
+  AppLaunchParams params(
+      browser()->profile(), extension, extensions::LAUNCH_CONTAINER_PANEL,
+      WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST);
 
   content::WebContents* app_window = OpenApplication(params);
   CHECK(app_window);
diff --git a/chrome/browser/ui/webui/chrome_web_contents_handler.cc b/chrome/browser/ui/webui/chrome_web_contents_handler.cc
index 4bc2b65..7f5fd4d08 100644
--- a/chrome/browser/ui/webui/chrome_web_contents_handler.cc
+++ b/chrome/browser/ui/webui/chrome_web_contents_handler.cc
@@ -43,10 +43,11 @@
     browser = new Browser(Browser::CreateParams(Browser::TYPE_TABBED, profile));
   chrome::NavigateParams nav_params(browser, params.url, params.transition);
   nav_params.referrer = params.referrer;
-  if (source && source->IsCrashed() && params.disposition == CURRENT_TAB &&
+  if (source && source->IsCrashed() &&
+      params.disposition == WindowOpenDisposition::CURRENT_TAB &&
       ui::PageTransitionCoreTypeIs(params.transition,
                                    ui::PAGE_TRANSITION_LINK)) {
-    nav_params.disposition = NEW_FOREGROUND_TAB;
+    nav_params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   } else {
     nav_params.disposition = params.disposition;
   }
diff --git a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
index cd2d58a6..6d2bf4c 100644
--- a/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/keyboard_overlay_ui.cc
@@ -407,11 +407,9 @@
 void KeyboardOverlayHandler::OpenLearnMorePage(const base::ListValue* args) {
   web_ui()->GetWebContents()->GetDelegate()->OpenURLFromTab(
       web_ui()->GetWebContents(),
-      content::OpenURLParams(GURL(kLearnMoreURL),
-                             content::Referrer(),
-                             NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_LINK,
-                             false));
+      content::OpenURLParams(GURL(kLearnMoreURL), content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_LINK, false));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index d4731a1..fc1ec6c 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -103,6 +103,7 @@
 const char kKeyboardUtilsJSPath[] = "keyboard_utils.js";
 const char kCustomElementsHTMLPath[] = "custom_elements.html";
 const char kCustomElementsJSPath[] = "custom_elements.js";
+const char kCustomElementsUserPodHTMLPath[] = "custom_elements_user_pod.html";
 
 // Paths for deferred resource loading.
 const char kCustomElementsPinKeyboardHTMLPath[] =
@@ -138,6 +139,8 @@
                             IDR_CUSTOM_ELEMENTS_PIN_KEYBOARD_HTML);
     source->AddResourcePath(kCustomElementsPinKeyboardJSPath,
                             IDR_CUSTOM_ELEMENTS_PIN_KEYBOARD_JS);
+    source->AddResourcePath(kCustomElementsUserPodHTMLPath,
+                            IDR_CUSTOM_ELEMENTS_USER_POD_HTML);
   } else {
     source->SetDefaultResource(IDR_LOGIN_HTML);
     source->AddResourcePath(kLoginJSPath, IDR_LOGIN_JS);
@@ -145,6 +148,8 @@
                             IDR_CUSTOM_ELEMENTS_LOGIN_HTML);
     source->AddResourcePath(kCustomElementsJSPath,
                             IDR_CUSTOM_ELEMENTS_LOGIN_JS);
+    source->AddResourcePath(kCustomElementsUserPodHTMLPath,
+                            IDR_CUSTOM_ELEMENTS_USER_POD_HTML);
   }
   source->AddResourcePath(kKeyboardUtilsJSPath, IDR_KEYBOARD_UTILS_JS);
   source->OverrideContentSecurityPolicyChildSrc(
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index 3bc320d..8dfead1 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -370,11 +370,9 @@
   WebContents* inspect_ui = web_ui()->GetWebContents();
   WebContents* front_end = inspect_ui->GetDelegate()->OpenURLFromTab(
       inspect_ui,
-      content::OpenURLParams(frontend_url,
-                             content::Referrer(),
-                             NEW_FOREGROUND_TAB,
-                             ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                             false));
+      content::OpenURLParams(frontend_url, content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false));
 
   // Install devtools bindings.
   DevToolsUIBindingsEnabler* bindings_enabler =
diff --git a/chrome/browser/ui/webui/inspect_ui_browsertest.cc b/chrome/browser/ui/webui/inspect_ui_browsertest.cc
index e2ae3c64..e0c14b5 100644
--- a/chrome/browser/ui/webui/inspect_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/inspect_ui_browsertest.cc
@@ -51,9 +51,8 @@
   ui_test_utils::NavigateToURL(browser(), url);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(chrome::kChromeUIInspectURL),
-      NEW_FOREGROUND_TAB,
+      browser(), GURL(chrome::kChromeUIInspectURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   ASSERT_TRUE(WebUIBrowserTest::RunJavascriptAsyncTest(
diff --git a/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
index fa88541..89bb63f 100644
--- a/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
+++ b/chrome/browser/ui/webui/local_discovery/local_discovery_ui_handler.cc
@@ -561,7 +561,8 @@
   // Open the connector enable page in the current tab.
   content::OpenURLParams params(cloud_devices::GetCloudPrintEnableURL(
                                     GetCloudPrintProxyService()->proxy_id()),
-                                content::Referrer(), CURRENT_TAB,
+                                content::Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_LINK, false);
   web_ui()->GetWebContents()->OpenURL(params);
 }
diff --git a/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc b/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
index fb71fa2c..3c61ad8 100644
--- a/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
+++ b/chrome/browser/ui/webui/log_web_ui_url_browsertest.cc
@@ -59,7 +59,7 @@
   uint32_t history_frame_url_hash = base::Hash(history_frame_url.spec());
   EXPECT_THAT(GetSamples(), ElementsAre(Bucket(history_frame_url_hash, 1)));
 
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
 
   EXPECT_THAT(GetSamples(), ElementsAre(Bucket(history_frame_url_hash, 2)));
 }
@@ -93,7 +93,7 @@
 
   {
     content::TitleWatcher title_watcher(tab, history_title);
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     ASSERT_EQ(history_title, title_watcher.WaitAndGetTitle());
   }
 
diff --git a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc
index 620f34e..4a5a14f 100644
--- a/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc
@@ -110,7 +110,7 @@
 
     // Refresh and block until dialog WebContents has been destroyed.
     content::WebContentsDestroyedWatcher dialog_watcher(media_router_dialog_);
-    chrome::Reload(browser(), CURRENT_TAB);
+    chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
     dialog_watcher.Wait();
   }
 
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
index 1c3e48b..bbbbed1 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
@@ -228,9 +228,7 @@
   ASSERT_TRUE(list_value->GetString(0, &url));
   LOG(WARNING) << "url: [" << url << "]";
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(url),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL(url), WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
 }
 
@@ -241,9 +239,7 @@
   GURL loader_url =
       net_internals_test_->CreatePrerenderLoaderUrl(GURL(prerender_url));
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(loader_url),
-      NEW_BACKGROUND_TAB,
+      browser(), GURL(loader_url), WindowOpenDisposition::NEW_BACKGROUND_TAB,
       ui_test_utils::BROWSER_TEST_NONE);
 }
 
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 4301948..e9c278c 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -502,8 +502,9 @@
 
   Profile* profile = extension_service_->profile();
 
-  WindowOpenDisposition disposition = args->GetSize() > 3 ?
-        webui::GetDispositionFromClick(args, 3) : CURRENT_TAB;
+  WindowOpenDisposition disposition =
+      args->GetSize() > 3 ? webui::GetDispositionFromClick(args, 3)
+                          : WindowOpenDisposition::CURRENT_TAB;
   if (extension_id != extensions::kWebStoreAppId) {
     CHECK_NE(launch_bucket, extension_misc::APP_LAUNCH_BUCKET_INVALID);
     extensions::RecordAppLaunchType(launch_bucket, extension->GetType());
@@ -511,11 +512,12 @@
     extensions::RecordWebStoreLaunch();
   }
 
-  if (disposition == NEW_FOREGROUND_TAB || disposition == NEW_BACKGROUND_TAB ||
-      disposition == NEW_WINDOW) {
+  if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_WINDOW) {
     // TODO(jamescook): Proper support for background tabs.
     AppLaunchParams params(profile, extension,
-                           disposition == NEW_WINDOW
+                           disposition == WindowOpenDisposition::NEW_WINDOW
                                ? extensions::LAUNCH_CONTAINER_WINDOW
                                : extensions::LAUNCH_CONTAINER_TAB,
                            disposition, extensions::SOURCE_NEW_TAB_PAGE);
@@ -531,7 +533,9 @@
       old_contents = browser->tab_strip_model()->GetActiveWebContents();
 
     AppLaunchParams params = CreateAppLaunchParamsUserContainer(
-        profile, extension, old_contents ? CURRENT_TAB : NEW_FOREGROUND_TAB,
+        profile, extension,
+        old_contents ? WindowOpenDisposition::CURRENT_TAB
+                     : WindowOpenDisposition::NEW_FOREGROUND_TAB,
         extensions::SOURCE_NEW_TAB_PAGE);
     params.override_url = GURL(url);
     WebContents* new_contents = OpenApplication(params);
diff --git a/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc b/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
index 8ffe5a7..0e019c9 100644
--- a/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/ntp/new_tab_ui_browsertest.cc
@@ -78,18 +78,20 @@
 
   // Navigate to chrome://hang/ to stall the process.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(content::kChromeUIHangURL), CURRENT_TAB, 0);
+      browser(), GURL(content::kChromeUIHangURL),
+      WindowOpenDisposition::CURRENT_TAB, 0);
 
   // Visit a normal URL in another NTP that hasn't committed.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL(chrome::kChromeUINewTabURL), NEW_FOREGROUND_TAB, 0);
+      browser(), GURL(chrome::kChromeUINewTabURL),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, 0);
 
   // We don't use ui_test_utils::NavigateToURLWithDisposition because that waits
   // for current loading to stop.
   content::TestNavigationObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   browser()->OpenURL(OpenURLParams(
-      GURL("data:text/html,hello world"), Referrer(), CURRENT_TAB,
-      ui::PAGE_TRANSITION_TYPED, false));
+      GURL("data:text/html,hello world"), Referrer(),
+      WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
   observer.Wait();
 }
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc
index 506fba8..793d38b 100644
--- a/chrome/browser/ui/webui/options/browser_options_handler.cc
+++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -1712,9 +1712,9 @@
     const base::ListValue* args) {
   content::RecordAction(UserMetricsAction("Options_CloudPrintDevicesPage"));
   // Navigate in current tab to devices page.
-  OpenURLParams params(
-      GURL(chrome::kChromeUIDevicesURL), Referrer(),
-      CURRENT_TAB, ui::PAGE_TRANSITION_LINK, false);
+  OpenURLParams params(GURL(chrome::kChromeUIDevicesURL), Referrer(),
+                       WindowOpenDisposition::CURRENT_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
   web_ui()->GetWebContents()->OpenURL(params);
 }
 
diff --git a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc
index f4a0a63..fe9b813 100644
--- a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc
+++ b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc
@@ -244,11 +244,9 @@
 
   Browser* browser = chrome::FindBrowserWithWebContents(
       web_ui()->GetWebContents());
-  content::OpenURLParams params(ime->options_page_url(),
-      content::Referrer(),
-      SINGLETON_TAB,
-      ui::PAGE_TRANSITION_LINK,
-      false);
+  content::OpenURLParams params(ime->options_page_url(), content::Referrer(),
+                                WindowOpenDisposition::SINGLETON_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   browser->OpenURL(params);
 }
 
diff --git a/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc b/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc
index 71632726..4f1c2a2 100644
--- a/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc
+++ b/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc
@@ -359,7 +359,7 @@
   // Set the secondary user's preference to true, and reload the primary user's
   // browser to see the updated controlled-by indicator.
   prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true);
-  chrome::Reload(browser, CURRENT_TAB);
+  chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(contents);
   {
     SCOPED_TRACE("Screen lock false for primary user");
@@ -440,7 +440,7 @@
   // Set the preference to false for the primary user and check that the
   // indicator disappears.
   prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false);
-  chrome::Reload(browser, CURRENT_TAB);
+  chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(contents);
   {
     SCOPED_TRACE("Screen lock false for both users");
diff --git a/chrome/browser/ui/webui/options/options_ui_browsertest.cc b/chrome/browser/ui/webui/options/options_ui_browsertest.cc
index 7bf85275..255cc61f 100644
--- a/chrome/browser/ui/webui/options/options_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/options/options_ui_browsertest.cc
@@ -114,7 +114,8 @@
 void OptionsUIBrowserTest::NavigateToSettingsSubpage(
     const std::string& sub_page) {
   const GURL& url = chrome::GetSettingsUrl(sub_page);
-  ui_test_utils::NavigateToURLWithDisposition(browser(), url, CURRENT_TAB, 0);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url, WindowOpenDisposition::CURRENT_TAB, 0);
 
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -299,7 +300,7 @@
 
   // Go back to the settings page.
   content::TestNavigationObserver observer(contents);
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   observer.Wait();
 
   // Verify that the settings page lists one profile.
diff --git a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc b/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc
index a5b3c0b..a2d08b5e 100644
--- a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc
@@ -43,7 +43,7 @@
 
 void PasswordManagerInternalsWebUIBrowserTest::SetUpOnMainThread() {
   WebUIBrowserTest::SetUpOnMainThread();
-  OpenInternalsPage(CURRENT_TAB);
+  OpenInternalsPage(WindowOpenDisposition::CURRENT_TAB);
   AddLibrary(base::FilePath(
       FILE_PATH_LITERAL("password_manager_internals_browsertest.js")));
 }
@@ -100,7 +100,7 @@
           GetForBrowserContext(browser()->profile());
   ASSERT_TRUE(service);
   service->ProcessLog("<script> text for testing");
-  OpenInternalsPage(CURRENT_TAB);  // Reload.
+  OpenInternalsPage(WindowOpenDisposition::CURRENT_TAB);  // Reload.
   ASSERT_TRUE(RunJavascriptTest("testLogEmpty"));
 }
 
@@ -119,7 +119,7 @@
   service->ProcessLog("<script> text for testing");
   ASSERT_TRUE(RunJavascriptTest("testLogText"));
   // Now open a second tab with the internals page, but do not log anything.
-  OpenInternalsPage(NEW_FOREGROUND_TAB);
+  OpenInternalsPage(WindowOpenDisposition::NEW_FOREGROUND_TAB);
   // The previously logged text should have made it to the page.
   ASSERT_TRUE(RunJavascriptTest("testLogText"));
 }
@@ -129,7 +129,7 @@
 IN_PROC_BROWSER_TEST_F(PasswordManagerInternalsWebUIBrowserTest,
                        LogSavePasswordProgress_NotFlushedOnReloadIfMultiple) {
   // Open one more tab with the internals page.
-  OpenInternalsPage(NEW_FOREGROUND_TAB);
+  OpenInternalsPage(WindowOpenDisposition::NEW_FOREGROUND_TAB);
   // Now log something.
   password_manager::PasswordManagerInternalsService* service =
       password_manager::PasswordManagerInternalsServiceFactory::
@@ -137,7 +137,7 @@
   ASSERT_TRUE(service);
   service->ProcessLog("<script> text for testing");
   // Reload.
-  OpenInternalsPage(CURRENT_TAB);
+  OpenInternalsPage(WindowOpenDisposition::CURRENT_TAB);
   // The text should still be there.
   ASSERT_TRUE(RunJavascriptTest("testLogText"));
 }
@@ -171,7 +171,7 @@
       password_manager::PasswordManagerInternalsServiceFactory::
           GetForBrowserContext(incognito->profile()->GetOffTheRecordProfile());
   EXPECT_FALSE(service);  // There should be no service for Incognito.
-  OpenInternalsPageWithBrowser(incognito, CURRENT_TAB);
+  OpenInternalsPageWithBrowser(incognito, WindowOpenDisposition::CURRENT_TAB);
   SetWebUIInstance(
       incognito->tab_strip_model()->GetActiveWebContents()->GetWebUI());
   ASSERT_TRUE(RunJavascriptTest("testIncognitoDescription"));
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index fa395cf..81b89e7 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -1138,12 +1138,10 @@
     return;
   if (!user.empty())
     manage_url = net::AppendQueryParameter(manage_url, "user", user);
-  preview_web_contents()->OpenURL(content::OpenURLParams(
-      manage_url,
-      content::Referrer(),
-      NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK,
-      false));
+  preview_web_contents()->OpenURL(
+      content::OpenURLParams(manage_url, content::Referrer(),
+                             WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                             ui::PAGE_TRANSITION_LINK, false));
 }
 
 #if defined(ENABLE_BASIC_PRINTING)
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
index a7006b8..e2bbe87 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui_browsertest.cc
@@ -75,7 +75,7 @@
 
   content::TestNavigationObserver reload_observer(
       browser()->tab_strip_model()->GetActiveWebContents());
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   reload_observer.Wait();
 
   ASSERT_TRUE(chrome::IsCommandEnabled(browser(), IDC_PRINT));
@@ -129,7 +129,7 @@
   Print();
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), GURL("about:blank"), NEW_FOREGROUND_TAB,
+      browser(), GURL("about:blank"), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   browser()->tab_strip_model()->ActivateTabAt(0, true);
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index cb88aed..103659c 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -31,6 +31,7 @@
 #include "ash/common/system/chromeos/devicetype_utils.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/ui/webui/chromeos/ui_account_tweaks.h"
+#include "chrome/common/chrome_switches.h"
 #include "chromeos/chromeos_switches.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
@@ -1083,6 +1084,12 @@
   html_source->AddString("devicesUrl", chrome::kChromeUIDevicesURL);
   html_source->AddString("printingCloudPrintLearnMoreUrl",
                          chrome::kCloudPrintLearnMoreURL);
+
+#if defined(OS_CHROMEOS)
+  html_source->AddBoolean("showCupsPrintingFeatures",
+                          base::CommandLine::ForCurrentProcess()->HasSwitch(
+                              ::switches::kEnableNativeCups));
+#endif
 }
 
 void AddPrivacyStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui_browsertest.cc b/chrome/browser/ui/webui/settings/md_settings_ui_browsertest.cc
index 62f74f1e..8ab348e 100644
--- a/chrome/browser/ui/webui/settings/md_settings_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_ui_browsertest.cc
@@ -42,7 +42,7 @@
 
   NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
 
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   WaitForLoadStop(browser()->tab_strip_model()->GetActiveWebContents());
 }
 
diff --git a/chrome/browser/ui/webui/settings_utils_linux.cc b/chrome/browser/ui/webui/settings_utils_linux.cc
index be8768d..ed075c2 100644
--- a/chrome/browser/ui/webui/settings_utils_linux.cc
+++ b/chrome/browser/ui/webui/settings_utils_linux.cc
@@ -48,9 +48,9 @@
   const char* name = base::nix::GetDesktopEnvironmentName(env.get());
   if (name)
     LOG(ERROR) << "Could not find " << name << " network settings in $PATH";
-  OpenURLParams params(
-      GURL(kLinuxProxyConfigUrl), Referrer(), NEW_FOREGROUND_TAB,
-      ui::PAGE_TRANSITION_LINK, false);
+  OpenURLParams params(GURL(kLinuxProxyConfigUrl), Referrer(),
+                       WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                       ui::PAGE_TRANSITION_LINK, false);
 
   content::WebContents* web_contents =
       tab_util::GetWebContentsByID(render_process_id, render_view_id);
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
index e0a7875..bbd6b50 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -97,11 +97,9 @@
                    signin_metrics::AccessPoint::ACCESS_POINT_APPS_PAGE_LINK
                ? chrome::kChromeUIAppsURL
                : chrome::kChromeUINewTabURL);
-  content::OpenURLParams params(url,
-                                content::Referrer(),
-                                CURRENT_TAB,
-                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-                                false);
+  content::OpenURLParams params(url, content::Referrer(),
+                                WindowOpenDisposition::CURRENT_TAB,
+                                ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
   contents->OpenURL(params);
 }
 
@@ -219,10 +217,8 @@
 void ConfirmEmailDialogDelegate::OnLinkClicked(
     WindowOpenDisposition disposition) {
   content::OpenURLParams params(
-      GURL(chrome::kChromeSyncMergeTroubleshootingURL),
-      content::Referrer(),
-      NEW_POPUP,
-      ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
+      GURL(chrome::kChromeSyncMergeTroubleshootingURL), content::Referrer(),
+      WindowOpenDisposition::NEW_POPUP, ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
       false);
   // It is guaranteed that |web_contents_| is valid here because when it's
   // deleted, the dialog is immediately closed and no further action can be
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc
index 0cd5e10..2cb317b7 100644
--- a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc
@@ -310,8 +310,8 @@
 #define MAYBE_DifferentStorageId DifferentStorageId
 #endif
 IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, MAYBE_DifferentStorageId) {
-  ContentInfo info =
-      NavigateAndGetInfo(browser(), GetSigninPromoURL(), CURRENT_TAB);
+  ContentInfo info = NavigateAndGetInfo(browser(), GetSigninPromoURL(),
+                                        WindowOpenDisposition::CURRENT_TAB);
   WaitUntilUIReady(browser());
 
   // Make sure storage partition of embedded webview is different from
@@ -340,12 +340,12 @@
   // still be given its own process and storage partition.
   content::RenderProcessHost::SetMaxRendererProcessCount(1);
 
-  ContentInfo info1 =
-      NavigateAndGetInfo(browser(), test_url_1, CURRENT_TAB);
-  ContentInfo info2 =
-      NavigateAndGetInfo(browser(), test_url_2, CURRENT_TAB);
-  ContentInfo info3 =
-      NavigateAndGetInfo(browser(), GetSigninPromoURL(), CURRENT_TAB);
+  ContentInfo info1 = NavigateAndGetInfo(browser(), test_url_1,
+                                         WindowOpenDisposition::CURRENT_TAB);
+  ContentInfo info2 = NavigateAndGetInfo(browser(), test_url_2,
+                                         WindowOpenDisposition::CURRENT_TAB);
+  ContentInfo info3 = NavigateAndGetInfo(browser(), GetSigninPromoURL(),
+                                         WindowOpenDisposition::CURRENT_TAB);
 
   ASSERT_EQ(info1.pid, info2.pid);
   ASSERT_NE(info1.pid, info3.pid);
diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
index b2dc9716..ae5ea84 100644
--- a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
+++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
@@ -232,10 +232,8 @@
   // we use NEW_FOREGROUND_TAB rather than the CURRENT_TAB used by default in
   // ui_test_utils::NavigateToURL().
   ui_test_utils::NavigateToURLWithDisposition(
-        browser,
-        signin_url,
-        NEW_FOREGROUND_TAB,
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+      browser, signin_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 
   DVLOG(1) << "Wait for login UI to be ready.";
   WaitUntilUIReady(browser);
diff --git a/chrome/browser/ui/webui/signin/signin_supervised_user_import_handler.cc b/chrome/browser/ui/webui/signin/signin_supervised_user_import_handler.cc
index 7239b55..d87cdb2 100644
--- a/chrome/browser/ui/webui/signin/signin_supervised_user_import_handler.cc
+++ b/chrome/browser/ui/webui/signin/signin_supervised_user_import_handler.cc
@@ -102,11 +102,9 @@
   std::string url;
   bool success = args->GetString(0, &url);
   DCHECK(success);
-  content::OpenURLParams params(GURL(url),
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  content::OpenURLParams params(GURL(url), content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   // ProfileManager::GetLastUsedProfile() will attempt to load the default
   // profile if there is no last used profile. If the default profile is not
   // fully loaded and initialized, it will attempt to do so synchronously.
diff --git a/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc b/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
index 32fd27f0d..e419d3a 100644
--- a/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
+++ b/chrome/browser/ui/webui/web_dialog_web_contents_delegate_unittest.cc
@@ -80,12 +80,9 @@
 
 TEST_F(WebDialogWebContentsDelegateTest, OpenURLFromTabTest) {
   test_web_contents_delegate_->OpenURLFromTab(
-      NULL,
-      OpenURLParams(GURL(url::kAboutBlankURL),
-                    Referrer(),
-                    NEW_FOREGROUND_TAB,
-                    ui::PAGE_TRANSITION_LINK,
-                    false));
+      NULL, OpenURLParams(GURL(url::kAboutBlankURL), Referrer(),
+                          WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                          ui::PAGE_TRANSITION_LINK, false));
   // This should create a new foreground tab in the existing browser.
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
   EXPECT_EQ(1U, chrome::GetTotalBrowserCount());
@@ -95,7 +92,8 @@
   WebContents* contents =
       WebContentsTester::CreateTestWebContents(profile(), NULL);
   test_web_contents_delegate_->AddNewContents(
-      NULL, contents, NEW_FOREGROUND_TAB, gfx::Rect(), false, NULL);
+      NULL, contents, WindowOpenDisposition::NEW_FOREGROUND_TAB, gfx::Rect(),
+      false, NULL);
   // This should create a new foreground tab in the existing browser.
   EXPECT_EQ(1, browser()->tab_strip_model()->count());
   EXPECT_EQ(1U, chrome::GetTotalBrowserCount());
@@ -107,14 +105,12 @@
   EXPECT_EQ(NULL, test_web_contents_delegate_->browser_context());
   // Now, none of the following calls should do anything.
   test_web_contents_delegate_->OpenURLFromTab(
-      NULL,
-      OpenURLParams(GURL(url::kAboutBlankURL),
-                    Referrer(),
-                    NEW_FOREGROUND_TAB,
-                    ui::PAGE_TRANSITION_LINK,
-                    false));
-  test_web_contents_delegate_->AddNewContents(NULL, NULL, NEW_FOREGROUND_TAB,
-                                              gfx::Rect(), false, NULL);
+      NULL, OpenURLParams(GURL(url::kAboutBlankURL), Referrer(),
+                          WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                          ui::PAGE_TRANSITION_LINK, false));
+  test_web_contents_delegate_->AddNewContents(
+      NULL, NULL, WindowOpenDisposition::NEW_FOREGROUND_TAB, gfx::Rect(), false,
+      NULL);
   EXPECT_EQ(0, browser()->tab_strip_model()->count());
   EXPECT_EQ(1U, chrome::GetTotalBrowserCount());
 }
diff --git a/chrome/browser/ui/webui/webui_browsertest.cc b/chrome/browser/ui/webui/webui_browsertest.cc
index df3a881d..662e6ce 100644
--- a/chrome/browser/ui/webui/webui_browsertest.cc
+++ b/chrome/browser/ui/webui/webui_browsertest.cc
@@ -78,14 +78,14 @@
   ASSERT_TRUE(content::ExecuteScript(
       browser()->tab_strip_model()->GetActiveWebContents(),
       "window.history.pushState({}, '', 'foo.html')"));
-  chrome::GoBack(browser(), CURRENT_TAB);
+  chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
 
   // Test handler should still have JavaScript allowed after in-page navigation.
   EXPECT_TRUE(test_handler->IsJavascriptAllowed());
 
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
 
diff --git a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
index 6d5f9938..d0d8ea3 100644
--- a/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
+++ b/chrome/browser/ui/zoom/zoom_controller_browsertest.cc
@@ -180,7 +180,7 @@
   ASSERT_TRUE(tab_strip);
 
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), url, NEW_FOREGROUND_TAB,
+      browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   {
     content::WebContents* web_contents = tab_strip->GetActiveWebContents();
@@ -286,7 +286,7 @@
   // signin page, the HostZoomMap changes, and we need to test that the
   // ZoomController correctly detects this.
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), signin_url, NEW_FOREGROUND_TAB,
+      browser(), signin_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   login_ui_test_utils::WaitUntilUIReady(browser());
   content::WebContents* web_contents =
diff --git a/chrome/browser/unload_browsertest.cc b/chrome/browser/unload_browsertest.cc
index a2d1b00..60b291c 100644
--- a/chrome/browser/unload_browsertest.cc
+++ b/chrome/browser/unload_browsertest.cc
@@ -153,7 +153,8 @@
   // page without waiting for the first load to complete.
   void NavigateToNolistenersFileTwiceAsync() {
     GURL url(net::URLRequestMockHTTPJob::GetMockUrl("title2.html"));
-    ui_test_utils::NavigateToURLWithDisposition(browser(), url, CURRENT_TAB, 0);
+    ui_test_utils::NavigateToURLWithDisposition(
+        browser(), url, WindowOpenDisposition::CURRENT_TAB, 0);
     ui_test_utils::NavigateToURL(browser(), url);
     CheckTitle("Title Of Awesomeness");
   }
@@ -438,7 +439,7 @@
 
   void NavigateToPageInNewTab(const char* name) {
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), GetUrl(name), NEW_FOREGROUND_TAB,
+        browser(), GetUrl(name), WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     CheckTitle(name);
   }
diff --git a/chrome/browser/usb/usb_chooser_controller.cc b/chrome/browser/usb/usb_chooser_controller.cc
index 8833d72..7b2c6d3a 100644
--- a/chrome/browser/usb/usb_chooser_controller.cc
+++ b/chrome/browser/usb/usb_chooser_controller.cc
@@ -139,8 +139,8 @@
 void UsbChooserController::OpenHelpCenterUrl() const {
   GetBrowser()->OpenURL(content::OpenURLParams(
       GURL(chrome::kChooserUsbOverviewURL), content::Referrer(),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-      false /* is_renderer_initialized */));
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initialized */));
 }
 
 void UsbChooserController::OnDeviceAdded(
diff --git a/chrome/browser/usb/web_usb_detector.cc b/chrome/browser/usb/web_usb_detector.cc
index 3687fdb3..a74e65c5 100644
--- a/chrome/browser/usb/web_usb_detector.cc
+++ b/chrome/browser/usb/web_usb_detector.cc
@@ -74,7 +74,7 @@
 
 void OpenURL(const GURL& url) {
   GetBrowser()->OpenURL(content::OpenURLParams(
-      url, content::Referrer(), NEW_FOREGROUND_TAB,
+      url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false /* is_renderer_initialized */));
 }
 
diff --git a/chrome/browser/web_bluetooth_browsertest.cc b/chrome/browser/web_bluetooth_browsertest.cc
index 98feac5..5bbec68 100644
--- a/chrome/browser/web_bluetooth_browsertest.cc
+++ b/chrome/browser/web_bluetooth_browsertest.cc
@@ -78,7 +78,7 @@
   crash_observer.Wait();
 
   // Reload tab.
-  chrome::Reload(browser(), CURRENT_TAB);
+  chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
   content::WaitForLoadStop(
       browser()->tab_strip_model()->GetActiveWebContents());
 
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
deleted file mode 100644
index 22b5efa8..0000000
--- a/chrome/chrome_browser.gypi
+++ /dev/null
@@ -1,3182 +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.
-
-{
-  'variables': {
-    # All .cc, .h, .m, and .mm files under browser except for:
-    # * tests and mocks.
-    # * code below browser/chromeos
-    # * code below browser/extensions
-    # These variables are so the file lists can be shared with the GN build.
-    # There are two sections of sources:
-    # * "Platform"-based sources (OS, toolkit, etc.)
-    # * Feature/directory-based sources (e.g., history, printing)
-
-    ### Platform-based sources ###
-
-    # Android sources included regardless of android_java_ui.
-    'chrome_browser_android_sources': [
-      'browser/gpu/gpu_driver_info_manager_android.cc',
-      'browser/gpu/gpu_driver_info_manager_android.h',
-      'browser/media/protected_media_identifier_permission_context.cc',
-      'browser/media/protected_media_identifier_permission_context.h',
-    ],
-    # Browser sources used when android_java_ui is enabled.
-    'chrome_browser_android_java_ui_sources': [
-      'browser/after_startup_task_utils_android.cc',
-      'browser/after_startup_task_utils_android.h',
-      'browser/android/accessibility/font_size_prefs_android.cc',
-      'browser/android/accessibility/font_size_prefs_android.h',
-      'browser/android/accessibility_util.cc',
-      'browser/android/accessibility_util.h',
-      'browser/android/activity_type_ids.cc',
-      'browser/android/activity_type_ids.h',
-      'browser/android/android_theme_resources.h',
-      'browser/android/appmenu/app_menu_drag_helper.cc',
-      'browser/android/appmenu/app_menu_drag_helper.h',
-      'browser/android/background_sync_launcher_android.cc',
-      'browser/android/background_sync_launcher_android.h',
-      'browser/android/banners/app_banner_infobar_delegate_android.cc',
-      'browser/android/banners/app_banner_infobar_delegate_android.h',
-      'browser/android/banners/app_banner_manager_android.cc',
-      'browser/android/banners/app_banner_manager_android.h',
-      'browser/android/blimp/blimp_client_context_factory_android.cc',
-      'browser/android/blimp/blimp_client_context_factory_android.h',
-      'browser/android/blimp/blimp_client_context_factory.cc',
-      'browser/android/blimp/blimp_client_context_factory.h',
-      'browser/android/blimp/blimp_contents_profile_attachment.cc',
-      'browser/android/blimp/blimp_contents_profile_attachment.h',
-      'browser/android/blimp/chrome_blimp_client_context_delegate_android.cc',
-      'browser/android/blimp/chrome_blimp_client_context_delegate_android.h',
-      'browser/android/blimp/chrome_blimp_client_context_delegate.cc',
-      'browser/android/blimp/chrome_blimp_client_context_delegate.h',
-      'browser/android/bookmarks/bookmark_bridge.cc',
-      'browser/android/bookmarks/bookmark_bridge.h',
-      'browser/android/bookmarks/partner_bookmarks_reader.cc',
-      'browser/android/bookmarks/partner_bookmarks_reader.h',
-      'browser/android/bookmarks/partner_bookmarks_shim.cc',
-      'browser/android/bookmarks/partner_bookmarks_shim.h',
-      'browser/android/bottombar/overlay_panel_content.cc',
-      'browser/android/bottombar/overlay_panel_content.h',
-      'browser/android/browsing_data/browsing_data_counter_bridge.cc',
-      'browser/android/browsing_data/browsing_data_counter_bridge.h',
-      'browser/android/browsing_data/url_filter_bridge.cc',
-      'browser/android/browsing_data/url_filter_bridge.h',
-      'browser/android/chrome_application.cc',
-      'browser/android/chrome_application.h',
-      'browser/android/chrome_feature_list.cc',
-      'browser/android/chrome_feature_list.h',
-      'browser/android/chrome_jni_registrar.cc',
-      'browser/android/chrome_jni_registrar.h',
-      'browser/android/chrome_startup_flags.cc',
-      'browser/android/chrome_startup_flags.h',
-      'browser/android/compositor/compositor_view.cc',
-      'browser/android/compositor/compositor_view.h',
-      'browser/android/compositor/decoration_title.cc',
-      'browser/android/compositor/decoration_title.h',
-      'browser/android/compositor/layer/content_layer.cc',
-      'browser/android/compositor/layer/content_layer.h',
-      'browser/android/compositor/layer/contextual_search_layer.cc',
-      'browser/android/compositor/layer/contextual_search_layer.h',
-      'browser/android/compositor/layer/crushed_sprite_layer.cc',
-      'browser/android/compositor/layer/crushed_sprite_layer.h',
-      'browser/android/compositor/layer/layer.h',
-      'browser/android/compositor/layer/overlay_panel_layer.cc',
-      'browser/android/compositor/layer/overlay_panel_layer.h',
-      'browser/android/compositor/layer/reader_mode_layer.cc',
-      'browser/android/compositor/layer/reader_mode_layer.h',
-      'browser/android/compositor/layer/tab_handle_layer.cc',
-      'browser/android/compositor/layer/tab_handle_layer.h',
-      'browser/android/compositor/layer/tab_layer.cc',
-      'browser/android/compositor/layer/tab_layer.h',
-      'browser/android/compositor/layer/thumbnail_layer.cc',
-      'browser/android/compositor/layer/thumbnail_layer.h',
-      'browser/android/compositor/layer/toolbar_layer.cc',
-      'browser/android/compositor/layer/toolbar_layer.h',
-      'browser/android/compositor/layer_title_cache.cc',
-      'browser/android/compositor/layer_title_cache.h',
-      'browser/android/compositor/scene_layer/contextual_search_scene_layer.cc',
-      'browser/android/compositor/scene_layer/contextual_search_scene_layer.h',
-      'browser/android/compositor/scene_layer/reader_mode_scene_layer.cc',
-      'browser/android/compositor/scene_layer/reader_mode_scene_layer.h',
-      'browser/android/compositor/scene_layer/scene_layer.cc',
-      'browser/android/compositor/scene_layer/scene_layer.h',
-      'browser/android/compositor/scene_layer/static_tab_scene_layer.cc',
-      'browser/android/compositor/scene_layer/static_tab_scene_layer.h',
-      'browser/android/compositor/scene_layer/tab_list_scene_layer.cc',
-      'browser/android/compositor/scene_layer/tab_list_scene_layer.h',
-      'browser/android/compositor/scene_layer/tab_strip_scene_layer.cc',
-      'browser/android/compositor/scene_layer/tab_strip_scene_layer.h',
-      'browser/android/compositor/scene_layer/toolbar_scene_layer.cc',
-      'browser/android/compositor/scene_layer/toolbar_scene_layer.h',
-      'browser/android/compositor/tab_content_manager.cc',
-      'browser/android/compositor/tab_content_manager.h',
-      'browser/android/contextualsearch/contextual_search_context.cc',
-      'browser/android/contextualsearch/contextual_search_context.h',
-      'browser/android/contextualsearch/contextual_search_delegate.cc',
-      'browser/android/contextualsearch/contextual_search_delegate.h',
-      'browser/android/contextualsearch/contextual_search_field_trial.cc',
-      'browser/android/contextualsearch/contextual_search_field_trial.h',
-      'browser/android/contextualsearch/contextual_search_manager.cc',
-      'browser/android/contextualsearch/contextual_search_manager.h',
-      'browser/android/contextualsearch/contextual_search_tab_helper.cc',
-      'browser/android/contextualsearch/contextual_search_tab_helper.h',
-      'browser/android/contextualsearch/resolved_search_term.cc',
-      'browser/android/contextualsearch/resolved_search_term.h',
-      'browser/android/cookies/cookies_fetcher.cc',
-      'browser/android/cookies/cookies_fetcher.h',
-      'browser/android/data_usage/data_use_matcher.cc',
-      'browser/android/data_usage/data_use_matcher.h',
-      'browser/android/data_usage/data_use_tab_helper.cc',
-      'browser/android/data_usage/data_use_tab_helper.h',
-      'browser/android/data_usage/data_use_tab_model.cc',
-      'browser/android/data_usage/data_use_tab_model.h',
-      'browser/android/data_usage/data_use_tab_ui_manager_android.cc',
-      'browser/android/data_usage/data_use_tab_ui_manager_android.h',
-      'browser/android/data_usage/data_use_ui_tab_model.cc',
-      'browser/android/data_usage/data_use_ui_tab_model.h',
-      'browser/android/data_usage/data_use_ui_tab_model_factory.cc',
-      'browser/android/data_usage/data_use_ui_tab_model_factory.h',
-      'browser/android/data_usage/external_data_use_observer.cc',
-      'browser/android/data_usage/external_data_use_observer.h',
-      'browser/android/data_usage/external_data_use_observer_bridge.cc',
-      'browser/android/data_usage/external_data_use_observer_bridge.h',
-      'browser/android/data_usage/external_data_use_reporter.cc',
-      'browser/android/data_usage/external_data_use_reporter.h',
-      'browser/android/data_usage/tab_data_use_entry.cc',
-      'browser/android/data_usage/tab_data_use_entry.h',
-      'browser/android/devtools_manager_delegate_android.cc',
-      'browser/android/devtools_manager_delegate_android.h',
-      'browser/android/dev_tools_server.cc',
-      'browser/android/dev_tools_server.h',
-      'browser/android/document/document_web_contents_delegate.cc',
-      'browser/android/dom_distiller/distiller_ui_handle_android.cc',
-      'browser/android/dom_distiller/distiller_ui_handle_android.h',
-      'browser/android/download/android_download_manager_overwrite_infobar_delegate.cc',
-      'browser/android/download/android_download_manager_overwrite_infobar_delegate.h',
-      'browser/android/download/chrome_download_delegate.cc',
-      'browser/android/download/chrome_download_delegate.h',
-      'browser/android/download/chrome_download_manager_overwrite_infobar_delegate.cc',
-      'browser/android/download/chrome_download_manager_overwrite_infobar_delegate.h',
-      'browser/android/download/download_controller.cc',
-      'browser/android/download/download_controller.h',
-      'browser/android/download/download_controller_base.cc',
-      'browser/android/download/download_controller_base.h',
-      'browser/android/download/download_manager_service.cc',
-      'browser/android/download/download_manager_service.h',
-      'browser/android/download/download_overwrite_infobar_delegate.cc',
-      'browser/android/download/download_overwrite_infobar_delegate.h',
-      'browser/android/download/mock_download_controller.cc',
-      'browser/android/download/mock_download_controller.h',
-      'browser/android/favicon_helper.cc',
-      'browser/android/favicon_helper.h',
-      'browser/android/feature_utilities.cc',
-      'browser/android/feature_utilities.h',
-      'browser/android/feedback/connectivity_checker.cc',
-      'browser/android/feedback/connectivity_checker.h',
-      'browser/android/feedback/screenshot_task.cc',
-      'browser/android/feedback/screenshot_task.h',
-      'browser/android/find_in_page/find_in_page_bridge.cc',
-      'browser/android/find_in_page/find_in_page_bridge.h',
-      'browser/android/foreign_session_helper.cc',
-      'browser/android/foreign_session_helper.h',
-      'browser/android/history_report/data_observer.cc',
-      'browser/android/history_report/data_observer.h',
-      'browser/android/history_report/data_provider.cc',
-      'browser/android/history_report/data_provider.h',
-      'browser/android/history_report/delta_file_backend_leveldb.cc',
-      'browser/android/history_report/delta_file_backend_leveldb.h',
-      'browser/android/history_report/delta_file_commons.cc',
-      'browser/android/history_report/delta_file_commons.h',
-      'browser/android/history_report/delta_file_service.cc',
-      'browser/android/history_report/delta_file_service.h',
-      'browser/android/history_report/get_all_urls_from_history_task.cc',
-      'browser/android/history_report/get_all_urls_from_history_task.h',
-      'browser/android/history_report/historic_visits_migration_task.cc',
-      'browser/android/history_report/historic_visits_migration_task.h',
-      'browser/android/history_report/history_report_jni_bridge.cc',
-      'browser/android/history_report/history_report_jni_bridge.h',
-      'browser/android/history_report/usage_report_util.cc',
-      'browser/android/history_report/usage_report_util.h',
-      'browser/android/history_report/usage_reports_buffer_backend.cc',
-      'browser/android/history_report/usage_reports_buffer_backend.h',
-      'browser/android/history_report/usage_reports_buffer_service.cc',
-      'browser/android/history_report/usage_reports_buffer_service.h',
-      'browser/android/hung_renderer_infobar_delegate.cc',
-      'browser/android/hung_renderer_infobar_delegate.h',
-      'browser/android/instantapps/instant_apps_infobar_delegate.cc',
-      'browser/android/instantapps/instant_apps_infobar_delegate.h',
-      'browser/android/intent_helper.cc',
-      'browser/android/intent_helper.h',
-      'browser/android/intercept_download_resource_throttle.cc',
-      'browser/android/intercept_download_resource_throttle.h',
-      'browser/android/java_exception_reporter.cc',
-      'browser/android/java_exception_reporter.h',
-      'browser/android/large_icon_bridge.cc',
-      'browser/android/large_icon_bridge.h',
-      'browser/android/location_settings.h',
-      'browser/android/location_settings_impl.cc',
-      'browser/android/location_settings_impl.h',
-      'browser/android/logo_bridge.cc',
-      'browser/android/logo_bridge.h',
-      'browser/android/logo_service.cc',
-      'browser/android/logo_service.h',
-      'browser/android/media/media_throttle_infobar_delegate.cc',
-      'browser/android/media/media_throttle_infobar_delegate.h',
-      'browser/android/metrics/launch_metrics.cc',
-      'browser/android/metrics/launch_metrics.h',
-      'browser/android/metrics/uma_session_stats.cc',
-      'browser/android/metrics/uma_session_stats.h',
-      'browser/android/metrics/uma_utils.cc',
-      'browser/android/metrics/uma_utils.h',
-      'browser/android/metrics/variations_session.cc',
-      'browser/android/metrics/variations_session.h',
-      'browser/android/mojo/chrome_interface_registrar_android.cc',
-      'browser/android/mojo/chrome_interface_registrar_android.h',
-      'browser/android/net/external_estimate_provider_android.cc',
-      'browser/android/net/external_estimate_provider_android.h',
-      'browser/android/ntp/most_visited_sites_bridge.cc',
-      'browser/android/ntp/most_visited_sites_bridge.h',
-      'browser/android/ntp/new_tab_page_prefs.cc',
-      'browser/android/ntp/new_tab_page_prefs.h',
-      'browser/android/ntp/new_tab_page_url_handler.cc',
-      'browser/android/ntp/new_tab_page_url_handler.h',
-      'browser/android/ntp/ntp_snippets_bridge.cc',
-      'browser/android/ntp/ntp_snippets_bridge.h',
-      'browser/android/ntp/ntp_snippets_launcher.cc',
-      'browser/android/ntp/ntp_snippets_launcher.h',
-      'browser/android/ntp/popular_sites.cc',
-      'browser/android/ntp/popular_sites.h',
-      'browser/android/omnibox/answers_image_bridge.cc',
-      'browser/android/omnibox/answers_image_bridge.h',
-      'browser/android/omnibox/autocomplete_controller_android.cc',
-      'browser/android/omnibox/autocomplete_controller_android.h',
-      'browser/android/omnibox/omnibox_prerender.cc',
-      'browser/android/omnibox/omnibox_prerender.h',
-      'browser/android/password_ui_view_android.cc',
-      'browser/android/password_ui_view_android.h',
-      'browser/android/policy/policy_auditor.cc',
-      'browser/android/policy/policy_auditor.h',
-      'browser/android/precache/precache_launcher.cc',
-      'browser/android/precache/precache_launcher.h',
-      'browser/android/preferences/autofill/autofill_profile_bridge.cc',
-      'browser/android/preferences/autofill/autofill_profile_bridge.h',
-      'browser/android/preferences/important_sites_util.cc',
-      'browser/android/preferences/important_sites_util.h',
-      'browser/android/preferences/pref_service_bridge.cc',
-      'browser/android/preferences/pref_service_bridge.h',
-      'browser/android/preferences/website_preference_bridge.cc',
-      'browser/android/preferences/website_preference_bridge.h',
-      'browser/android/profiles/profile_downloader_android.cc',
-      'browser/android/profiles/profile_downloader_android.h',
-      'browser/android/provider/blocking_ui_thread_async_request.cc',
-      'browser/android/provider/blocking_ui_thread_async_request.h',
-      'browser/android/provider/bookmark_model_observer_task.cc',
-      'browser/android/provider/bookmark_model_observer_task.h',
-      'browser/android/provider/chrome_browser_provider.cc',
-      'browser/android/provider/chrome_browser_provider.h',
-      'browser/android/provider/run_on_ui_thread_blocking.h',
-      'browser/android/rappor/rappor_service_bridge.cc',
-      'browser/android/rappor/rappor_service_bridge.h',
-      'browser/android/recently_closed_tabs_bridge.cc',
-      'browser/android/recently_closed_tabs_bridge.h',
-      'browser/android/resource_id.h',
-      'browser/android/resource_mapper.cc',
-      'browser/android/resource_mapper.h',
-      'browser/android/rlz/revenue_stats.cc',
-      'browser/android/rlz/revenue_stats.h',
-      'browser/android/safe_browsing/safe_browsing_api_handler_bridge.cc',
-      'browser/android/safe_browsing/safe_browsing_api_handler_bridge.h',
-      'browser/android/seccomp_support_detector.cc',
-      'browser/android/seccomp_support_detector.h',
-      'browser/android/service_tab_launcher.cc',
-      'browser/android/service_tab_launcher.h',
-      'browser/android/sessions/session_tab_helper_android.cc',
-      'browser/android/sessions/session_tab_helper_android.h',
-      'browser/android/shortcut_helper.cc',
-      'browser/android/shortcut_helper.h',
-      'browser/android/shortcut_info.cc',
-      'browser/android/shortcut_info.h',
-      'browser/android/signin/account_management_screen_helper.cc',
-      'browser/android/signin/account_management_screen_helper.h',
-      'browser/android/signin/account_tracker_service_android.cc',
-      'browser/android/signin/account_tracker_service_android.h',
-      'browser/android/signin/signin_investigator_android.cc',
-      'browser/android/signin/signin_investigator_android.h',
-      'browser/android/signin/signin_manager_android.cc',
-      'browser/android/signin/signin_manager_android.h',
-      'browser/android/signin/signin_promo_util_android.cc',
-      'browser/android/signin/signin_promo_util_android.h',
-      'browser/android/tab_android.cc',
-      'browser/android/tab_android.h',
-      'browser/android/tab_state.cc',
-      'browser/android/tab_state.h',
-      'browser/android/tab_web_contents_delegate_android.cc',
-      'browser/android/tab_web_contents_delegate_android.h',
-      'browser/android/thumbnail/thumbnail.cc',
-      'browser/android/thumbnail/thumbnail.h',
-      'browser/android/thumbnail/thumbnail_cache.cc',
-      'browser/android/thumbnail/thumbnail_cache.h',
-      'browser/android/url_utilities.cc',
-      'browser/android/url_utilities.h',
-      'browser/android/usb/web_usb_chooser_service_android.cc',
-      'browser/android/usb/web_usb_chooser_service_android.h',
-      'browser/android/voice_search_tab_helper.cc',
-      'browser/android/voice_search_tab_helper.h',
-      'browser/android/warmup_manager.cc',
-      'browser/android/warmup_manager.h',
-      'browser/android/web_contents_factory.cc',
-      'browser/android/web_contents_factory.h',
-      'browser/android/webapk/manifest_upgrade_detector_fetcher.cc',
-      'browser/android/webapk/manifest_upgrade_detector_fetcher.h',
-      'browser/android/webapk/webapk_update_manager.cc',
-      'browser/android/webapk/webapk_update_manager.h',
-      'browser/android/webapps/add_to_homescreen_data_fetcher.cc',
-      'browser/android/webapps/add_to_homescreen_data_fetcher.h',
-      'browser/android/webapps/add_to_homescreen_dialog_helper.cc',
-      'browser/android/webapps/add_to_homescreen_dialog_helper.h',
-      'browser/android/webapps/single_tab_mode_tab_helper.cc',
-      'browser/android/webapps/single_tab_mode_tab_helper.h',
-      'browser/android/webapps/webapp_registry.cc',
-      'browser/android/webapps/webapp_registry.h',
-      'browser/android/webapk/chrome_webapk_host.cc',
-      'browser/android/webapk/chrome_webapk_host.h',
-      'browser/android/webapk/webapk_icon_hasher.cc',
-      'browser/android/webapk/webapk_icon_hasher.h',
-      'browser/android/webapk/webapk_installer.cc',
-      'browser/android/webapk/webapk_installer.h',
-      'browser/android/webapk/webapk_web_manifest_checker.cc',
-      'browser/android/webapk/webapk_web_manifest_checker.h',
-      'browser/autofill/android/personal_data_manager_android.cc',
-      'browser/autofill/android/personal_data_manager_android.h',
-      'browser/dom_distiller/dom_distiller_service_factory_android.cc',
-      'browser/dom_distiller/dom_distiller_service_factory_android.h',
-      'browser/dom_distiller/tab_utils_android.cc',
-      'browser/dom_distiller/tab_utils_android.h',
-      'browser/download/download_request_infobar_delegate_android.cc',
-      'browser/download/download_request_infobar_delegate_android.h',
-      'browser/geolocation/geolocation_infobar_delegate_android.cc',
-      'browser/geolocation/geolocation_infobar_delegate_android.h',
-      'browser/invalidation/invalidation_service_factory_android.cc',
-      'browser/invalidation/invalidation_service_factory_android.h',
-      'browser/lifetime/application_lifetime_android.cc',
-      'browser/lifetime/application_lifetime_android.h',
-      'browser/media/android/cdm/media_drm_credential_manager.cc',
-      'browser/media/android/cdm/media_drm_credential_manager.h',
-      'browser/media/android/remote/record_cast_action.cc',
-      'browser/media/android/remote/record_cast_action.h',
-      'browser/media/android/remote/remote_media_player_bridge.cc',
-      'browser/media/android/remote/remote_media_player_bridge.h',
-      'browser/media/android/remote/remote_media_player_manager.cc',
-      'browser/media/android/remote/remote_media_player_manager.h',
-      'browser/media/android/router/media_router_android.cc',
-      'browser/media/android/router/media_router_android.h',
-      'browser/media/android/router/media_router_dialog_controller_android.cc',
-      'browser/media/android/router/media_router_dialog_controller_android.h',
-      'browser/media/media_stream_infobar_delegate_android.cc',
-      'browser/media/media_stream_infobar_delegate_android.h',
-      'browser/media/midi_permission_infobar_delegate_android.cc',
-      'browser/media/midi_permission_infobar_delegate_android.h',
-      'browser/media/protected_media_identifier_infobar_delegate_android.cc',
-      'browser/media/protected_media_identifier_infobar_delegate_android.h',
-      'browser/metrics/android_metrics_provider.cc',
-      'browser/metrics/android_metrics_provider.h',
-      'browser/metrics/page_load_metrics_provider.cc',
-      'browser/metrics/page_load_metrics_provider.h',
-      'browser/net/spdyproxy/data_reduction_promo_infobar_delegate_android.cc',
-      'browser/net/spdyproxy/data_reduction_promo_infobar_delegate_android.h',
-      'browser/net/spdyproxy/data_reduction_proxy_settings_android.cc',
-      'browser/net/spdyproxy/data_reduction_proxy_settings_android.h',
-      'browser/page_load_metrics/observers/android_page_load_metrics_observer.cc',
-      'browser/page_load_metrics/observers/android_page_load_metrics_observer.h',
-      'browser/password_manager/account_chooser_dialog_android.cc',
-      'browser/password_manager/account_chooser_dialog_android.h',
-      'browser/password_manager/auto_signin_first_run_dialog_android.cc',
-      'browser/password_manager/auto_signin_first_run_dialog_android.h',
-      'browser/password_manager/credential_android.cc',
-      'browser/password_manager/credential_android.h',
-      'browser/password_manager/generated_password_saved_infobar_delegate_android.cc',
-      'browser/password_manager/generated_password_saved_infobar_delegate_android.h',
-      'browser/password_manager/password_manager_infobar_delegate_android.cc',
-      'browser/password_manager/password_manager_infobar_delegate_android.h',
-      'browser/password_manager/save_password_infobar_delegate_android.cc',
-      'browser/password_manager/save_password_infobar_delegate_android.h',
-      'browser/password_manager/update_password_infobar_delegate_android.cc',
-      'browser/password_manager/update_password_infobar_delegate_android.h',
-      'browser/permissions/permission_queue_controller.cc',
-      'browser/permissions/permission_queue_controller.h',
-      'browser/platform_util_android.cc',
-      'browser/precache/precache_manager_factory.cc',
-      'browser/precache/precache_manager_factory.h',
-      'browser/precache/precache_util.cc',
-      'browser/precache/precache_util.h',
-      'browser/prerender/external_prerender_handler_android.cc',
-      'browser/prerender/external_prerender_handler_android.h',
-      'browser/profiles/profile_android.cc',
-      'browser/profiles/profile_android.h',
-      'browser/search/contextual_search_policy_handler_android.cc',
-      'browser/search/contextual_search_policy_handler_android.h',
-      'browser/signin/oauth2_token_service_delegate_android.cc',
-      'browser/signin/oauth2_token_service_delegate_android.h',
-      'browser/ssl/ssl_add_certificate_android.cc',
-    ],
-    # Cross-platform Ash sources.
-    'chrome_browser_ash_sources': [
-      'browser/media/desktop_media_list_ash.cc',
-      'browser/media/desktop_media_list_ash.h',
-      'browser/renderer_context_menu/open_with_menu_factory_ash.cc',
-      'browser/renderer_context_menu/open_with_menu_factory_ash.h',
-      'browser/signin/signin_error_notifier_ash.cc',
-      'browser/signin/signin_error_notifier_ash.h',
-      'browser/signin/signin_error_notifier_factory_ash.cc',
-      'browser/signin/signin_error_notifier_factory_ash.h',
-      'browser/sync/sync_error_notifier_ash.cc',
-      'browser/sync/sync_error_notifier_ash.h',
-      'browser/sync/sync_error_notifier_factory_ash.cc',
-      'browser/sync/sync_error_notifier_factory_ash.h',
-    ],
-    # Cross-platform Aura files.
-    'chrome_browser_aura_sources': [
-      # This file is called _views but has aura calls in it.
-      'browser/download/drag_download_item_views.cc',
-      'browser/lifetime/application_lifetime_aura.cc',
-      'browser/platform_util_aura.cc',
-    ],
-    # ChromeOS-sources not ending in _chromeos (which would be included in
-    # other sections and filtered out for non-ChromeOS platforms.
-    'chrome_browser_chromeos_sources': [
-      'browser/download/notification/download_item_notification.cc',
-      'browser/download/notification/download_item_notification.h',
-      'browser/download/notification/download_notification.cc',
-      'browser/download/notification/download_notification.h',
-      'browser/download/notification/download_notification_manager.cc',
-      'browser/download/notification/download_notification_manager.h',
-      'browser/media/protected_media_identifier_permission_context.cc',
-      'browser/media/protected_media_identifier_permission_context.h',
-      'browser/media/window_icon_util_chromeos.cc',
-      'browser/metrics/chromeos_metrics_provider.cc',
-      'browser/metrics/chromeos_metrics_provider.h',
-      'browser/metrics/perf/cpu_identity.cc',
-      'browser/metrics/perf/cpu_identity.h',
-      'browser/metrics/perf/perf_output.cc',
-      'browser/metrics/perf/perf_output.h',
-      'browser/metrics/perf/random_selector.cc',
-      'browser/metrics/perf/random_selector.h',
-      'browser/metrics/perf/windowed_incognito_observer.cc',
-      'browser/metrics/perf/windowed_incognito_observer.h',
-      'browser/policy/default_geolocation_policy_handler.cc',
-      'browser/policy/default_geolocation_policy_handler.h',
-      # This is technically also dependent on enable_plugins but we don't
-      # support ChromeOS with enable_plugins==0.
-      'browser/renderer_host/pepper/pepper_platform_verification_message_filter.cc',
-      'browser/renderer_host/pepper/pepper_platform_verification_message_filter.h',
-    ],
-    # Everything but Android, iOS, and CrOS.
-    'chrome_browser_desktop_sources': [
-      'browser/metrics/desktop_engagement/audible_contents_tracker.cc',
-      'browser/metrics/desktop_engagement/audible_contents_tracker.h',
-      'browser/metrics/desktop_engagement/chrome_visibility_observer.cc',
-      'browser/metrics/desktop_engagement/chrome_visibility_observer.h',
-      'browser/metrics/desktop_engagement/desktop_engagement_observer.cc',
-      'browser/metrics/desktop_engagement/desktop_engagement_observer.h',
-      'browser/metrics/desktop_engagement/desktop_engagement_service.cc',
-      'browser/metrics/desktop_engagement/desktop_engagement_service.h',
-      'browser/platform_util.cc',
-      'browser/policy/cloud/user_policy_signin_service.cc',
-      'browser/policy/cloud/user_policy_signin_service.h',
-      'browser/profiles/avatar_menu_actions_desktop.cc',
-      'browser/profiles/avatar_menu_actions_desktop.h',
-      'browser/profiles/avatar_menu_desktop.cc',
-      'browser/profiles/avatar_menu_observer.h',
-      'browser/profiles/profile_list_desktop.cc',
-      'browser/profiles/profile_list_desktop.h',
-      'browser/profiles/profile_statistics.cc',
-      'browser/profiles/profile_statistics.h',
-      'browser/profiles/profile_statistics_aggregator.cc',
-      'browser/profiles/profile_statistics_aggregator.h',
-      'browser/profiles/profile_statistics_common.cc',
-      'browser/profiles/profile_statistics_common.h',
-      'browser/profiles/profile_statistics_factory.cc',
-      'browser/profiles/profile_statistics_factory.h',
-      'browser/signin/cross_device_promo.cc',
-      'browser/signin/cross_device_promo.h',
-      'browser/signin/cross_device_promo_factory.cc',
-      'browser/signin/cross_device_promo_factory.h',
-      'browser/signin/signin_global_error.cc',
-      'browser/signin/signin_global_error.h',
-      'browser/signin/signin_global_error_factory.cc',
-      'browser/signin/signin_global_error_factory.h',
-      'browser/sync/sync_global_error.cc',
-      'browser/sync/sync_global_error.h',
-      'browser/sync/sync_global_error_factory.cc',
-      'browser/sync/sync_global_error_factory.h',
-      'browser/upgrade_detector_impl.cc',
-      'browser/upgrade_detector_impl.h',
-    ],
-    # Miscellaneous files that were brought up on iOS before the decision not
-    # to use chrome/ for iOS. These, plus a few of the directory-specific
-    # source lists below, are all that are built on iOS. These are built
-    # despite the change in direction in order to prevent iOS regressions while
-    # componentization is in progress.
-    # TODO(stuartmorgan): Remove this once enough has been componentized that
-    # there's no value in building any of chrome/ for iOS.
-    'chrome_browser_ios_sources': [
-      'browser/browser_process.cc',
-      'browser/browser_process.h',
-      'browser/browser_process_platform_part_base.cc',
-      'browser/browser_process_platform_part_base.h',
-    ],
-    # Desktop Linux, ChromeOS, and Windows.
-    'chrome_browser_non_mac_desktop_sources': [
-      'browser/renderer_context_menu/spelling_options_submenu_observer.cc',
-      'browser/renderer_context_menu/spelling_options_submenu_observer.h',
-    ],
-    # Desktop linux, doesn't count ChromeOS.
-    'chrome_browser_linux_desktop_sources': [
-      'browser/first_run/upgrade_util.cc',
-      'browser/first_run/upgrade_util_linux.cc',
-      'browser/first_run/upgrade_util_linux.h',
-      'browser/fullscreen_aurax11.cc',
-      'browser/icon_loader_auralinux.cc',
-      'browser/media/window_icon_util_x11.cc',
-      'browser/password_manager/native_backend_kwallet_x.cc',
-      'browser/password_manager/native_backend_kwallet_x.h',
-      'browser/platform_util_linux.cc',
-      'browser/shell_integration_linux.cc',
-      'browser/shell_integration_linux.h',
-      'browser/speech/tts_linux.cc',
-      'browser/themes/theme_service_aurax11.cc',
-      'browser/themes/theme_service_aurax11.h',
-      'browser/web_applications/web_app_linux.cc',
-    ],
-    'chrome_browser_mac_sources': [
-      'browser/media/window_icon_util_mac.mm',
-      'browser/password_manager/password_manager_util_mac.h',
-      'browser/password_manager/password_manager_util_mac.mm',
-    ],
-    # Android and iOS, not CrOS.
-    'chrome_browser_mobile_sources': [
-      'browser/chrome_browser_field_trials_mobile.cc',
-      'browser/chrome_browser_field_trials_mobile.h',
-      'browser/policy/cloud/user_policy_signin_service_mobile.cc',
-      'browser/policy/cloud/user_policy_signin_service_mobile.h',
-    ],
-    # Everything but Android and iOS.
-    'chrome_browser_non_mobile_sources': [
-      'browser/accessibility/invert_bubble_prefs.cc',
-      'browser/accessibility/invert_bubble_prefs.h',
-      'browser/background/background_contents.cc',
-      'browser/background/background_contents.h',
-      'browser/banners/app_banner_infobar_delegate_desktop.cc',
-      'browser/banners/app_banner_infobar_delegate_desktop.h',
-      'browser/banners/app_banner_manager_desktop.cc',
-      'browser/banners/app_banner_manager_desktop.h',
-      'browser/bookmarks/bookmark_html_writer.cc',
-      'browser/bookmarks/bookmark_html_writer.h',
-      'browser/certificate_viewer.cc',
-      'browser/certificate_viewer.h',
-      'browser/chooser_controller/chooser_controller.cc',
-      'browser/chooser_controller/chooser_controller.h',
-      'browser/chrome_browser_field_trials_desktop.cc',
-      'browser/chrome_browser_field_trials_desktop.h',
-      'browser/chrome_browser_main_posix.cc',
-      'browser/chrome_browser_main_posix.h',
-      'browser/chrome_process_singleton.cc',
-      'browser/chrome_process_singleton.h',
-      'browser/component_updater/widevine_cdm_component_installer.cc',
-      'browser/component_updater/widevine_cdm_component_installer.h',
-      'browser/custom_handlers/register_protocol_handler_permission_request.cc',
-      'browser/custom_handlers/register_protocol_handler_permission_request.h',
-      'browser/custom_home_pages_table_model.cc',
-      'browser/custom_home_pages_table_model.h',
-      'browser/diagnostics/diagnostics_controller.cc',
-      'browser/diagnostics/diagnostics_controller.h',
-      'browser/diagnostics/diagnostics_metrics.cc',
-      'browser/diagnostics/diagnostics_metrics.h',
-      'browser/diagnostics/diagnostics_model.cc',
-      'browser/diagnostics/diagnostics_model.h',
-      'browser/diagnostics/diagnostics_test.cc',
-      'browser/diagnostics/diagnostics_test.h',
-      'browser/diagnostics/diagnostics_writer.cc',
-      'browser/diagnostics/diagnostics_writer.h',
-      'browser/diagnostics/recon_diagnostics.cc',
-      'browser/diagnostics/recon_diagnostics.h',
-      'browser/diagnostics/sqlite_diagnostics.cc',
-      'browser/diagnostics/sqlite_diagnostics.h',
-      'browser/download/download_commands.cc',
-      'browser/download/download_commands.h',
-      'browser/download/download_crx_util.cc',
-      'browser/download/download_crx_util.h',
-      'browser/download/download_danger_prompt.cc',
-      'browser/download/download_danger_prompt.h',
-      'browser/download/download_dir_policy_handler.cc',
-      'browser/download/download_dir_policy_handler.h',
-      'browser/download/download_permission_request.cc',
-      'browser/download/download_permission_request.h',
-      'browser/download/download_shelf.cc',
-      'browser/download/download_shelf.h',
-      'browser/download/download_shelf_context_menu.cc',
-      'browser/download/download_shelf_context_menu.h',
-      'browser/feedback/feedback_profile_observer.cc',
-      'browser/feedback/feedback_profile_observer.h',
-      'browser/feedback/show_feedback_page.cc',
-      'browser/feedback/system_logs/about_system_logs_fetcher.cc',
-      'browser/feedback/system_logs/about_system_logs_fetcher.h',
-      'browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc',
-      'browser/feedback/system_logs/log_sources/chrome_internal_log_source.h',
-      'browser/feedback/system_logs/log_sources/memory_details_log_source.cc',
-      'browser/feedback/system_logs/log_sources/memory_details_log_source.h',
-      'browser/feedback/system_logs/scrubbed_system_logs_fetcher.cc',
-      'browser/feedback/system_logs/scrubbed_system_logs_fetcher.h',
-      'browser/feedback/system_logs/system_logs_fetcher_base.cc',
-      'browser/feedback/system_logs/system_logs_fetcher_base.h',
-      'browser/first_run/first_run.cc',
-      'browser/first_run/first_run.h',
-      'browser/first_run/first_run_dialog.h',
-      'browser/first_run/first_run_internal.h',
-      'browser/first_run/first_run_internal_linux.cc',
-      'browser/first_run/first_run_internal_mac.mm',
-      'browser/first_run/first_run_internal_posix.cc',
-      'browser/first_run/first_run_internal_win.cc',
-      'browser/first_run/upgrade_util.h',
-      'browser/first_run/upgrade_util_mac.cc',
-      'browser/first_run/upgrade_util_win.cc',
-      'browser/first_run/upgrade_util_win.h',
-      'browser/font_family_cache.cc',
-      'browser/font_family_cache.h',
-      'browser/gpu/gl_string_manager.cc',
-      'browser/gpu/gl_string_manager.h',
-      'browser/importer/external_process_importer_client.cc',
-      'browser/importer/external_process_importer_client.h',
-      'browser/importer/external_process_importer_host.cc',
-      'browser/importer/external_process_importer_host.h',
-      'browser/importer/firefox_profile_lock.cc',
-      'browser/importer/firefox_profile_lock.h',
-      'browser/importer/firefox_profile_lock_posix.cc',
-      'browser/importer/firefox_profile_lock_win.cc',
-      'browser/importer/importer_list.cc',
-      'browser/importer/importer_list.h',
-      'browser/importer/importer_lock_dialog.h',
-      'browser/importer/importer_progress_observer.h',
-      'browser/importer/importer_uma.cc',
-      'browser/importer/importer_uma.h',
-      'browser/importer/in_process_importer_bridge.cc',
-      'browser/importer/in_process_importer_bridge.h',
-      'browser/importer/profile_writer.cc',
-      'browser/importer/profile_writer.h',
-      'browser/lifetime/browser_close_manager.cc',
-      'browser/lifetime/browser_close_manager.h',
-      'browser/lifetime/keep_alive_registry.cc',
-      'browser/lifetime/keep_alive_registry.h',
-      'browser/lifetime/keep_alive_state_observer.h',
-      'browser/lifetime/keep_alive_types.cc',
-      'browser/lifetime/keep_alive_types.h',
-      'browser/lifetime/scoped_keep_alive.cc',
-      'browser/lifetime/scoped_keep_alive.h',
-      'browser/media/tab_desktop_media_list.cc',
-      'browser/media/tab_desktop_media_list.h',
-      'browser/media_galleries/fileapi/av_scanning_file_validator.cc',
-      'browser/media_galleries/fileapi/av_scanning_file_validator.h',
-      'browser/media_galleries/fileapi/device_media_async_file_util.cc',
-      'browser/media_galleries/fileapi/device_media_async_file_util.h',
-      'browser/media_galleries/fileapi/iapps_finder.h',
-      'browser/media_galleries/fileapi/iapps_finder_impl.cc',
-      'browser/media_galleries/fileapi/iapps_finder_impl.h',
-      'browser/media_galleries/fileapi/iapps_finder_impl_mac.mm',
-      'browser/media_galleries/fileapi/iapps_finder_impl_win.cc',
-      'browser/media_galleries/fileapi/media_file_system_backend.cc',
-      'browser/media_galleries/fileapi/media_file_system_backend.h',
-      'browser/media_galleries/fileapi/media_file_validator_factory.cc',
-      'browser/media_galleries/fileapi/media_file_validator_factory.h',
-      'browser/media_galleries/fileapi/media_path_filter.cc',
-      'browser/media_galleries/fileapi/media_path_filter.h',
-      'browser/media_galleries/fileapi/mtp_device_async_delegate.cc',
-      'browser/media_galleries/fileapi/mtp_device_async_delegate.h',
-      'browser/media_galleries/fileapi/mtp_device_map_service.cc',
-      'browser/media_galleries/fileapi/mtp_device_map_service.h',
-      'browser/media_galleries/fileapi/mtp_file_stream_reader.cc',
-      'browser/media_galleries/fileapi/mtp_file_stream_reader.h',
-      'browser/media_galleries/fileapi/native_media_file_util.cc',
-      'browser/media_galleries/fileapi/native_media_file_util.h',
-      'browser/media_galleries/fileapi/picasa_finder.cc',
-      'browser/media_galleries/fileapi/picasa_finder.h',
-      'browser/media_galleries/fileapi/picasa_finder_mac.mm',
-      'browser/media_galleries/fileapi/readahead_file_stream_reader.cc',
-      'browser/media_galleries/fileapi/readahead_file_stream_reader.h',
-      'browser/media_galleries/fileapi/safe_audio_video_checker.cc',
-      'browser/media_galleries/fileapi/safe_audio_video_checker.h',
-      'browser/media_galleries/fileapi/safe_media_metadata_parser.cc',
-      'browser/media_galleries/fileapi/safe_media_metadata_parser.h',
-      'browser/media_galleries/fileapi/supported_audio_video_checker.cc',
-      'browser/media_galleries/fileapi/supported_audio_video_checker.h',
-      'browser/media_galleries/fileapi/supported_image_type_validator.cc',
-      'browser/media_galleries/fileapi/supported_image_type_validator.h',
-      'browser/media_galleries/gallery_watch_manager.cc',
-      'browser/media_galleries/gallery_watch_manager.h',
-      'browser/media_galleries/gallery_watch_manager_observer.h',
-      'browser/media_galleries/imported_media_gallery_registry.cc',
-      'browser/media_galleries/imported_media_gallery_registry.h',
-      'browser/media_galleries/linux/mtp_device_delegate_impl_linux.cc',
-      'browser/media_galleries/linux/mtp_device_delegate_impl_linux.h',
-      'browser/media_galleries/linux/mtp_device_object_enumerator.cc',
-      'browser/media_galleries/linux/mtp_device_object_enumerator.h',
-      'browser/media_galleries/linux/mtp_device_task_helper.cc',
-      'browser/media_galleries/linux/mtp_device_task_helper.h',
-      'browser/media_galleries/linux/mtp_device_task_helper_map_service.cc',
-      'browser/media_galleries/linux/mtp_device_task_helper_map_service.h',
-      'browser/media_galleries/linux/mtp_read_file_worker.cc',
-      'browser/media_galleries/linux/mtp_read_file_worker.h',
-      'browser/media_galleries/linux/snapshot_file_details.cc',
-      'browser/media_galleries/linux/snapshot_file_details.h',
-      'browser/media_galleries/mac/mtp_device_delegate_impl_mac.h',
-      'browser/media_galleries/mac/mtp_device_delegate_impl_mac.mm',
-      'browser/media_galleries/media_file_system_registry.cc',
-      'browser/media_galleries/media_file_system_registry.h',
-      'browser/media_galleries/media_galleries_dialog_controller.cc',
-      'browser/media_galleries/media_galleries_dialog_controller.h',
-      'browser/media_galleries/media_galleries_histograms.cc',
-      'browser/media_galleries/media_galleries_histograms.h',
-      'browser/media_galleries/media_galleries_permission_controller.cc',
-      'browser/media_galleries/media_galleries_permission_controller.h',
-      'browser/media_galleries/media_galleries_preferences.cc',
-      'browser/media_galleries/media_galleries_preferences.h',
-      'browser/media_galleries/media_galleries_preferences_factory.cc',
-      'browser/media_galleries/media_galleries_preferences_factory.h',
-      'browser/media_galleries/media_gallery_context_menu.cc',
-      'browser/media_galleries/media_gallery_context_menu.h',
-      'browser/media_galleries/win/mtp_device_delegate_impl_win.cc',
-      'browser/media_galleries/win/mtp_device_delegate_impl_win.h',
-      'browser/media_galleries/win/mtp_device_object_entry.cc',
-      'browser/media_galleries/win/mtp_device_object_entry.h',
-      'browser/media_galleries/win/mtp_device_object_enumerator.cc',
-      'browser/media_galleries/win/mtp_device_object_enumerator.h',
-      'browser/media_galleries/win/mtp_device_operations_util.cc',
-      'browser/media_galleries/win/mtp_device_operations_util.h',
-      'browser/media_galleries/win/portable_device_map_service.cc',
-      'browser/media_galleries/win/portable_device_map_service.h',
-      'browser/media_galleries/win/snapshot_file_details.cc',
-      'browser/media_galleries/win/snapshot_file_details.h',
-      'browser/memory/oom_memory_details.cc',
-      'browser/memory/oom_memory_details.h',
-      'browser/memory/tab_manager.cc',
-      'browser/memory/tab_manager.h',
-      'browser/memory/tab_manager_delegate_chromeos.cc',
-      'browser/memory/tab_manager_delegate_chromeos.h',
-      'browser/memory/tab_manager_observer.cc',
-      'browser/memory/tab_manager_observer.h',
-      'browser/memory/tab_manager_web_contents_data.cc',
-      'browser/memory/tab_manager_web_contents_data.h',
-      'browser/memory/tab_stats.cc',
-      'browser/memory/tab_stats.h',
-      'browser/metrics/first_web_contents_profiler.cc',
-      'browser/metrics/first_web_contents_profiler.h',
-      'browser/net/firefox_proxy_settings.cc',
-      'browser/net/firefox_proxy_settings.h',
-      'browser/net/utility_process_mojo_proxy_resolver_factory.cc',
-      'browser/net/utility_process_mojo_proxy_resolver_factory.h',
-      'browser/obsolete_system/obsolete_system.h',
-      'browser/obsolete_system/obsolete_system_linux.cc',
-      'browser/obsolete_system/obsolete_system_mac.cc',
-      'browser/obsolete_system/obsolete_system_win.cc',
-      'browser/pdf/pdf_extension_util.cc',
-      'browser/pdf/pdf_extension_util.h',
-      'browser/power/process_power_collector.cc',
-      'browser/power/process_power_collector.h',
-      'browser/process_singleton_modal_dialog_lock.cc',
-      'browser/process_singleton_modal_dialog_lock.h',
-      'browser/process_singleton_posix.cc',
-      'browser/process_singleton_startup_lock.cc',
-      'browser/process_singleton_startup_lock.h',
-      'browser/profile_resetter/brandcode_config_fetcher.cc',
-      'browser/profile_resetter/brandcode_config_fetcher.h',
-      'browser/profile_resetter/brandcoded_default_settings.cc',
-      'browser/profile_resetter/brandcoded_default_settings.h',
-      'browser/profile_resetter/profile_resetter.cc',
-      'browser/profile_resetter/profile_resetter.h',
-      'browser/profile_resetter/reset_report_uploader.cc',
-      'browser/profile_resetter/reset_report_uploader.h',
-      'browser/profile_resetter/reset_report_uploader_factory.cc',
-      'browser/profile_resetter/reset_report_uploader_factory.h',
-      'browser/profile_resetter/resettable_settings_snapshot.cc',
-      'browser/profile_resetter/resettable_settings_snapshot.h',
-      'browser/profile_resetter/triggered_profile_resetter.cc',
-      'browser/profile_resetter/triggered_profile_resetter.h',
-      'browser/profile_resetter/triggered_profile_resetter_factory.cc',
-      'browser/profile_resetter/triggered_profile_resetter_factory.h',
-      'browser/profile_resetter/triggered_profile_resetter_win.cc',
-      'browser/profiles/avatar_menu.cc',
-      'browser/profiles/avatar_menu.h',
-      'browser/profiles/profile_shortcut_manager.cc',
-      'browser/profiles/profile_shortcut_manager.h',
-      'browser/profiles/profile_window.cc',
-      'browser/profiles/profile_window.h',
-      'browser/renderer_context_menu/open_with_menu_factory.cc',
-      'browser/renderer_context_menu/open_with_menu_factory.h',
-      'browser/renderer_context_menu/render_view_context_menu.cc',
-      'browser/renderer_context_menu/render_view_context_menu.h',
-      'browser/renderer_context_menu/spelling_bubble_model.cc',
-      'browser/renderer_context_menu/spelling_bubble_model.h',
-      'browser/renderer_context_menu/spelling_menu_observer.cc',
-      'browser/renderer_context_menu/spelling_menu_observer.h',
-      'browser/repost_form_warning_controller.cc',
-      'browser/repost_form_warning_controller.h',
-      'browser/search/local_ntp_source.cc',
-      'browser/search/local_ntp_source.h',
-      'browser/search/search_terms_tracker.cc',
-      'browser/search/search_terms_tracker.h',
-      'browser/signin/signin_promo.cc',
-      'browser/signin/signin_promo.h',
-      'browser/signin/signin_ui_util.cc',
-      'browser/signin/signin_ui_util.h',
-      'browser/speech/extension_api/tts_extension_api_constants.cc',  # Should be moved to extensions section?
-      'browser/speech/extension_api/tts_extension_api_constants.h',
-      'browser/ssl/ssl_add_certificate.cc',
-      'browser/ssl/ssl_add_certificate.h',
-      'browser/ssl/ssl_client_auth_observer.cc',
-      'browser/ssl/ssl_client_auth_observer.h',
-      'browser/status_icons/desktop_notification_balloon.cc',
-      'browser/status_icons/desktop_notification_balloon.h',
-      'browser/sync/glue/extension_data_type_controller.cc',
-      'browser/sync/glue/extension_data_type_controller.h',
-      'browser/sync/glue/extension_setting_data_type_controller.cc',
-      'browser/sync/glue/extension_setting_data_type_controller.h',
-      'browser/sync/sync_ui_util.cc',
-      'browser/sync/sync_ui_util.h',
-      'browser/upgrade_detector.cc',
-      'browser/upgrade_detector.h',
-      'browser/usb/usb_chooser_controller.cc',
-      'browser/usb/usb_chooser_controller.h',
-      'browser/usb/web_usb_chooser_service.cc',
-      'browser/usb/web_usb_chooser_service.h',
-      'browser/usb/web_usb_detector.cc',
-      'browser/usb/web_usb_detector.h',
-    ],
-    'chrome_browser_win_sources': [
-      'browser/downgrade/user_data_downgrade.cc',
-      'browser/downgrade/user_data_downgrade.h',
-      'browser/first_run/try_chrome_dialog_view.cc',
-      'browser/first_run/try_chrome_dialog_view.h',
-      'browser/first_run/upgrade_util.cc',
-      'browser/google/did_run_updater_win.cc',
-      'browser/google/did_run_updater_win.h',
-      'browser/hang_monitor/hang_crash_dump_win.cc',
-      'browser/hang_monitor/hang_crash_dump_win.h',
-      'browser/media/window_icon_util_win.cc',
-      'browser/metrics/antivirus_metrics_provider_win.cc',
-      'browser/metrics/antivirus_metrics_provider_win.h',
-      'browser/password_manager/password_manager_util_win.cc',
-      'browser/password_manager/password_manager_util_win.h',
-      'browser/themes/theme_service_win.cc',
-      'browser/themes/theme_service_win.h',
-    ],
-    'chrome_browser_non_win_sources': [
-      'browser/profile_resetter/triggered_profile_resetter_stub.cc',
-      'browser/profiles/profile_shortcut_manager_stub.cc',
-    ],
-    # Sources (generally "desktop OS importers") used only on Mac & Windows.
-    'chrome_browser_win_mac_sources': [
-      'browser/crash_upload_list/crash_upload_list_crashpad.cc',
-      'browser/crash_upload_list/crash_upload_list_crashpad.h',
-      'browser/media_galleries/fileapi/file_path_watcher_util.cc',
-      'browser/media_galleries/fileapi/file_path_watcher_util.h',
-      'browser/media_galleries/fileapi/iapps_data_provider.cc',
-      'browser/media_galleries/fileapi/iapps_data_provider.h',
-      'browser/media_galleries/fileapi/itunes_data_provider.cc',
-      'browser/media_galleries/fileapi/itunes_data_provider.h',
-      'browser/media_galleries/fileapi/itunes_file_util.cc',
-      'browser/media_galleries/fileapi/itunes_file_util.h',
-      'browser/media_galleries/fileapi/picasa_data_provider.cc',
-      'browser/media_galleries/fileapi/picasa_data_provider.h',
-      'browser/media_galleries/fileapi/picasa_file_util.cc',
-      'browser/media_galleries/fileapi/picasa_file_util.h',
-      'browser/media_galleries/fileapi/safe_iapps_library_parser.cc',
-      'browser/media_galleries/fileapi/safe_iapps_library_parser.h',
-      'browser/media_galleries/fileapi/safe_itunes_pref_parser_win.cc',
-      'browser/media_galleries/fileapi/safe_itunes_pref_parser_win.h',
-      'browser/media_galleries/fileapi/safe_picasa_album_table_reader.cc',
-      'browser/media_galleries/fileapi/safe_picasa_album_table_reader.h',
-      'browser/media_galleries/fileapi/safe_picasa_albums_indexer.cc',
-      'browser/media_galleries/fileapi/safe_picasa_albums_indexer.h',
-      'browser/recovery/recovery_install_global_error.cc',
-      'browser/recovery/recovery_install_global_error.h',
-      'browser/recovery/recovery_install_global_error_factory.cc',
-      'browser/recovery/recovery_install_global_error_factory.h',
-    ],
-    # X11 sources, coveres desktop Linux and ChromeOS.
-    'chrome_browser_x11_sources': [
-      'browser/chrome_browser_main_extra_parts_x11.cc',
-      'browser/chrome_browser_main_extra_parts_x11.h',
-    ],
-
-    ### Feature-based sources ###
-    # Variables should generally be alphabetical within this section.
-
-    'chrome_browser_background_sources': [
-      'browser/background/background_application_list_model.cc',
-      'browser/background/background_application_list_model.h',
-      'browser/background/background_contents_service.cc',
-      'browser/background/background_contents_service.h',
-      'browser/background/background_contents_service_factory.cc',
-      'browser/background/background_contents_service_factory.h',
-      'browser/background/background_mode_manager.cc',
-      'browser/background/background_mode_manager.h',
-      'browser/background/background_mode_manager_aura.cc',
-      'browser/background/background_mode_manager_chromeos.cc',
-      'browser/background/background_mode_manager_mac.mm',
-      'browser/background/background_mode_manager_win.cc',
-      'browser/background/background_mode_optimizer.cc',
-      'browser/background/background_mode_optimizer.h',
-      'browser/background/background_trigger.h',
-    ],
-    'chrome_browser_offline_pages_sources': [
-      'browser/android/offline_pages/background_scheduler_bridge.cc',
-      'browser/android/offline_pages/background_scheduler_bridge.h',
-      'browser/android/offline_pages/offline_page_bridge.cc',
-      'browser/android/offline_pages/offline_page_bridge.h',
-      'browser/android/offline_pages/offline_page_mhtml_archiver.cc',
-      'browser/android/offline_pages/offline_page_mhtml_archiver.h',
-      'browser/android/offline_pages/offline_page_model_factory.cc',
-      'browser/android/offline_pages/offline_page_model_factory.h',
-      'browser/android/offline_pages/offline_page_request_interceptor.cc',
-      'browser/android/offline_pages/offline_page_request_interceptor.h',
-      'browser/android/offline_pages/offline_page_request_job.cc',
-      'browser/android/offline_pages/offline_page_request_job.h',
-      'browser/android/offline_pages/offline_page_tab_helper.cc',
-      'browser/android/offline_pages/offline_page_tab_helper.h',
-      'browser/android/offline_pages/offline_page_utils.cc',
-      'browser/android/offline_pages/offline_page_utils.h',
-      'browser/android/offline_pages/offliner_factory.h',
-      'browser/android/offline_pages/prerender_adapter.cc',
-      'browser/android/offline_pages/prerender_adapter.h',
-      'browser/android/offline_pages/prerendering_loader.cc',
-      'browser/android/offline_pages/prerendering_loader.h',
-      'browser/android/offline_pages/prerendering_offliner.cc',
-      'browser/android/offline_pages/prerendering_offliner.h',
-      'browser/android/offline_pages/prerendering_offliner_factory.cc',
-      'browser/android/offline_pages/prerendering_offliner_factory.h',
-      'browser/android/offline_pages/recent_tab_helper.cc',
-      'browser/android/offline_pages/recent_tab_helper.h',
-      'browser/android/offline_pages/request_coordinator_factory.cc',
-      'browser/android/offline_pages/request_coordinator_factory.h',
-      'browser/android/offline_pages/downloads/offline_page_download_bridge.cc',
-      'browser/android/offline_pages/downloads/offline_page_download_bridge.h',
-      'browser/android/offline_pages/downloads/offline_page_notification_bridge.cc',
-      'browser/android/offline_pages/downloads/offline_page_notification_bridge.h',
-    ],
-    'chrome_browser_captive_portal_sources': [
-      'browser/captive_portal/captive_portal_login_detector.cc',
-      'browser/captive_portal/captive_portal_login_detector.h',
-      'browser/captive_portal/captive_portal_service.cc',
-      'browser/captive_portal/captive_portal_service.h',
-      'browser/captive_portal/captive_portal_service_factory.cc',
-      'browser/captive_portal/captive_portal_service_factory.h',
-      'browser/captive_portal/captive_portal_tab_helper.cc',
-      'browser/captive_portal/captive_portal_tab_helper.h',
-      'browser/captive_portal/captive_portal_tab_reloader.cc',
-      'browser/captive_portal/captive_portal_tab_reloader.h',
-      'browser/ssl/captive_portal_blocking_page.cc',
-      'browser/ssl/captive_portal_blocking_page.h',
-      'browser/ssl/captive_portal_metrics_recorder.cc',
-      'browser/ssl/captive_portal_metrics_recorder.h',
-    ],
-    'chrome_browser_extensions_sources': [
-      'browser/accessibility/accessibility_extension_api.cc',
-      'browser/accessibility/accessibility_extension_api.h',
-      'browser/accessibility/animation_policy_prefs.cc',
-      'browser/accessibility/animation_policy_prefs.h',
-      'browser/autocomplete/keyword_extensions_delegate_impl.cc',
-      'browser/autocomplete/keyword_extensions_delegate_impl.h',
-      'browser/browsing_data/hosted_apps_counter.cc',
-      'browser/browsing_data/hosted_apps_counter.h',
-      'browser/content_settings/content_settings_internal_extension_provider.cc',
-      'browser/content_settings/content_settings_internal_extension_provider.h',
-      'browser/drive/drive_notification_manager_factory.cc',
-      'browser/drive/drive_notification_manager_factory.h',
-      'browser/guest_view/app_view/chrome_app_view_guest_delegate.cc',
-      'browser/guest_view/app_view/chrome_app_view_guest_delegate.h',
-      'browser/guest_view/chrome_guest_view_manager_delegate.cc',
-      'browser/guest_view/chrome_guest_view_manager_delegate.h',
-      'browser/guest_view/extension_options/chrome_extension_options_guest_delegate.cc',
-      'browser/guest_view/extension_options/chrome_extension_options_guest_delegate.h',
-      'browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc',
-      'browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h',
-      'browser/guest_view/web_view/chrome_web_view_guest_delegate.cc',
-      'browser/guest_view/web_view/chrome_web_view_guest_delegate.h',
-      'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc',
-      'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h',
-      'browser/guest_view/web_view/context_menu_content_type_web_view.cc',
-      'browser/guest_view/web_view/context_menu_content_type_web_view.h',
-      'browser/media/capture_access_handler_base.cc',
-      'browser/media/capture_access_handler_base.h',
-      'browser/media/cast_transport_host_filter.cc',
-      'browser/media/cast_transport_host_filter.h',
-      'browser/media/desktop_capture_access_handler.cc',
-      'browser/media/desktop_capture_access_handler.h',
-      'browser/media/extension_media_access_handler.cc',
-      'browser/media/extension_media_access_handler.h',
-      'browser/media/tab_capture_access_handler.cc',
-      'browser/media/tab_capture_access_handler.h',
-      'browser/metrics/extensions_metrics_provider.cc',
-      'browser/metrics/extensions_metrics_provider.h',
-      'browser/renderer_context_menu/context_menu_content_type_app_mode.cc',
-      'browser/renderer_context_menu/context_menu_content_type_app_mode.h',
-      'browser/renderer_context_menu/context_menu_content_type_extension_popup.cc',
-      'browser/renderer_context_menu/context_menu_content_type_extension_popup.h',
-      'browser/renderer_context_menu/context_menu_content_type_platform_app.cc',
-      'browser/renderer_context_menu/context_menu_content_type_platform_app.h',
-      'browser/renderer_host/chrome_extension_message_filter.cc',
-      'browser/renderer_host/chrome_extension_message_filter.h',
-      'browser/search/hotword_audio_history_handler.cc',
-      'browser/search/hotword_audio_history_handler.h',
-      'browser/search/hotword_client.h',
-      'browser/search/hotword_service.cc',
-      'browser/search/hotword_service.h',
-      'browser/search/hotword_service_factory.cc',
-      'browser/search/hotword_service_factory.h',
-      'browser/signin/chrome_proximity_auth_client.cc',
-      'browser/signin/chrome_proximity_auth_client.h',
-      'browser/signin/easy_unlock_app_manager.cc',
-      'browser/signin/easy_unlock_app_manager.h',
-      'browser/signin/easy_unlock_auth_attempt.cc',
-      'browser/signin/easy_unlock_auth_attempt.h',
-      'browser/signin/easy_unlock_metrics.cc',
-      'browser/signin/easy_unlock_metrics.h',
-      'browser/signin/easy_unlock_screenlock_state_handler.cc',
-      'browser/signin/easy_unlock_screenlock_state_handler.h',
-      'browser/signin/easy_unlock_service.cc',
-      'browser/signin/easy_unlock_service.h',
-      'browser/signin/easy_unlock_service_factory.cc',
-      'browser/signin/easy_unlock_service_factory.h',
-      'browser/signin/easy_unlock_service_regular.cc',
-      'browser/signin/easy_unlock_service_regular.h',
-      'browser/signin/easy_unlock_service_signin_chromeos.cc',
-      'browser/signin/easy_unlock_service_signin_chromeos.h',
-      'browser/speech/extension_api/tts_engine_extension_api.cc',
-      'browser/speech/extension_api/tts_engine_extension_api.h',
-      'browser/speech/extension_api/tts_engine_extension_observer.cc',
-      'browser/speech/extension_api/tts_engine_extension_observer.h',
-      'browser/speech/extension_api/tts_extension_api.cc',
-      'browser/speech/extension_api/tts_extension_api.h',
-      'browser/sync_file_system/conflict_resolution_policy.h',
-      'browser/sync_file_system/drive_backend/callback_helper.h',
-      'browser/sync_file_system/drive_backend/callback_tracker.cc',
-      'browser/sync_file_system/drive_backend/callback_tracker.h',
-      'browser/sync_file_system/drive_backend/callback_tracker_internal.cc',
-      'browser/sync_file_system/drive_backend/callback_tracker_internal.h',
-      'browser/sync_file_system/drive_backend/conflict_resolver.cc',
-      'browser/sync_file_system/drive_backend/conflict_resolver.h',
-      'browser/sync_file_system/drive_backend/drive_backend_constants.cc',
-      'browser/sync_file_system/drive_backend/drive_backend_constants.h',
-      'browser/sync_file_system/drive_backend/drive_backend_util.cc',
-      'browser/sync_file_system/drive_backend/drive_backend_util.h',
-      'browser/sync_file_system/drive_backend/drive_service_on_worker.cc',
-      'browser/sync_file_system/drive_backend/drive_service_on_worker.h',
-      'browser/sync_file_system/drive_backend/drive_service_wrapper.cc',
-      'browser/sync_file_system/drive_backend/drive_service_wrapper.h',
-      'browser/sync_file_system/drive_backend/drive_uploader_on_worker.cc',
-      'browser/sync_file_system/drive_backend/drive_uploader_on_worker.h',
-      'browser/sync_file_system/drive_backend/drive_uploader_wrapper.cc',
-      'browser/sync_file_system/drive_backend/drive_uploader_wrapper.h',
-      'browser/sync_file_system/drive_backend/folder_creator.cc',
-      'browser/sync_file_system/drive_backend/folder_creator.h',
-      'browser/sync_file_system/drive_backend/leveldb_wrapper.cc',
-      'browser/sync_file_system/drive_backend/leveldb_wrapper.h',
-      'browser/sync_file_system/drive_backend/list_changes_task.cc',
-      'browser/sync_file_system/drive_backend/list_changes_task.h',
-      'browser/sync_file_system/drive_backend/local_to_remote_syncer.cc',
-      'browser/sync_file_system/drive_backend/local_to_remote_syncer.h',
-      'browser/sync_file_system/drive_backend/metadata_database.cc',
-      'browser/sync_file_system/drive_backend/metadata_database.h',
-      'browser/sync_file_system/drive_backend/metadata_database_index.cc',
-      'browser/sync_file_system/drive_backend/metadata_database_index.h',
-      'browser/sync_file_system/drive_backend/metadata_database_index_interface.h',
-      'browser/sync_file_system/drive_backend/metadata_database_index_on_disk.cc',
-      'browser/sync_file_system/drive_backend/metadata_database_index_on_disk.h',
-      'browser/sync_file_system/drive_backend/metadata_db_migration_util.cc',
-      'browser/sync_file_system/drive_backend/metadata_db_migration_util.h',
-      'browser/sync_file_system/drive_backend/register_app_task.cc',
-      'browser/sync_file_system/drive_backend/register_app_task.h',
-      'browser/sync_file_system/drive_backend/remote_change_processor_on_worker.cc',
-      'browser/sync_file_system/drive_backend/remote_change_processor_on_worker.h',
-      'browser/sync_file_system/drive_backend/remote_change_processor_wrapper.cc',
-      'browser/sync_file_system/drive_backend/remote_change_processor_wrapper.h',
-      'browser/sync_file_system/drive_backend/remote_to_local_syncer.cc',
-      'browser/sync_file_system/drive_backend/remote_to_local_syncer.h',
-      'browser/sync_file_system/drive_backend/sync_engine.cc',
-      'browser/sync_file_system/drive_backend/sync_engine.h',
-      'browser/sync_file_system/drive_backend/sync_engine_context.cc',
-      'browser/sync_file_system/drive_backend/sync_engine_context.h',
-      'browser/sync_file_system/drive_backend/sync_engine_initializer.cc',
-      'browser/sync_file_system/drive_backend/sync_engine_initializer.h',
-      'browser/sync_file_system/drive_backend/sync_task.cc',
-      'browser/sync_file_system/drive_backend/sync_task.h',
-      'browser/sync_file_system/drive_backend/sync_task_manager.cc',
-      'browser/sync_file_system/drive_backend/sync_task_manager.h',
-      'browser/sync_file_system/drive_backend/sync_task_token.cc',
-      'browser/sync_file_system/drive_backend/sync_task_token.h',
-      'browser/sync_file_system/drive_backend/sync_worker.cc',
-      'browser/sync_file_system/drive_backend/sync_worker.h',
-      'browser/sync_file_system/drive_backend/sync_worker_interface.h',
-      'browser/sync_file_system/drive_backend/task_dependency_manager.cc',
-      'browser/sync_file_system/drive_backend/task_dependency_manager.h',
-      'browser/sync_file_system/drive_backend/tracker_id_set.cc',
-      'browser/sync_file_system/drive_backend/tracker_id_set.h',
-      'browser/sync_file_system/drive_backend/uninstall_app_task.cc',
-      'browser/sync_file_system/drive_backend/uninstall_app_task.h',
-      'browser/sync_file_system/file_change.cc',
-      'browser/sync_file_system/file_change.h',
-      'browser/sync_file_system/file_status_observer.h',
-      'browser/sync_file_system/local/local_file_change_tracker.cc',
-      'browser/sync_file_system/local/local_file_change_tracker.h',
-      'browser/sync_file_system/local/local_file_sync_context.cc',
-      'browser/sync_file_system/local/local_file_sync_context.h',
-      'browser/sync_file_system/local/local_file_sync_service.cc',
-      'browser/sync_file_system/local/local_file_sync_service.h',
-      'browser/sync_file_system/local/local_file_sync_status.cc',
-      'browser/sync_file_system/local/local_file_sync_status.h',
-      'browser/sync_file_system/local/local_origin_change_observer.h',
-      'browser/sync_file_system/local/root_delete_helper.cc',
-      'browser/sync_file_system/local/root_delete_helper.h',
-      'browser/sync_file_system/local/sync_file_system_backend.cc',
-      'browser/sync_file_system/local/sync_file_system_backend.h',
-      'browser/sync_file_system/local/syncable_file_operation_runner.cc',
-      'browser/sync_file_system/local/syncable_file_operation_runner.h',
-      'browser/sync_file_system/local/syncable_file_system_operation.cc',
-      'browser/sync_file_system/local/syncable_file_system_operation.h',
-      'browser/sync_file_system/local_change_processor.h',
-      'browser/sync_file_system/logger.cc',
-      'browser/sync_file_system/logger.h',
-      'browser/sync_file_system/remote_change_processor.h',
-      'browser/sync_file_system/remote_file_sync_service.cc',
-      'browser/sync_file_system/remote_file_sync_service.h',
-      'browser/sync_file_system/subtree_set.cc',
-      'browser/sync_file_system/subtree_set.h',
-      'browser/sync_file_system/sync_action.cc',
-      'browser/sync_file_system/sync_action.h',
-      'browser/sync_file_system/sync_callbacks.h',
-      'browser/sync_file_system/sync_direction.h',
-      'browser/sync_file_system/sync_event_observer.h',
-      'browser/sync_file_system/sync_file_metadata.cc',
-      'browser/sync_file_system/sync_file_metadata.h',
-      'browser/sync_file_system/sync_file_status.h',
-      'browser/sync_file_system/sync_file_system_service.cc',
-      'browser/sync_file_system/sync_file_system_service.h',
-      'browser/sync_file_system/sync_file_system_service_factory.cc',
-      'browser/sync_file_system/sync_file_system_service_factory.h',
-      'browser/sync_file_system/sync_file_type.h',
-      'browser/sync_file_system/sync_operation_type.cc',
-      'browser/sync_file_system/sync_operation_type.h',
-      'browser/sync_file_system/sync_process_runner.cc',
-      'browser/sync_file_system/sync_process_runner.h',
-      'browser/sync_file_system/sync_service_state.h',
-      'browser/sync_file_system/sync_status_code.cc',
-      'browser/sync_file_system/sync_status_code.h',
-      'browser/sync_file_system/syncable_file_system_util.cc',
-      'browser/sync_file_system/syncable_file_system_util.h',
-      'browser/sync_file_system/task_logger.cc',
-      'browser/sync_file_system/task_logger.h',
-    ],
-    'chrome_browser_gnome_keyring_sources': [
-      'browser/password_manager/native_backend_gnome_x.cc',
-      'browser/password_manager/native_backend_gnome_x.h',
-    ],
-    'chrome_browser_libsecret_sources': [
-       'browser/password_manager/native_backend_libsecret.cc',
-       'browser/password_manager/native_backend_libsecret.h',
-    ],
-    'chrome_browser_history_sources': [
-    ],
-    # History sources used when android_java_ui is enabled.
-    'chrome_browser_history_android_java_ui_sources': [
-      'browser/history/android/android_history_provider_service.cc',
-      'browser/history/android/android_history_provider_service.h',
-      'browser/history/android/android_provider_backend.cc',
-      'browser/history/android/android_provider_backend.h',
-      'browser/history/android/bookmark_model_sql_handler.cc',
-      'browser/history/android/bookmark_model_sql_handler.h',
-      'browser/history/android/sqlite_cursor.cc',
-      'browser/history/android/sqlite_cursor.h',
-    ],
-    'chrome_browser_jni_sources': [
-      'android/java/src/org/chromium/chrome/browser/AfterStartupTaskUtils.java',
-      'android/java/src/org/chromium/chrome/browser/ApplicationLifetime.java',
-      'android/java/src/org/chromium/chrome/browser/accessibility/FontSizePrefs.java',
-      'android/java/src/org/chromium/chrome/browser/appmenu/AppMenuDragHelper.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/AutofillKeyboardAccessoryBridge.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/AutofillLogger.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/AutofillPopupBridge.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/CardUnmaskBridge.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/CreditCardScannerBridge.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/PasswordGenerationPopupBridge.java',
-      'android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java',
-      'android/java/src/org/chromium/chrome/browser/BackgroundSyncLauncher.java',
-      'android/java/src/org/chromium/chrome/browser/BluetoothChooserDialog.java',
-      'android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java',
-      'android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java',
-      'android/java/src/org/chromium/chrome/browser/blimp/BlimpClientContextFactory.java',
-      'android/java/src/org/chromium/chrome/browser/blimp/ChromeBlimpClientContextDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/browsing_data/UrlFilterBridge.java',
-      'android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java',
-      'android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountFeedbackReporter.java',
-      'android/java/src/org/chromium/chrome/browser/ChromeApplication.java',
-      'android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java',
-      'android/java/src/org/chromium/chrome/browser/ChromeHttpAuthHandler.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ReaderModeSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/SceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java',
-      'android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java',
-      'android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuParams.java',
-      'android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java',
-      'android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java',
-      'android/java/src/org/chromium/chrome/browser/cookies/CookiesFetcher.java',
-      'android/java/src/org/chromium/chrome/browser/DevToolsServer.java',
-      'android/java/src/org/chromium/chrome/browser/database/SQLiteCursor.java',
-      'android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java',
-      'android/java/src/org/chromium/chrome/browser/datausage/ExternalDataUseObserver.java',
-      'android/java/src/org/chromium/chrome/browser/document/DocumentWebContentsDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerServiceFactory.java',
-      'android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerTabUtils.java',
-      'android/java/src/org/chromium/chrome/browser/dom_distiller/DomDistillerUIUtils.java',
-      'android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/download/DownloadController.java',
-      'android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java',
-      'android/java/src/org/chromium/chrome/browser/favicon/FaviconHelper.java',
-      'android/java/src/org/chromium/chrome/browser/favicon/LargeIconBridge.java',
-      'android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java',
-      'android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java',
-      'android/java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java',
-      'android/java/src/org/chromium/chrome/browser/historyreport/HistoryReportJniBridge.java',
-      'android/java/src/org/chromium/chrome/browser/JavaExceptionReporter.java',
-      'android/java/src/org/chromium/chrome/browser/IntentHelper.java',
-      'android/java/src/org/chromium/chrome/browser/JavascriptAppModalDialog.java',
-      'android/java/src/org/chromium/chrome/browser/media/cdm/MediaDrmCredentialManager.java',
-      'android/java/src/org/chromium/chrome/browser/media/remote/RecordCastAction.java',
-      'android/java/src/org/chromium/chrome/browser/media/remote/RemoteMediaPlayerBridge.java',
-      'android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouter.java',
-      'android/java/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterDialogController.java',
-      'android/java/src/org/chromium/chrome/browser/mojo/ChromeInterfaceRegistrar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/DownloadOverwriteInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/InstantAppsInfoBarDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/TranslateInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java',
-      'android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java',
-      'android/java/src/org/chromium/chrome/browser/metrics/UmaUtils.java',
-      'android/java/src/org/chromium/chrome/browser/metrics/VariationsSession.java',
-      'android/java/src/org/chromium/chrome/browser/net/qualityprovider/ExternalEstimateProviderAndroid.java',
-      'android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java',
-      'android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/ForeignSessionHelper.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/LogoBridge.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/NewTabPagePrefs.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/RecentlyClosedBridge.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java',
-      'android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsLauncher.java',
-      'android/java/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerBridge.java',
-      'android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java',
-      'android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java',
-      'android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java',
-      'android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java',
-      'android/java/src/org/chromium/chrome/browser/omnibox/AnswersImage.java',
-      'android/java/src/org/chromium/chrome/browser/omnibox/AutocompleteController.java',
-      'android/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java',
-      'android/java/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizer.java',
-      'android/java/src/org/chromium/chrome/browser/omnibox/OmniboxViewUtil.java',
-      'android/java/src/org/chromium/chrome/browser/pageinfo/CertificateViewer.java',
-      'android/java/src/org/chromium/chrome/browser/pageinfo/ConnectionInfoPopup.java',
-      'android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java',
-      'android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java',
-      'android/java/src/org/chromium/chrome/browser/password_manager/Credential.java',
-      'android/java/src/org/chromium/chrome/browser/password_manager/AccountChooserDialog.java',
-      'android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java',
-      'android/java/src/org/chromium/chrome/browser/PasswordUIView.java',
-      'android/java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java',
-      'android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java',
-      'android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java',
-      'android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java',
-      'android/java/src/org/chromium/chrome/browser/preferences/PrefServiceBridge.java',
-      'android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java',
-      'android/java/src/org/chromium/chrome/browser/profiles/MostVisitedSites.java',
-      'android/java/src/org/chromium/chrome/browser/profiles/Profile.java',
-      'android/java/src/org/chromium/chrome/browser/profiles/ProfileDownloader.java',
-      'android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java',
-      'android/java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java',
-      'android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java',
-      'android/java/src/org/chromium/chrome/browser/push_messaging/PushMessagingServiceObserver.java',
-      'android/java/src/org/chromium/chrome/browser/rappor/RapporServiceBridge.java',
-      'android/java/src/org/chromium/chrome/browser/rlz/RevenueStats.java',
-      'android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingApiBridge.java',
-      'android/java/src/org/chromium/chrome/browser/ShortcutHelper.java',
-      'android/java/src/org/chromium/chrome/browser/SSLClientCertificateRequest.java',
-      'android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlService.java',
-      'android/java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java',
-      'android/java/src/org/chromium/chrome/browser/ServiceTabLauncher.java',
-      'android/java/src/org/chromium/chrome/browser/signin/AccountManagementScreenHelper.java',
-      'android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java',
-      'android/java/src/org/chromium/chrome/browser/signin/OAuth2TokenService.java',
-      'android/java/src/org/chromium/chrome/browser/signin/SigninInvestigator.java',
-      'android/java/src/org/chromium/chrome/browser/signin/SigninManager.java',
-      'android/java/src/org/chromium/chrome/browser/signin/SigninPromoUtil.java',
-      'android/java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java',
-      'android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java',
-      'android/java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java',
-      'android/java/src/org/chromium/chrome/browser/sync/SyncSessionsMetrics.java',
-      'android/java/src/org/chromium/chrome/browser/tab/Tab.java',
-      'android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroid.java',
-      'android/java/src/org/chromium/chrome/browser/tabmodel/SingleTabModel.java',
-      'android/java/src/org/chromium/chrome/browser/tabmodel/TabModelJniBridge.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/WebApkInstaller.java',
-      'android/java/src/org/chromium/chrome/browser/TabState.java',
-      'android/java/src/org/chromium/chrome/browser/TtsPlatformImpl.java',
-      'android/java/src/org/chromium/chrome/browser/UsbChooserDialog.java',
-      'android/java/src/org/chromium/chrome/browser/util/AccessibilityUtil.java',
-      'android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java',
-      'android/java/src/org/chromium/chrome/browser/util/PlatformUtil.java',
-      'android/java/src/org/chromium/chrome/browser/util/UrlUtilities.java',
-      'android/java/src/org/chromium/chrome/browser/WarmupManager.java',
-      'android/java/src/org/chromium/chrome/browser/WebContentsFactory.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarAndroid.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/AppBannerInfoBarDelegateAndroid.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/AutofillCreditCardFillingInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/ConfirmInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBarDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/GeneratedPasswordSavedInfoBarDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/GroupedPermissionInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfoBarDelegate.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/SavePasswordInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/SimpleConfirmInfoBarBuilder.java',
-      'android/java/src/org/chromium/chrome/browser/infobar/UpdatePasswordInfoBar.java',
-      'android/java/src/org/chromium/chrome/browser/invalidation/InvalidationServiceFactory.java',
-      'android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java',
-      'android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java',
-      'android/java/src/org/chromium/chrome/browser/toolbar/ToolbarModel.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenDialogHelper.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/ManifestUpgradeDetectorFetcher.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java',
-      'android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java',
-    ],
-    'chrome_browser_mdns_sources': [
-      'browser/local_discovery/service_discovery_client_impl.cc',
-      'browser/local_discovery/service_discovery_client_impl.h',
-      'browser/local_discovery/service_discovery_client_mdns.cc',
-      'browser/local_discovery/service_discovery_client_mdns.h',
-      'browser/printing/cloud_print/privet_traffic_detector.cc',
-      'browser/printing/cloud_print/privet_traffic_detector.h',
-    ],
-    'chrome_browser_nacl_sources': [
-      'browser/nacl_host/nacl_browser_delegate_impl.cc',
-      'browser/nacl_host/nacl_browser_delegate_impl.h',
-      'browser/nacl_host/nacl_infobar_delegate.cc',
-      'browser/nacl_host/nacl_infobar_delegate.h',
-    ],
-    # Used on all platforms when notifications are enabled.
-    'chrome_browser_notifications_sources': [
-      'browser/notifications/desktop_notification_profile_util.cc',
-      'browser/notifications/desktop_notification_profile_util.h',
-      'browser/notifications/login_state_notification_blocker_chromeos.cc',
-      'browser/notifications/login_state_notification_blocker_chromeos.h',
-      'browser/notifications/message_center_display_service.cc',
-      'browser/notifications/message_center_display_service.h',
-      'browser/notifications/native_notification_display_service.cc',
-      'browser/notifications/native_notification_display_service.h',
-      'browser/notifications/non_persistent_notification_handler.cc',
-      'browser/notifications/non_persistent_notification_handler.h',
-      'browser/notifications/notification.cc',
-      'browser/notifications/notification.h',
-      'browser/notifications/notification_common.cc',
-      'browser/notifications/notification_common.h',
-      'browser/notifications/notification_delegate.h',
-      'browser/notifications/notification_display_service.h',
-      'browser/notifications/notification_display_service_factory.cc',
-      'browser/notifications/notification_display_service_factory.h',
-      'browser/notifications/notification_handler.h',
-      'browser/notifications/notification_object_proxy.cc',
-      'browser/notifications/notification_object_proxy.h',
-      'browser/notifications/notification_permission_context.cc',
-      'browser/notifications/notification_permission_context.h',
-      'browser/notifications/notification_platform_bridge.h',
-      'browser/notifications/notification_platform_bridge_mac.h',
-      'browser/notifications/notification_platform_bridge_mac.mm',
-      'browser/notifications/notification_ui_manager.h',
-      'browser/notifications/notifier_state_tracker.cc',
-      'browser/notifications/notifier_state_tracker.h',
-      'browser/notifications/notifier_state_tracker_factory.cc',
-      'browser/notifications/notifier_state_tracker_factory.h',
-      'browser/notifications/persistent_notification_delegate.cc',
-      'browser/notifications/persistent_notification_delegate.h',
-      'browser/notifications/persistent_notification_handler.cc',
-      'browser/notifications/persistent_notification_handler.h',
-      'browser/notifications/platform_notification_service_impl.cc',
-      'browser/notifications/platform_notification_service_impl.h',
-      'browser/push_messaging/push_messaging_notification_manager.cc',
-      'browser/push_messaging/push_messaging_notification_manager.h',
-    ],
-    # Used on Android when notifications and java_ui are enabled.
-    'chrome_browser_notifications_android_java_ui_sources': [
-      'browser/notifications/notification_permission_infobar_delegate.cc',
-      'browser/notifications/notification_permission_infobar_delegate.h',
-      'browser/notifications/notification_platform_bridge_android.cc',
-      'browser/notifications/notification_platform_bridge_android.h',
-    ],
-    # Used on non-Android platforms when notifications are enabled.
-    'chrome_browser_notifications_non_android_sources': [
-      'browser/notifications/application_notifier_source.cc',
-      'browser/notifications/application_notifier_source.h',
-      'browser/notifications/arc_application_notifier_source_chromeos.cc',
-      'browser/notifications/arc_application_notifier_source_chromeos.h',
-      'browser/notifications/extension_welcome_notification.cc',
-      'browser/notifications/extension_welcome_notification.h',
-      'browser/notifications/extension_welcome_notification_factory.cc',
-      'browser/notifications/extension_welcome_notification_factory.h',
-      'browser/notifications/fullscreen_notification_blocker.cc',
-      'browser/notifications/fullscreen_notification_blocker.h',
-      'browser/notifications/google_now_notification_stats_collector.cc',
-      'browser/notifications/google_now_notification_stats_collector.h',
-      'browser/notifications/message_center_notification_manager.cc',
-      'browser/notifications/message_center_notification_manager.h',
-      'browser/notifications/message_center_settings_controller.cc',
-      'browser/notifications/message_center_settings_controller.h',
-      'browser/notifications/message_center_stats_collector.cc',
-      'browser/notifications/message_center_stats_collector.h',
-      'browser/notifications/notification_conversion_helper.cc',
-      'browser/notifications/notification_conversion_helper.h',
-      'browser/notifications/notification_system_observer.cc',
-      'browser/notifications/notification_system_observer.h',
-      'browser/notifications/notification_ui_manager_desktop.cc',
-      'browser/notifications/notifier_source.h',
-      'browser/notifications/profile_notification.cc',
-      'browser/notifications/profile_notification.h',
-      'browser/notifications/screen_lock_notification_blocker.cc',
-      'browser/notifications/screen_lock_notification_blocker.h',
-      'browser/notifications/system_component_notifier_source_chromeos.cc',
-      'browser/notifications/system_component_notifier_source_chromeos.h',
-      'browser/notifications/web_page_notifier_source.cc',
-      'browser/notifications/web_page_notifier_source.h',
-    ],
-    'chrome_browser_nss_sources': [
-      'browser/certificate_manager_model.cc',
-      'browser/certificate_manager_model.h',
-      'browser/net/nss_context.cc',
-      'browser/net/nss_context.h',
-      'browser/net/nss_context_chromeos.cc',
-      'browser/net/nss_context_linux.cc',
-    ],
-    # Permissions sources used when android_java_ui is enabled.
-    'chrome_browser_permissions_android_java_ui_sources': [
-      'browser/permissions/grouped_permission_infobar_delegate.cc',
-      'browser/permissions/grouped_permission_infobar_delegate.h',
-      'browser/permissions/permission_update_infobar_delegate_android.cc',
-      'browser/permissions/permission_update_infobar_delegate_android.h',
-    ],
-    # See also the plugin_installation_sources list below.
-    'chrome_browser_plugins_sources': [
-      'browser/browsing_data/browsing_data_flash_lso_helper.cc',
-      'browser/browsing_data/browsing_data_flash_lso_helper.h',
-      'browser/component_updater/pepper_flash_component_installer.cc',
-      'browser/component_updater/pepper_flash_component_installer.h',
-      'browser/metrics/plugin_metrics_provider.cc',
-      'browser/metrics/plugin_metrics_provider.h',
-      'browser/pepper_broker_infobar_delegate.cc',
-      'browser/pepper_broker_infobar_delegate.h',
-      'browser/pepper_flash_settings_manager.cc',
-      'browser/pepper_flash_settings_manager.h',
-      'browser/plugins/chrome_content_browser_client_plugins_part.cc',
-      'browser/plugins/chrome_content_browser_client_plugins_part.h',
-      'browser/plugins/chrome_plugin_service_filter.cc',
-      'browser/plugins/chrome_plugin_service_filter.h',
-      'browser/plugins/plugin_data_remover_helper.cc',
-      'browser/plugins/plugin_data_remover_helper.h',
-      'browser/plugins/plugin_filter_utils.cc',
-      'browser/plugins/plugin_filter_utils.h',
-      'browser/plugins/plugin_finder.cc',
-      'browser/plugins/plugin_finder.h',
-      'browser/plugins/plugin_info_message_filter.cc',
-      'browser/plugins/plugin_info_message_filter.h',
-      'browser/plugins/plugin_infobar_delegates.cc',
-      'browser/plugins/plugin_infobar_delegates.h',
-      'browser/plugins/plugin_metadata.cc',
-      'browser/plugins/plugin_metadata.h',
-      'browser/plugins/plugin_observer.cc',
-      'browser/plugins/plugin_observer.h',
-      'browser/plugins/plugin_prefs.cc',
-      'browser/plugins/plugin_prefs.h',
-      'browser/plugins/plugin_prefs_factory.cc',
-      'browser/plugins/plugin_prefs_factory.h',
-      'browser/plugins/plugin_status_pref_setter.cc',
-      'browser/plugins/plugin_status_pref_setter.h',
-      'browser/plugins/plugins_field_trial.cc',
-      'browser/plugins/plugins_field_trial.h',
-      'browser/renderer_host/pepper/chrome_browser_pepper_host_factory.cc',
-      'browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h',
-      'browser/renderer_host/pepper/device_id_fetcher.cc',
-      'browser/renderer_host/pepper/device_id_fetcher.h',
-      'browser/renderer_host/pepper/monitor_finder_mac.h',
-      'browser/renderer_host/pepper/monitor_finder_mac.mm',
-      'browser/renderer_host/pepper/pepper_broker_message_filter.cc',
-      'browser/renderer_host/pepper/pepper_broker_message_filter.h',
-      'browser/renderer_host/pepper/pepper_flash_browser_host.cc',
-      'browser/renderer_host/pepper/pepper_flash_browser_host.h',
-      'browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.cc',
-      'browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.h',
-      'browser/renderer_host/pepper/pepper_flash_drm_host.cc',
-      'browser/renderer_host/pepper/pepper_flash_drm_host.h',
-      'browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.cc',
-      'browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h',
-      'browser/renderer_host/pepper/pepper_output_protection_message_filter.cc',
-      'browser/renderer_host/pepper/pepper_output_protection_message_filter.h',
-    ],
-    'chrome_browser_plugin_installation_sources': [
-      'browser/plugins/plugin_installer.cc',
-      'browser/plugins/plugin_installer.h',
-      'browser/plugins/plugin_installer_observer.cc',
-      'browser/plugins/plugin_installer_observer.h',
-      'browser/plugins/plugins_resource_service.cc',
-      'browser/plugins/plugins_resource_service.h',
-    ],
-    # Applies to all platforms but ChromeOS.
-    'chrome_browser_non_chromeos_sources': [
-      'browser/policy/cloud/user_cloud_policy_manager_factory.cc',
-      'browser/policy/cloud/user_cloud_policy_manager_factory.h',
-      'browser/policy/cloud/user_policy_signin_service_base.cc',
-      'browser/policy/cloud/user_policy_signin_service_base.h',
-      'browser/policy/cloud/user_policy_signin_service_factory.cc',
-      'browser/policy/cloud/user_policy_signin_service_factory.h',
-    ],
-    # Used both when (enable_basic_printing==1 or enable_print_preview==1).
-    'chrome_browser_printing_basic_sources': [
-      'browser/printing/print_job.cc',
-      'browser/printing/print_job.h',
-      'browser/printing/print_job_manager.cc',
-      'browser/printing/print_job_manager.h',
-      'browser/printing/print_job_worker.cc',
-      'browser/printing/print_job_worker.h',
-      'browser/printing/print_job_worker_owner.cc',
-      'browser/printing/print_job_worker_owner.h',
-      'browser/printing/print_view_manager_base.cc',
-      'browser/printing/print_view_manager_base.h',
-      'browser/printing/print_view_manager_common.cc',
-      'browser/printing/print_view_manager_common.h',
-      'browser/printing/printer_query.cc',
-      'browser/printing/printer_query.h',
-      'browser/printing/printing_message_filter.cc',
-      'browser/printing/printing_message_filter.h',
-    ],
-    # Used only in (enable_basic_printing==1 and enable_print_preview==0) mode.
-    'chrome_browser_printing_basic_only_sources': [
-      'browser/printing/print_view_manager_basic.cc',
-      'browser/printing/print_view_manager_basic.h',
-    ],
-    'chrome_browser_printing_emf_sources': [
-      'browser/printing/pdf_to_emf_converter.cc',
-      'browser/printing/pdf_to_emf_converter.h',
-    ],
-    # Used on top of the "basic" sources when enable_print_preview==1.
-    'chrome_browser_printing_full_sources': [
-      'browser/printing/background_printing_manager.cc',
-      'browser/printing/background_printing_manager.h',
-      'browser/printing/cloud_print/cloud_print_proxy_service.cc',
-      'browser/printing/cloud_print/cloud_print_proxy_service.h',
-      'browser/printing/cloud_print/cloud_print_proxy_service_factory.cc',
-      'browser/printing/cloud_print/cloud_print_proxy_service_factory.h',
-      'browser/printing/print_dialog_cloud.cc',
-      'browser/printing/print_dialog_cloud.h',
-      'browser/printing/print_dialog_cloud_posix.cc',
-      'browser/printing/print_dialog_cloud_win.cc',
-      'browser/printing/print_error_dialog.cc',
-      'browser/printing/print_error_dialog.h',
-      'browser/printing/print_preview_context_menu_observer.cc',
-      'browser/printing/print_preview_context_menu_observer.h',
-      'browser/printing/print_preview_data_service.cc',
-      'browser/printing/print_preview_data_service.h',
-      'browser/printing/print_preview_dialog_controller.cc',
-      'browser/printing/print_preview_dialog_controller.h',
-      'browser/printing/print_preview_message_handler.cc',
-      'browser/printing/print_preview_message_handler.h',
-      'browser/printing/print_view_manager.cc',
-      'browser/printing/print_view_manager.h',
-      'browser/printing/printer_manager_dialog.h',
-      'browser/printing/printer_manager_dialog_linux.cc',
-      'browser/printing/printer_manager_dialog_mac.mm',
-      'browser/printing/printer_manager_dialog_win.cc',
-      'browser/printing/pwg_raster_converter.cc',
-      'browser/printing/pwg_raster_converter.h',
-      'browser/service_process/service_process_control.cc',
-      'browser/service_process/service_process_control.h',
-      'browser/service_process/service_process_control_mac.mm',
-    ],
-    'chrome_browser_rlz_sources': [
-      'browser/rlz/chrome_rlz_tracker_delegate.cc',
-      'browser/rlz/chrome_rlz_tracker_delegate.h',
-    ],
-    # "Safe Browsing Basic" files used for safe browsing in full mode
-    # (safe_browsing=1) and mobile (=2)
-    'chrome_browser_safe_browsing_basic_sources': [
-      'browser/renderer_host/data_reduction_proxy_resource_throttle_android.cc',
-      'browser/renderer_host/data_reduction_proxy_resource_throttle_android.h',
-      'browser/safe_browsing/mock_permission_report_sender.cc',
-      'browser/safe_browsing/mock_permission_report_sender.h',
-      'browser/safe_browsing/permission_reporter.cc',
-      'browser/safe_browsing/permission_reporter.h',
-      'browser/safe_browsing/ping_manager.cc',
-      'browser/safe_browsing/ping_manager.h',
-      'browser/safe_browsing/protocol_manager_helper.cc',
-      'browser/safe_browsing/protocol_manager_helper.h',
-      'browser/safe_browsing/safe_browsing_blocking_page.cc',
-      'browser/safe_browsing/safe_browsing_blocking_page.h',
-      'browser/safe_browsing/safe_browsing_service.cc',
-      'browser/safe_browsing/safe_browsing_service.h',
-      'browser/safe_browsing/services_delegate.h',
-      'browser/safe_browsing/test_safe_browsing_service.cc',
-      'browser/safe_browsing/test_safe_browsing_service.h',
-      'browser/safe_browsing/threat_details.cc',
-      'browser/safe_browsing/threat_details.h',
-      'browser/safe_browsing/threat_details_cache.cc',
-      'browser/safe_browsing/threat_details_cache.h',
-      'browser/safe_browsing/threat_details_history.cc',
-      'browser/safe_browsing/threat_details_history.h',
-      'browser/safe_browsing/ui_manager.cc',
-      'browser/safe_browsing/ui_manager.h',
-    ],
-    # "Safe Browsing Mobile" files in addition to the "basic" ones
-    # to use for mobile mode. This has some in common with "full."
-    'chrome_browser_safe_browsing_mobile_sources': [
-      'browser/renderer_host/safe_browsing_resource_throttle.cc',
-      'browser/renderer_host/safe_browsing_resource_throttle.h',
-      'browser/safe_browsing/services_delegate_stub.cc',
-      'browser/safe_browsing/services_delegate_stub.h',
-    ],
-    # "Safe Browsing Full" files in addition to the "basic" ones to use for
-    # full safe browsing. This has some in common with "mobile."
-    'chrome_browser_safe_browsing_full_sources': [
-      'browser/download/download_completion_blocker.cc',
-      'browser/download/download_completion_blocker.h',
-      'browser/renderer_host/safe_browsing_resource_throttle.cc',
-      'browser/renderer_host/safe_browsing_resource_throttle.h',
-      'browser/safe_browsing/browser_feature_extractor.cc',
-      'browser/safe_browsing/browser_feature_extractor.h',
-      'browser/safe_browsing/browser_features.cc',
-      'browser/safe_browsing/browser_features.h',
-      'browser/safe_browsing/chunk_range.cc',
-      'browser/safe_browsing/chunk_range.h',
-      'browser/safe_browsing/client_side_detection_host.cc',
-      'browser/safe_browsing/client_side_detection_host.h',
-      'browser/safe_browsing/client_side_detection_service.cc',
-      'browser/safe_browsing/client_side_detection_service.h',
-      'browser/safe_browsing/client_side_model_loader.cc',
-      'browser/safe_browsing/client_side_model_loader.h',
-      'browser/safe_browsing/download_feedback.cc',
-      'browser/safe_browsing/download_feedback.h',
-      'browser/safe_browsing/download_feedback_service.cc',
-      'browser/safe_browsing/download_feedback_service.h',
-      'browser/safe_browsing/download_protection_service.cc',
-      'browser/safe_browsing/download_protection_service.h',
-      'browser/safe_browsing/incident_reporting/binary_integrity_analyzer.cc',
-      'browser/safe_browsing/incident_reporting/binary_integrity_analyzer.h',
-      'browser/safe_browsing/incident_reporting/binary_integrity_analyzer_mac.cc',
-      'browser/safe_browsing/incident_reporting/binary_integrity_analyzer_win.cc',
-      'browser/safe_browsing/incident_reporting/binary_integrity_incident.cc',
-      'browser/safe_browsing/incident_reporting/binary_integrity_incident.h',
-      'browser/safe_browsing/incident_reporting/blacklist_load_analyzer.cc',
-      'browser/safe_browsing/incident_reporting/blacklist_load_analyzer.h',
-      'browser/safe_browsing/incident_reporting/blacklist_load_analyzer_win.cc',
-      'browser/safe_browsing/incident_reporting/blacklist_load_incident.cc',
-      'browser/safe_browsing/incident_reporting/blacklist_load_incident.h',
-      'browser/safe_browsing/incident_reporting/delayed_analysis_callback.h',
-      'browser/safe_browsing/incident_reporting/delayed_callback_runner.cc',
-      'browser/safe_browsing/incident_reporting/delayed_callback_runner.h',
-      'browser/safe_browsing/incident_reporting/download_metadata_manager.cc',
-      'browser/safe_browsing/incident_reporting/download_metadata_manager.h',
-      'browser/safe_browsing/incident_reporting/environment_data_collection.cc',
-      'browser/safe_browsing/incident_reporting/environment_data_collection.h',
-      'browser/safe_browsing/incident_reporting/environment_data_collection_win.cc',
-      'browser/safe_browsing/incident_reporting/environment_data_collection_win.h',
-      'browser/safe_browsing/incident_reporting/extension_data_collection.cc',
-      'browser/safe_browsing/incident_reporting/extension_data_collection.h',
-      'browser/safe_browsing/incident_reporting/incident.cc',
-      'browser/safe_browsing/incident_reporting/incident.h',
-      'browser/safe_browsing/incident_reporting/incident_handler_util.cc',
-      'browser/safe_browsing/incident_reporting/incident_handler_util.h',
-      'browser/safe_browsing/incident_reporting/incident_receiver.h',
-      'browser/safe_browsing/incident_reporting/incident_report_uploader.cc',
-      'browser/safe_browsing/incident_reporting/incident_report_uploader.h',
-      'browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc',
-      'browser/safe_browsing/incident_reporting/incident_report_uploader_impl.h',
-      'browser/safe_browsing/incident_reporting/incident_reporting_service.cc',
-      'browser/safe_browsing/incident_reporting/incident_reporting_service.h',
-      'browser/safe_browsing/incident_reporting/last_download_finder.cc',
-      'browser/safe_browsing/incident_reporting/last_download_finder.h',
-      'browser/safe_browsing/incident_reporting/module_integrity_verifier_win.cc',
-      'browser/safe_browsing/incident_reporting/module_integrity_verifier_win.h',
-      'browser/safe_browsing/incident_reporting/module_load_analyzer.cc',
-      'browser/safe_browsing/incident_reporting/module_load_analyzer.h',
-      'browser/safe_browsing/incident_reporting/module_load_analyzer_win.cc',
-      'browser/safe_browsing/incident_reporting/platform_state_store.cc',
-      'browser/safe_browsing/incident_reporting/platform_state_store.h',
-      'browser/safe_browsing/incident_reporting/platform_state_store_win.cc',
-      'browser/safe_browsing/incident_reporting/preference_validation_delegate.cc',
-      'browser/safe_browsing/incident_reporting/preference_validation_delegate.h',
-      'browser/safe_browsing/incident_reporting/resource_request_detector.cc',
-      'browser/safe_browsing/incident_reporting/resource_request_detector.h',
-      'browser/safe_browsing/incident_reporting/resource_request_incident.cc',
-      'browser/safe_browsing/incident_reporting/resource_request_incident.h',
-      'browser/safe_browsing/incident_reporting/state_store.cc',
-      'browser/safe_browsing/incident_reporting/state_store.h',
-      'browser/safe_browsing/incident_reporting/suspicious_module_incident.cc',
-      'browser/safe_browsing/incident_reporting/suspicious_module_incident.h',
-      'browser/safe_browsing/incident_reporting/tracked_preference_incident.cc',
-      'browser/safe_browsing/incident_reporting/tracked_preference_incident.h',
-      'browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.cc',
-      'browser/safe_browsing/incident_reporting/variations_seed_signature_analyzer.h',
-      'browser/safe_browsing/incident_reporting/variations_seed_signature_incident.cc',
-      'browser/safe_browsing/incident_reporting/variations_seed_signature_incident.h',
-      'browser/safe_browsing/local_database_manager.cc',
-      'browser/safe_browsing/local_database_manager.h',
-      'browser/safe_browsing/path_sanitizer.cc',
-      'browser/safe_browsing/path_sanitizer.h',
-      'browser/safe_browsing/protocol_manager.cc',
-      'browser/safe_browsing/protocol_manager.h',
-      'browser/safe_browsing/protocol_parser.cc',
-      'browser/safe_browsing/protocol_parser.h',
-      'browser/safe_browsing/safe_browsing_database.cc',
-      'browser/safe_browsing/safe_browsing_database.h',
-      'browser/safe_browsing/safe_browsing_store.cc',
-      'browser/safe_browsing/safe_browsing_store.h',
-      'browser/safe_browsing/safe_browsing_store_file.cc',
-      'browser/safe_browsing/safe_browsing_store_file.h',
-      'browser/safe_browsing/safe_browsing_util.cc',
-      'browser/safe_browsing/safe_browsing_util.h',
-      'browser/safe_browsing/sandboxed_dmg_analyzer_mac.cc',
-      'browser/safe_browsing/sandboxed_dmg_analyzer_mac.h',
-      'browser/safe_browsing/sandboxed_zip_analyzer.cc',
-      'browser/safe_browsing/sandboxed_zip_analyzer.h',
-      'browser/safe_browsing/services_delegate_impl.cc',
-      'browser/safe_browsing/services_delegate_impl.h',
-      'browser/safe_browsing/signature_evaluator_mac.h',
-      'browser/safe_browsing/signature_evaluator_mac.mm',
-      'browser/safe_browsing/two_phase_uploader.cc',
-      'browser/safe_browsing/two_phase_uploader.h',
-    ],
-    # Search sources used when android_java_ui is enabled.
-    'chrome_browser_search_engines_android_java_ui_sources': [
-      'browser/search_engines/template_url_service_android.cc',
-      'browser/search_engines/template_url_service_android.h',
-    ],
-    'chrome_browser_service_discovery_sources': [
-      'browser/local_discovery/endpoint_resolver.cc',
-      'browser/local_discovery/endpoint_resolver.h',
-      'browser/local_discovery/service_discovery_client.cc',
-      'browser/local_discovery/service_discovery_client.h',
-      'browser/local_discovery/service_discovery_client_mac.h',
-      'browser/local_discovery/service_discovery_client_mac.mm',
-      'browser/local_discovery/service_discovery_client_mac_factory.h',
-      'browser/local_discovery/service_discovery_client_mac_factory.mm',
-      'browser/local_discovery/service_discovery_device_lister.cc',
-      'browser/local_discovery/service_discovery_device_lister.h',
-      'browser/local_discovery/service_discovery_shared_client.cc',
-      'browser/local_discovery/service_discovery_shared_client.h',
-      'browser/printing/cloud_print/cloud_print_printer_list.cc',
-      'browser/printing/cloud_print/cloud_print_printer_list.h',
-      'browser/printing/cloud_print/device_description.cc',
-      'browser/printing/cloud_print/device_description.h',
-      'browser/printing/cloud_print/gcd_api_flow.cc',
-      'browser/printing/cloud_print/gcd_api_flow.h',
-      'browser/printing/cloud_print/gcd_api_flow_impl.cc',
-      'browser/printing/cloud_print/gcd_api_flow_impl.h',
-      'browser/printing/cloud_print/gcd_constants.cc',
-      'browser/printing/cloud_print/gcd_constants.h',
-      'browser/printing/cloud_print/privet_confirm_api_flow.cc',
-      'browser/printing/cloud_print/privet_confirm_api_flow.h',
-      'browser/printing/cloud_print/privet_constants.cc',
-      'browser/printing/cloud_print/privet_constants.h',
-      'browser/printing/cloud_print/privet_device_lister.cc',
-      'browser/printing/cloud_print/privet_device_lister.h',
-      'browser/printing/cloud_print/privet_device_lister_impl.cc',
-      'browser/printing/cloud_print/privet_device_lister_impl.h',
-      'browser/printing/cloud_print/privet_http.cc',
-      'browser/printing/cloud_print/privet_http.h',
-      'browser/printing/cloud_print/privet_http_asynchronous_factory.cc',
-      'browser/printing/cloud_print/privet_http_asynchronous_factory.h',
-      'browser/printing/cloud_print/privet_http_asynchronous_factory_impl.cc',
-      'browser/printing/cloud_print/privet_http_asynchronous_factory_impl.h',
-      'browser/printing/cloud_print/privet_http_impl.cc',
-      'browser/printing/cloud_print/privet_http_impl.h',
-      'browser/printing/cloud_print/privet_local_printer_lister.cc',
-      'browser/printing/cloud_print/privet_local_printer_lister.h',
-      'browser/printing/cloud_print/privet_notifications.cc',
-      'browser/printing/cloud_print/privet_notifications.h',
-      'browser/printing/cloud_print/privet_notifications_factory.cc',
-      'browser/printing/cloud_print/privet_notifications_factory.h',
-      'browser/printing/cloud_print/privet_url_fetcher.cc',
-      'browser/printing/cloud_print/privet_url_fetcher.h',
-    ],
-    'chrome_browser_session_service_sources': [
-      'browser/sessions/session_restore.cc',
-      'browser/sessions/session_restore.h',
-      'browser/sessions/session_restore_delegate.cc',
-      'browser/sessions/session_restore_delegate.h',
-      'browser/sessions/session_restore_stats_collector.cc',
-      'browser/sessions/session_restore_stats_collector.h',
-      'browser/sessions/session_service.cc',
-      'browser/sessions/session_service.h',
-      'browser/sessions/session_service_factory.cc',
-      'browser/sessions/session_service_factory.h',
-      'browser/sessions/session_service_utils.cc',
-      'browser/sessions/session_service_utils.h',
-      'browser/sessions/tab_loader.cc',
-      'browser/sessions/tab_loader.h',
-      'browser/sessions/tab_loader_delegate.cc',
-      'browser/sessions/tab_loader_delegate.h',
-    ],
-    'chrome_browser_spellchecker_sources': [
-      'browser/spellchecker/spellcheck_custom_dictionary.cc',
-      'browser/spellchecker/spellcheck_custom_dictionary.h',
-      'browser/spellchecker/spellcheck_dictionary.h',
-      'browser/spellchecker/spellcheck_factory.cc',
-      'browser/spellchecker/spellcheck_factory.h',
-      'browser/spellchecker/spellcheck_hunspell_dictionary.cc',
-      'browser/spellchecker/spellcheck_hunspell_dictionary.h',
-      'browser/spellchecker/spellcheck_message_filter.cc',
-      'browser/spellchecker/spellcheck_message_filter.h',
-      'browser/spellchecker/spellcheck_message_filter_platform_mac.cc',
-      'browser/spellchecker/spellcheck_service.cc',
-      'browser/spellchecker/spellcheck_service.h',
-    ],
-    # SSL sources used when android_java_ui is enabled.
-    'chrome_browser_ssl_android_java_ui_sources': [
-      'browser/ssl/security_state_model_android.cc',
-      'browser/ssl/security_state_model_android.h',
-    ],
-    'chrome_browser_supervised_user_sources': [
-      'browser/content_settings/content_settings_supervised_provider.cc',
-      'browser/content_settings/content_settings_supervised_provider.h',
-      'browser/supervised_user/child_accounts/child_account_service.cc',
-      'browser/supervised_user/child_accounts/child_account_service.h',
-      'browser/supervised_user/child_accounts/child_account_service_factory.cc',
-      'browser/supervised_user/child_accounts/child_account_service_factory.h',
-      'browser/supervised_user/child_accounts/family_info_fetcher.cc',
-      'browser/supervised_user/child_accounts/family_info_fetcher.h',
-      'browser/supervised_user/child_accounts/permission_request_creator_apiary.cc',
-      'browser/supervised_user/child_accounts/permission_request_creator_apiary.h',
-      'browser/supervised_user/experimental/safe_search_url_reporter.cc',
-      'browser/supervised_user/experimental/safe_search_url_reporter.h',
-      'browser/supervised_user/experimental/supervised_user_async_url_checker.cc',
-      'browser/supervised_user/experimental/supervised_user_async_url_checker.h',
-      'browser/supervised_user/experimental/supervised_user_blacklist.cc',
-      'browser/supervised_user/experimental/supervised_user_blacklist.h',
-      'browser/supervised_user/experimental/supervised_user_filtering_switches.cc',
-      'browser/supervised_user/experimental/supervised_user_filtering_switches.h',
-      'browser/supervised_user/permission_request_creator.h',
-      'browser/supervised_user/supervised_user_bookmarks_handler.cc',
-      'browser/supervised_user/supervised_user_bookmarks_handler.h',
-      'browser/supervised_user/supervised_user_constants.cc',
-      'browser/supervised_user/supervised_user_constants.h',
-      'browser/supervised_user/supervised_user_content_provider_android.cc',
-      'browser/supervised_user/supervised_user_content_provider_android.h',
-      'browser/supervised_user/supervised_user_features.cc',
-      'browser/supervised_user/supervised_user_features.h',
-      'browser/supervised_user/supervised_user_interstitial.cc',
-      'browser/supervised_user/supervised_user_interstitial.h',
-      'browser/supervised_user/supervised_user_navigation_observer.cc',
-      'browser/supervised_user/supervised_user_navigation_observer.h',
-      'browser/supervised_user/supervised_user_pref_store.cc',
-      'browser/supervised_user/supervised_user_pref_store.h',
-      'browser/supervised_user/supervised_user_resource_throttle.cc',
-      'browser/supervised_user/supervised_user_resource_throttle.h',
-      'browser/supervised_user/supervised_user_service.cc',
-      'browser/supervised_user/supervised_user_service.h',
-      'browser/supervised_user/supervised_user_service_factory.cc',
-      'browser/supervised_user/supervised_user_service_factory.h',
-      'browser/supervised_user/supervised_user_service_observer.h',
-      'browser/supervised_user/supervised_user_settings_service.cc',
-      'browser/supervised_user/supervised_user_settings_service.h',
-      'browser/supervised_user/supervised_user_settings_service_factory.cc',
-      'browser/supervised_user/supervised_user_settings_service_factory.h',
-      'browser/supervised_user/supervised_user_site_list.cc',
-      'browser/supervised_user/supervised_user_site_list.h',
-      'browser/supervised_user/supervised_user_sync_data_type_controller.cc',
-      'browser/supervised_user/supervised_user_sync_data_type_controller.h',
-      'browser/supervised_user/supervised_user_url_filter.cc',
-      'browser/supervised_user/supervised_user_url_filter.h',
-      'browser/supervised_user/supervised_user_whitelist_service.cc',
-      'browser/supervised_user/supervised_user_whitelist_service.h',
-      'browser/supervised_user/supervised_users.h',
-    ],
-    # Child accounts sources used with android_java_ui enabled.
-    'chrome_browser_supervised_user_android_java_ui_sources': [
-      'browser/supervised_user/child_accounts/child_account_feedback_reporter_android.cc',
-      'browser/supervised_user/child_accounts/child_account_feedback_reporter_android.h',
-      'browser/supervised_user/child_accounts/child_account_service_android.cc',
-      'browser/supervised_user/child_accounts/child_account_service_android.h',
-    ],
-    # TODO(bauerb): This code should be removed (on desktop) once child account
-    # support has launched (https://crbug.com/505443).
-    'chrome_browser_supervised_user_legacy_sources': [
-      'browser/supervised_user/legacy/custodian_profile_downloader_service.cc',
-      'browser/supervised_user/legacy/custodian_profile_downloader_service.h',
-      'browser/supervised_user/legacy/custodian_profile_downloader_service_factory.cc',
-      'browser/supervised_user/legacy/custodian_profile_downloader_service_factory.h',
-      'browser/supervised_user/legacy/permission_request_creator_sync.cc',
-      'browser/supervised_user/legacy/permission_request_creator_sync.h',
-      'browser/supervised_user/legacy/supervised_user_pref_mapping_service.cc',
-      'browser/supervised_user/legacy/supervised_user_pref_mapping_service.h',
-      'browser/supervised_user/legacy/supervised_user_pref_mapping_service_factory.cc',
-      'browser/supervised_user/legacy/supervised_user_pref_mapping_service_factory.h',
-      'browser/supervised_user/legacy/supervised_user_refresh_token_fetcher.cc',
-      'browser/supervised_user/legacy/supervised_user_refresh_token_fetcher.h',
-      'browser/supervised_user/legacy/supervised_user_registration_utility.cc',
-      'browser/supervised_user/legacy/supervised_user_registration_utility.h',
-      'browser/supervised_user/legacy/supervised_user_registration_utility_stub.cc',
-      'browser/supervised_user/legacy/supervised_user_registration_utility_stub.h',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_service.cc',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_service.h',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_service_factory.cc',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_service_factory.h',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_update.cc',
-      'browser/supervised_user/legacy/supervised_user_shared_settings_update.h',
-      'browser/supervised_user/legacy/supervised_user_sync_service.cc',
-      'browser/supervised_user/legacy/supervised_user_sync_service.h',
-      'browser/supervised_user/legacy/supervised_user_sync_service_factory.cc',
-      'browser/supervised_user/legacy/supervised_user_sync_service_factory.h',
-      'browser/supervised_user/legacy/supervised_user_sync_service_observer.h',
-    ],
-    'chrome_browser_supervised_user_and_themes_sources': [
-      'browser/supervised_user/supervised_user_theme.cc',
-      'browser/supervised_user/supervised_user_theme.h',
-    ],
-    'chrome_browser_sync_sources': [
-    ],
-    # Sync sources used when android_java_ui is enabled.
-    'chrome_browser_sync_android_java_ui_sources': [
-      'browser/sync/glue/synced_tab_delegate_android.cc',
-      'browser/sync/glue/synced_tab_delegate_android.h',
-      'browser/sync/glue/synced_window_delegate_android.cc',
-      'browser/sync/glue/synced_window_delegate_android.h',
-      'browser/sync/glue/synced_window_delegates_getter_android.cc',
-      'browser/sync/glue/synced_window_delegates_getter_android.h',
-      'browser/sync/profile_sync_service_android.cc',
-      'browser/sync/profile_sync_service_android.h',
-      'browser/sync/sync_sessions_metrics_android.cc',
-      'browser/sync/sync_sessions_metrics_android.h',
-    ],
-    'chrome_browser_task_manager_sources': [
-      'browser/task_manager/providers/browser_process_task.cc',
-      'browser/task_manager/providers/browser_process_task.h',
-      'browser/task_manager/providers/browser_process_task_provider.cc',
-      'browser/task_manager/providers/browser_process_task_provider.h',
-      'browser/task_manager/providers/child_process_task.cc',
-      'browser/task_manager/providers/child_process_task.h',
-      'browser/task_manager/providers/child_process_task_provider.cc',
-      'browser/task_manager/providers/child_process_task_provider.h',
-      'browser/task_manager/providers/task.cc',
-      'browser/task_manager/providers/task.h',
-      'browser/task_manager/providers/task_provider.cc',
-      'browser/task_manager/providers/task_provider.h',
-      'browser/task_manager/providers/task_provider_observer.h',
-      'browser/task_manager/providers/web_contents/background_contents_tag.cc',
-      'browser/task_manager/providers/web_contents/background_contents_tag.h',
-      'browser/task_manager/providers/web_contents/background_contents_task.cc',
-      'browser/task_manager/providers/web_contents/background_contents_task.h',
-      'browser/task_manager/providers/web_contents/devtools_tag.cc',
-      'browser/task_manager/providers/web_contents/devtools_tag.h',
-      'browser/task_manager/providers/web_contents/devtools_task.cc',
-      'browser/task_manager/providers/web_contents/devtools_task.h',
-      'browser/task_manager/providers/web_contents/extension_tag.cc',
-      'browser/task_manager/providers/web_contents/extension_tag.h',
-      'browser/task_manager/providers/web_contents/extension_task.cc',
-      'browser/task_manager/providers/web_contents/extension_task.h',
-      'browser/task_manager/providers/web_contents/guest_tag.cc',
-      'browser/task_manager/providers/web_contents/guest_tag.h',
-      'browser/task_manager/providers/web_contents/guest_task.cc',
-      'browser/task_manager/providers/web_contents/guest_task.h',
-      'browser/task_manager/providers/web_contents/prerender_tag.cc',
-      'browser/task_manager/providers/web_contents/prerender_tag.h',
-      'browser/task_manager/providers/web_contents/prerender_task.cc',
-      'browser/task_manager/providers/web_contents/prerender_task.h',
-      'browser/task_manager/providers/web_contents/printing_tag.cc',
-      'browser/task_manager/providers/web_contents/printing_tag.h',
-      'browser/task_manager/providers/web_contents/printing_task.cc',
-      'browser/task_manager/providers/web_contents/printing_task.h',
-      'browser/task_manager/providers/web_contents/renderer_task.cc',
-      'browser/task_manager/providers/web_contents/renderer_task.h',
-      'browser/task_manager/providers/web_contents/subframe_task.cc',
-      'browser/task_manager/providers/web_contents/subframe_task.h',
-      'browser/task_manager/providers/web_contents/tab_contents_tag.cc',
-      'browser/task_manager/providers/web_contents/tab_contents_tag.h',
-      'browser/task_manager/providers/web_contents/tab_contents_task.cc',
-      'browser/task_manager/providers/web_contents/tab_contents_task.h',
-      'browser/task_manager/providers/web_contents/web_contents_tag.cc',
-      'browser/task_manager/providers/web_contents/web_contents_tag.h',
-      'browser/task_manager/providers/web_contents/web_contents_tags_manager.cc',
-      'browser/task_manager/providers/web_contents/web_contents_tags_manager.h',
-      'browser/task_manager/providers/web_contents/web_contents_task_provider.cc',
-      'browser/task_manager/providers/web_contents/web_contents_task_provider.h',
-      'browser/task_manager/sampling/shared_sampler.h',
-      'browser/task_manager/sampling/shared_sampler_posix.cc',
-      'browser/task_manager/sampling/shared_sampler_win.cc',
-      'browser/task_manager/sampling/task_group.cc',
-      'browser/task_manager/sampling/task_group.h',
-      'browser/task_manager/sampling/task_group_sampler.cc',
-      'browser/task_manager/sampling/task_group_sampler.h',
-      'browser/task_manager/sampling/task_manager_impl.cc',
-      'browser/task_manager/sampling/task_manager_impl.h',
-      'browser/task_manager/sampling/task_manager_io_thread_helper.cc',
-      'browser/task_manager/sampling/task_manager_io_thread_helper.h',
-      'browser/task_manager/task_manager_interface.cc',
-      'browser/task_manager/task_manager_interface.h',
-      'browser/task_manager/task_manager_observer.cc',
-      'browser/task_manager/task_manager_observer.h',
-    ],
-    'chrome_browser_task_manager_chromeos_sources': [
-      'browser/task_manager/providers/arc/arc_process_task.cc',
-      'browser/task_manager/providers/arc/arc_process_task.h',
-      'browser/task_manager/providers/arc/arc_process_task_provider.cc',
-      'browser/task_manager/providers/arc/arc_process_task_provider.h',
-    ],
-    'chrome_browser_themes_sources': [
-      'browser/sync/glue/theme_data_type_controller.cc',
-      'browser/sync/glue/theme_data_type_controller.h',
-      'browser/themes/browser_theme_pack.cc',
-      'browser/themes/browser_theme_pack.h',
-      'browser/themes/custom_theme_supplier.cc',
-      'browser/themes/custom_theme_supplier.h',
-      'browser/themes/theme_properties.cc',
-      'browser/themes/theme_properties.h',
-      'browser/themes/theme_service.cc',
-      'browser/themes/theme_service.h',
-      'browser/themes/theme_service_factory.cc',
-      'browser/themes/theme_service_factory.h',
-      'browser/themes/theme_service_mac.mm',
-      'browser/themes/theme_syncable_service.cc',
-      'browser/themes/theme_syncable_service.h',
-    ],
-    'chrome_browser_webrtc_sources': [
-      # TODO(brettw) should webrtc_log_list.cc go here?
-      'browser/media/audio_debug_recordings_handler.cc',
-      'browser/media/audio_debug_recordings_handler.h',
-      'browser/media/webrtc_event_log_handler.cc',
-      'browser/media/webrtc_event_log_handler.h',
-      'browser/media/webrtc_log_uploader.cc',
-      'browser/media/webrtc_log_uploader.h',
-      'browser/media/webrtc_log_util.cc',
-      'browser/media/webrtc_log_util.h',
-      'browser/media/webrtc_logging_handler_host.cc',
-      'browser/media/webrtc_logging_handler_host.h',
-      'browser/media/webrtc_rtp_dump_handler.cc',
-      'browser/media/webrtc_rtp_dump_handler.h',
-      'browser/media/webrtc_rtp_dump_writer.cc',
-      'browser/media/webrtc_rtp_dump_writer.h',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'browser',
-      'type': 'static_library',
-      'variables': { 'enable_wexit_time_destructors': 1, },
-      'dependencies': [
-        # NOTE: New dependencies should generally be added in the OS!="ios"
-        # dependencies block below, rather than here.
-        'browser_ui',
-        'chrome_features.gyp:chrome_common_features',
-        'chrome_resources.gyp:chrome_extra_resources',
-        'chrome_resources.gyp:chrome_resources',
-        'chrome_resources.gyp:chrome_strings',
-        'chrome_resources.gyp:chrome_ui_string_overrider_factory',
-        'chrome_resources.gyp:make_chrome_ui_string_overrider_factory',
-        'chrome_resources.gyp:platform_locale_settings',
-        'chrome_resources.gyp:theme_resources',
-        'common',
-        'probe_message_proto',
-        '../components/components.gyp:autofill_core_browser',
-        '../components/components.gyp:bookmarks_browser',
-        '../components/components.gyp:bookmarks_managed',
-        '../components/components.gyp:browser_sync_browser',
-        '../components/components.gyp:browser_sync_common',
-        '../components/components.gyp:browsing_data_core',
-        '../components/components.gyp:captive_portal',
-        '../components/components.gyp:cloud_devices_common',
-        '../components/components.gyp:cloud_policy_proto',
-        '../components/components.gyp:component_metrics_proto',
-        '../components/components.gyp:component_updater',
-        '../components/components.gyp:content_settings_content_common',
-        '../components/components.gyp:content_settings_core_browser',
-        '../components/components.gyp:content_settings_core_common',
-        '../components/components.gyp:crx_file',
-        '../components/components.gyp:data_reduction_proxy_core_browser',
-        '../components/components.gyp:data_usage_core',
-        '../components/components.gyp:data_use_measurement_core',
-        '../components/components.gyp:favicon_base',
-        '../components/components.gyp:favicon_core',
-        '../components/components.gyp:gcm_driver',
-        '../components/components.gyp:google_core_browser',
-        '../components/components.gyp:handoff',
-        '../components/components.gyp:history_core_browser',
-        '../components/components.gyp:history_core_common',
-        '../components/components.gyp:infobars_core',
-        '../components/components.gyp:instance_id',
-        '../components/components.gyp:invalidation_impl',
-        '../components/components.gyp:metrics',
-        '../components/components.gyp:metrics_net',
-        '../components/components.gyp:metrics_services_manager',
-        '../components/components.gyp:metrics_ui',
-        '../components/components.gyp:navigation_metrics',
-        '../components/components.gyp:network_time',
-        '../components/components.gyp:offline_pages',
-        '../components/components.gyp:omnibox_browser',
-        '../components/components.gyp:os_crypt',
-        '../components/components.gyp:password_manager_core_browser',
-        '../components/components.gyp:password_manager_core_common',
-        '../components/components.gyp:policy',
-        '../components/components.gyp:policy_component',
-        '../components/components.gyp:proxy_config',
-        '../components/components.gyp:query_parser',
-        '../components/components.gyp:rappor',
-        '../components/components.gyp:search',
-        '../components/components.gyp:search_engines',
-        '../components/components.gyp:search_provider_logos',
-        '../components/components.gyp:security_interstitials_core',
-        '../components/components.gyp:security_state',
-        '../components/components.gyp:ssl_errors',
-        '../components/components.gyp:suggestions',
-        '../components/components.gyp:signin_core_browser',
-        '../components/components.gyp:startup_metric_utils_browser',
-        '../components/components.gyp:startup_metric_utils_browser_host',
-        '../components/components.gyp:subresource_filter_content_browser',
-        '../components/components.gyp:subresource_filter_core_browser',
-        '../components/components.gyp:supervised_user_error_page',
-        '../components/components.gyp:sync_bookmarks',
-        '../components/components.gyp:sync_sessions',
-        '../components/components.gyp:translate_core_browser',
-        '../components/components.gyp:translate_core_common',
-        '../components/components.gyp:update_client',
-        '../components/components.gyp:undo_component',
-        '../components/components.gyp:user_prefs',
-        '../components/components_strings.gyp:components_strings',
-        # This depends directly on the variations target, rather than just
-        # transitively via the common target because the proto sources need to
-        # be generated before code in this target can start building.
-        '../components/components.gyp:variations',
-        '../components/components.gyp:variations_net',
-        '../components/components.gyp:variations_service',
-        '../components/components.gyp:webdata_common',
-        '../components/components.gyp:webdata_services',
-        '../components/mime_util/mime_util.gyp:mime_util',
-        '../components/tracing.gyp:tracing',
-        '../components/url_formatter/url_formatter.gyp:url_formatter',
-        '../content/content.gyp:content_browser',
-        '../content/content.gyp:content_common',
-        '../courgette/courgette.gyp:courgette_lib',
-        '../crypto/crypto.gyp:crypto',
-        '../google_apis/google_apis.gyp:google_apis',
-        '../skia/skia.gyp:skia',
-        '../sql/sql.gyp:sql',
-        '../components/sync.gyp:sync',
-        '../third_party/boringssl/boringssl.gyp:boringssl',
-        '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation',
-        '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_proto_cpp',
-        '../third_party/icu/icu.gyp:icui18n',
-        '../third_party/icu/icu.gyp:icuuc',
-        '../third_party/libxml/libxml.gyp:libxml',
-        '../third_party/widevine/cdm/widevine_cdm.gyp:widevine_cdm_version_h',
-        '../third_party/zlib/google/zip.gyp:compression_utils',
-        '../third_party/zlib/google/zip.gyp:zip',
-        '../third_party/zlib/zlib.gyp:minizip',
-        '../third_party/zlib/zlib.gyp:zlib',
-        '../ui/base/ui_base.gyp:ui_base',
-        '../ui/base/ui_base.gyp:ui_data_pack',
-        '../ui/events/events.gyp:events_base',
-        '../ui/gfx/gfx.gyp:gfx',
-        '../ui/gfx/gfx.gyp:gfx_geometry',
-        '../ui/gfx/gfx.gyp:gfx_range',
-        '../ui/message_center/message_center.gyp:message_center',
-        '../ui/resources/ui_resources.gyp:ui_resources',
-        '../ui/shell_dialogs/shell_dialogs.gyp:shell_dialogs',
-        '../ui/strings/ui_strings.gyp:ui_strings',
-      ],
-      'include_dirs': [
-        '..',
-        '<(INTERMEDIATE_DIR)',
-        # Needed by chrome_content_renderer_client.cc. &
-        # plugin_info_message_filter.cc.
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'export_dependent_settings': [
-        '../components/components.gyp:autofill_core_browser',
-        '../content/content.gyp:content_browser',
-        '../sql/sql.gyp:sql',
-        '../components/sync.gyp:sync',
-      ],
-      # sources applied to all configurations
-      'sources': [
-        '<@(chrome_browser_undo_sources)',
-      ],
-      'includes': [
-        # Disable LTO due to ELF section name out of range
-        # crbug.com/422251
-        '../build/android/disable_gcc_lto.gypi',
-      ],
-      'conditions': [
-        ['OS != "ios"', {
-          'dependencies': [
-	    'budget_proto',
-            'common_mojo_bindings',
-            'common_net',
-            'debugger',
-            'installer_util',
-            '../cc/cc.gyp:cc',
-            '../components/components.gyp:about_handler',
-            '../components/components.gyp:autofill_content_browser',
-            '../components/components.gyp:browsing_data_content',
-            '../components/components.gyp:certificate_reporting',
-            '../components/components.gyp:certificate_transparency',
-            '../components/components.gyp:contextual_search_browser',
-            '../components/components.gyp:cookie_config',
-            '../components/components.gyp:data_reduction_proxy_content_browser',
-            '../components/components.gyp:data_use_measurement_content',
-            '../components/components.gyp:devtools_http_handler',
-            '../components/components.gyp:dom_distiller_content_browser',
-            '../components/components.gyp:domain_reliability',
-            '../components/components.gyp:error_page_common',
-            '../components/components.gyp:favicon_content',
-            '../components/components.gyp:flags_ui',
-            '../components/components.gyp:guest_view_browser',
-            '../components/components.gyp:history_content_browser',
-            '../components/components.gyp:image_fetcher',
-            '../components/components.gyp:keyed_service_content',
-            '../components/components.gyp:metrics_gpu',
-            '../components/components.gyp:metrics_profiler',
-            '../components/components.gyp:metrics_profiler_content',
-            '../components/components.gyp:navigation_interception',
-            '../components/components.gyp:net_log',
-            '../components/components.gyp:network_hints_common',
-            '../components/components.gyp:network_session_configurator',
-            '../components/components.gyp:ntp_snippets',
-            '../components/components.gyp:ntp_tiles',
-            '../components/components.gyp:packed_ct_ev_whitelist',
-            '../components/components.gyp:password_manager_content_browser',
-            '../components/components.gyp:password_manager_sync_browser',
-            '../components/components.gyp:power',
-            '../components/components.gyp:previews',
-            '../components/components.gyp:profile_metrics',
-            '../components/components.gyp:proxy_config',
-            '../components/components.gyp:renderer_context_menu',
-            '../components/components.gyp:safe_browsing_db',
-            '../components/components.gyp:safe_json',
-            '../components/components.gyp:security_state',
-            '../components/components.gyp:sessions_content',
-            '../components/components.gyp:ssl_config',
-            '../components/components.gyp:storage_monitor',
-            '../components/components.gyp:subresource_filter_content_browser',
-            '../components/components.gyp:syncable_prefs',
-            '../components/components.gyp:translate_content_browser',
-            '../components/components.gyp:upload_list',
-            '../components/components.gyp:url_matcher',
-            '../components/components.gyp:user_prefs_tracked',
-            '../components/components.gyp:visitedlink_browser',
-            '../components/components.gyp:visitedlink_common',
-            '../components/components.gyp:wallpaper',
-            '../components/components.gyp:web_cache_browser',
-            '../components/components.gyp:web_resource',
-            '../components/components_resources.gyp:components_resources',
-            '../content/app/resources/content_resources.gyp:content_resources',
-            '../content/content.gyp:common_features',
-            '../content/content.gyp:feature_h264_with_openh264_ffmpeg',
-            '../device/core/core.gyp:device_core',
-            '../device/usb/usb.gyp:device_usb',
-            '../device/usb/usb.gyp:device_usb_mojo_bindings',
-            '../gpu/gpu.gyp:gpu',
-            '../media/media.gyp:media',
-            '../media/midi/midi.gyp:midi',
-            '../media/mojo/interfaces/mojo_bindings.gyp:platform_verification_api',
-            '../mojo/mojo_base.gyp:mojo_common_lib',
-            '../mojo/mojo_edk.gyp:mojo_system_impl',
-            '../mojo/mojo_public.gyp:mojo_cpp_bindings',
-            '../mojo/mojo_public.gyp:mojo_js_bindings',
-            '../net/net.gyp:net_extras',
-            '../net/net.gyp:net_with_v8',
-            '../services/shell/shell_public.gyp:shell_public',
-            '../storage/storage_browser.gyp:storage',
-            '../storage/storage_common.gyp:storage_common',
-            '../third_party/leveldatabase/leveldatabase.gyp:leveldatabase',
-            '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput',
-            '../third_party/libyuv/libyuv.gyp:libyuv',
-            '../third_party/re2/re2.gyp:re2',
-            '../third_party/smhasher/smhasher.gyp:cityhash',
-            '../third_party/webrtc/modules/modules.gyp:desktop_capture',
-            '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
-            '../ui/gl/gl.gyp:gl',
-            '../ui/surface/surface.gyp:surface',
-            '../ui/web_dialogs/web_dialogs.gyp:web_dialogs',
-            '../v8/src/v8.gyp:v8',
-          ],
-          'sources': [
-            '<@(chrome_browser_non_ios_sources)',
-            '<@(chrome_browser_autocomplete_sources)',
-            '<@(chrome_browser_bookmark_sources)',
-            '<@(chrome_browser_browser_process_sources)',
-            '<@(chrome_browser_content_settings_sources)',
-            '<@(chrome_browser_data_usage_sources)',
-            '<@(chrome_browser_engagement_sources)',
-            '<@(chrome_browser_favicon_sources)',
-            '<@(chrome_browser_google_sources)',
-            '<@(chrome_browser_history_sources)',
-            '<@(chrome_browser_metrics_sources)',
-            '<@(chrome_browser_net_sources)',
-            '<@(chrome_browser_password_manager_sources)',
-            '<@(chrome_browser_permissions_sources)',
-            '<@(chrome_browser_predictor_sources)',
-            '<@(chrome_browser_pref_sources)',
-            '<@(chrome_browser_profiles_sources)',
-            '<@(chrome_browser_search_engines_sources)',
-            '<@(chrome_browser_services_sources)',
-            '<@(chrome_browser_session_sources)',
-            '<@(chrome_browser_signin_sources)',
-            '<@(chrome_browser_ssl_sources)',
-            '<@(chrome_browser_sync_sources)',
-
-            # These files are generated by GRIT.
-            '<(SHARED_INTERMEDIATE_DIR)/components/grit/components_scaled_resources_map.cc',
-            '<(SHARED_INTERMEDIATE_DIR)/ui/resources/grit/ui_resources_map.cc',
-            '<(grit_out_dir)/grit/component_extension_resources_map.cc',
-            '<(grit_out_dir)/grit/policy_resources_map.cc',
-            '<(grit_out_dir)/grit/settings_resources_map.cc',
-            '<(grit_out_dir)/grit/theme_resources_map.cc',
-          ],
-          'conditions': [
-            ['toolkit_views==1', {
-              'dependencies': [
-                '../ui/gfx/gfx.gyp:gfx_vector_icons',
-                '../ui/views/views.gyp:views'
-              ],
-            }],
-            ['use_x11==1', {
-              'dependencies': [
-                '../ui/base/x/ui_base_x.gyp:ui_base_x',
-              ],
-            }],
-          ],
-        }, {  # OS == "ios"
-          'dependencies': [
-            '../net/net.gyp:net',
-          ],
-          # A few sources had been brought up for iOS before the decision not to
-          # use chrome/ for iOS long-term. Keep building them to prevent iOS
-          # regressions until they have been componentized.
-          'sources': [
-            '<@(chrome_browser_ios_sources)',
-            '<@(chrome_browser_google_sources)',
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/CoreImage.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreTelephony.framework',
-              '$(SDKROOT)/System/Library/Frameworks/CoreText.framework',
-              '$(SDKROOT)/System/Library/Frameworks/MobileCoreServices.framework',
-              '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
-            ],
-          },
-        }],
-        ['OS=="win" or OS=="mac"', {
-          'sources': [
-            '<@(chrome_browser_win_mac_sources)',
-          ],
-        }],
-        ['OS!="win" and OS!="mac" and OS!="ios"', {
-          'sources': [
-            'browser/net/net_error_diagnostics_dialog_generic.cc',
-          ],
-        }],
-        ['OS!="android" and OS!="ios" and chromeos==0', {
-          'sources': [
-            'browser/net/disk_cache_dir_policy_handler.cc',
-            'browser/net/disk_cache_dir_policy_handler.h',
-          ],
-        }],
-        ['OS=="mac"', {
-          'dependencies': [
-            'app_shim',
-            'browser_app_shim',
-          ],
-          'sources': [ '<@(chrome_browser_mac_sources)' ]
-        }],
-        ['chromeos==1', {
-          'sources!': [
-            'browser/signin/chrome_signin_status_metrics_provider_delegate.cc',
-            'browser/signin/chrome_signin_status_metrics_provider_delegate.h',
-          ],
-        }, {  # Non-ChromeOS
-          'sources': [ '<@(chrome_browser_non_chromeos_sources)' ],
-        }],
-        ['enable_extensions==1', {
-          'dependencies': [
-            'browser_extensions',
-            'browser/extensions/api/api_registration.gyp:chrome_api_registration',
-            'common/extensions/api/api.gyp:chrome_api',
-            'sync_file_system_drive_proto',
-            '../components/components.gyp:cryptauth',
-            '../components/components.gyp:drive',
-            '../gpu/gpu.gyp:gpu',
-            '../media/cast/cast.gyp:cast_net',
-          ],
-          'sources': [ '<@(chrome_browser_extensions_sources)' ],
-        }],
-        ['enable_background==1', {
-          'sources': [ '<@(chrome_browser_background_sources)' ],
-          'conditions': [
-            ['use_aura==0 or OS=="win"', {
-              'sources!': [
-                'browser/background/background_mode_manager_aura.cc',
-              ],
-            }],
-          ],
-        }],
-        ['enable_task_manager==1', {
-          'sources': [ '<@(chrome_browser_task_manager_sources)' ],
-          'dependencies': [ '../gpu/gpu.gyp:gpu' ],
-          'conditions': [
-            ['chromeos==1', {
-              'sources': [ '<@(chrome_browser_task_manager_chromeos_sources)' ],
-            }],
-          ],
-        }],
-        ['enable_media_router==1', {
-          'dependencies': [
-            'browser/media/router/media_router.gyp:media_router',
-          ],
-        }],
-        ['branding!="Chrome"', {
-          'sources': [
-            'browser/search/local_files_ntp_source.cc',
-            'browser/search/local_files_ntp_source.h',
-          ],
-        }],
-        ['enable_spellcheck==1', {
-          'sources': [ '<@(chrome_browser_spellchecker_sources)' ],
-          'conditions': [
-            ['OS!="android"', {
-              'dependencies': [
-                '../third_party/hunspell/hunspell.gyp:hunspell',
-              ],
-            }],
-          ],
-        }],
-        ['disable_nacl==0', {
-          'sources': [ '<@(chrome_browser_nacl_sources)' ],
-          'dependencies': [
-            '../components/nacl.gyp:nacl_browser',
-          ],
-        }],
-        ['debug_devtools==1', {
-          'defines': [
-            'DEBUG_DEVTOOLS=1',
-          ],
-        }],
-        ['enable_plugins==1', {
-          'dependencies': [
-            '../components/components.gyp:pdf_browser',
-            '../ppapi/ppapi_internal.gyp:ppapi_ipc',
-            '../third_party/adobe/flash/flash_player.gyp:flapper_version_h',
-          ],
-          'sources': [ '<@(chrome_browser_plugins_sources)' ],
-        }],
-        ['safe_browsing != 0 and OS != "ios"', {
-          'sources': [ '<@(chrome_browser_safe_browsing_basic_sources)' ],
-          'dependencies': [
-            'safe_browsing_chunk_proto',
-            'safe_browsing_proto',
-            '../components/components.gyp:safe_browsing_db',
-            '../components/components.gyp:safe_browsing_metadata_proto',
-          ],
-          'conditions': [
-            ['safe_browsing == 1', {
-              'sources': [ '<@(chrome_browser_safe_browsing_full_sources)' ],
-              'dependencies': [
-                'safe_browsing_proto',
-              ],
-              'conditions': [
-                ['OS=="win"', {
-                  'dependencies': [
-                    'incident_reporting_state_store_data_proto',
-                  ],
-                }],
-              ],
-            }],
-            ['safe_browsing == 2', {
-              'sources': [ '<@(chrome_browser_safe_browsing_mobile_sources)' ],
-              'dependencies': [
-                'safe_browsing_proto',
-                '../components/components.gyp:safe_browsing_db_mobile',
-              ],
-            }],
-          ],
-        }],
-        ['use_udev == 1', {
-          'dependencies': [
-            '../device/udev_linux/udev.gyp:udev_linux',
-          ],
-        }],
-        ['OS=="linux"', {
-          'dependencies': [
-            '../device/media_transfer_protocol/media_transfer_protocol.gyp:mtp_file_entry_proto',
-            '../device/media_transfer_protocol/media_transfer_protocol.gyp:mtp_storage_info_proto',
-            '../device/media_transfer_protocol/media_transfer_protocol.gyp:device_media_transfer_protocol',
-          ],
-        }],
-        ['OS=="linux" and chromeos==0', {
-          'dependencies': [
-            '../build/linux/system.gyp:libspeechd',
-          ],
-        }],
-        ['chromeos==1', {
-          'sources': [
-            '<@(chrome_browser_chromeos_sources)',
-
-            # This file is generated by GRIT.
-            '<(SHARED_INTERMEDIATE_DIR)/ui/chromeos/resources/grit/ui_chromeos_resources_map.cc',
-          ],
-          'dependencies': [
-            'browser_chromeos',
-            '../components/components.gyp:user_manager',
-            '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_resources',
-          ],
-        }],
-        ['chromeos==1', {
-          'sources': [
-            'browser/metrics/leak_detector/leak_detector_controller.cc',
-            'browser/metrics/leak_detector/leak_detector_controller.h',
-            'browser/metrics/leak_detector/leak_detector_remote_controller.cc',
-            'browser/metrics/leak_detector/leak_detector_remote_controller.h',
-          ],
-          'dependencies': [
-            '../components/components.gyp:metrics_leak_detector',
-            '../components/components.gyp:metrics_mojo_bindings',
-          ],
-        }],
-        ['use_cups==1', {
-          'dependencies': [
-            '../printing/printing.gyp:cups',
-          ],
-        }],
-        ['use_gnome_keyring==1', {
-          'sources': [ '<@(chrome_browser_gnome_keyring_sources)' ],
-          'dependencies': [
-            '../build/linux/system.gyp:gnome_keyring',
-          ],
-        }],
-        ['OS=="linux" and chromeos!=1', {
-          'sources': [ '<@(chrome_browser_libsecret_sources)' ],
-          'defines': [
-            'USE_LIBSECRET',
-          ],
-          'include_dirs' : [
-            '../third_party/libsecret/'
-          ],
-        }],
-        ['use_aura==1', {
-          'sources': [ '<@(chrome_browser_aura_sources)' ],
-          'dependencies': [
-            '../ui/aura/aura.gyp:aura',
-            '../ui/compositor/compositor.gyp:compositor',
-            '../ui/keyboard/keyboard.gyp:keyboard',
-            '../ui/keyboard/keyboard.gyp:keyboard_with_content',
-          ],
-        }],
-        ['ui_compositor_image_transport==1', {
-          'dependencies': [
-            '../ui/gl/gl.gyp:gl',
-          ],
-        }],
-        ['use_ash==1', {
-          'sources': [ '<@(chrome_browser_ash_sources)' ],
-        }],
-        ['use_x11==1', {
-          'sources': [ '<@(chrome_browser_x11_sources)' ],
-        }],
-        ['os_posix == 1 and OS != "mac" and OS != "ios"', {
-          'sources': [
-            'app/chrome_crash_reporter_client.cc',
-            'app/chrome_crash_reporter_client.h',
-          ],
-          'dependencies': [
-            '../components/components.gyp:breakpad_host',
-            '../components/components.gyp:crash_component',
-            '../components/components.gyp:generate_version_info',
-          ],
-        }],
-        ['use_nss_certs==1', {
-          'sources': [ '<@(chrome_browser_nss_sources)' ],
-          'conditions': [
-            ['chromeos==1', {
-               'sources!': [ 'browser/net/nss_context_linux.cc' ],
-              }, { # chromeos==0
-               'sources!': [ 'browser/net/nss_context_chromeos.cc' ],
-              }],
-          ],
-        }],
-        ['notifications==1', {
-          'sources': [ '<@(chrome_browser_notifications_sources)' ],
-          'conditions': [
-            ['android_java_ui==0', {
-              'sources': [
-                '<@(chrome_browser_notifications_non_android_sources)',
-              ],
-            }, {
-              'sources': [
-                '<@(chrome_browser_notifications_android_java_ui_sources)',
-              ],
-            }],
-            ['OS=="mac"', {
-              'dependencies' : [
-                'browser/ui/cocoa/notifications/notification_common.gyp:notification_common',
-              ],
-            }],
-          ],
-        }],
-        ['enable_themes==1', {
-          'sources': [ '<@(chrome_browser_themes_sources)' ],
-        }],
-        # Some form of printing support.
-        ['enable_basic_printing==1 or enable_print_preview==1', {
-          'dependencies': [
-            '../printing/printing.gyp:printing',
-          ],
-          'sources': [ '<@(chrome_browser_printing_basic_sources)' ],
-          'conditions': [
-            ['OS=="win"', {
-              'sources': [ '<@(chrome_browser_printing_emf_sources)' ],
-            }],
-          ],
-        }],
-        # Full printing on top of the above.
-        ['enable_print_preview==1', {
-          'sources': [ '<@(chrome_browser_printing_full_sources)' ],
-        }],
-        # Partial-only printing support.
-        ['enable_basic_printing==1 and enable_print_preview==0', {
-          'sources': [ '<@(chrome_browser_printing_basic_only_sources)' ],
-        }],
-        ['enable_captive_portal_detection==1', {
-          'sources': [ '<@(chrome_browser_captive_portal_sources)' ]
-        }],
-        ['enable_session_service==1', {
-          'sources': [ '<@(chrome_browser_session_service_sources)' ],
-        }],
-        ['enable_hotwording==1', {
-          'defines': [ 'ENABLE_HOTWORDING' ],
-        }],
-        ['OS!="android" and OS!="ios" and chromeos==0', {
-          'sources': [ '<@(chrome_browser_desktop_sources)' ],
-        }],
-        ['OS=="android" or OS=="ios"', {
-          'sources': [ '<@(chrome_browser_mobile_sources)' ],
-        }, {  # OS!="android" and OS!="ios" (non-Mobile).
-          'sources': [ '<@(chrome_browser_non_mobile_sources)' ],
-          'dependencies': [
-            'apps',
-            'policy_path_parser',
-            'profile_reset_report_proto',
-            '../components/components.gyp:feedback_component',
-            '../components/components.gyp:web_modal',
-            '../net/net.gyp:net_browser_services',
-          ]
-        }],
-        ['OS=="android"', {
-          'dependencies': [
-            '../build/android/ndk.gyp:cpu_features',
-            '../components/components.gyp:cdm_browser',
-            '../components/components_resources.gyp:components_resources',
-            '../third_party/android_opengl/etc1/etc1.gyp:etc1',
-            '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput_util',
-          ],
-          'dependencies!': [
-            '../components/components.gyp:storage_monitor',
-            '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput',
-          ],
-          'sources': [
-            '<@(chrome_browser_android_sources)',
-           ],
-          'conditions': [
-            ['android_java_ui==1', {
-              'dependencies': [
-                '../components/components.gyp:browsing_data_ui',
-                '../components/components.gyp:data_usage_android',
-                '../components/components.gyp:offline_pages',
-                '../components/components.gyp:precache_content',
-                '../components/components.gyp:precache_core',
-                '../components/components.gyp:security_state',
-                '../components/components.gyp:toolbar',
-                '../components/components.gyp:web_contents_delegate_android',
-                'chrome_browser_jni_headers',
-                'client_discourse_context_proto',
-                'delta_file_proto',
-              ],
-              'sources': [
-                '<@(chrome_browser_android_java_ui_sources)',
-                '<@(chrome_browser_offline_pages_sources)',
-                '<@(chrome_browser_sync_android_java_ui_sources)',
-                '<@(chrome_browser_supervised_user_android_java_ui_sources)',
-                '<@(chrome_browser_ssl_android_java_ui_sources)',
-                '<@(chrome_browser_search_engines_android_java_ui_sources)',
-                '<@(chrome_browser_permissions_android_java_ui_sources)',
-                '<@(chrome_browser_history_android_java_ui_sources)',
-               ],
-            }],
-            ['use_seccomp_bpf==1', {
-              'defines': ['USE_SECCOMP_BPF'],
-              'dependencies': [
-                '../sandbox/sandbox.gyp:seccomp_bpf',
-              ],
-            }],
-          ],
-        }],
-        ['OS=="mac"', {
-          'dependencies': [
-            '../third_party/google_toolbox_for_mac/google_toolbox_for_mac.gyp:google_toolbox_for_mac',
-            '../third_party/mozilla/mozilla.gyp:mozilla',
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/Accelerate.framework',
-              '$(SDKROOT)/System/Library/Frameworks/AddressBook.framework',
-              '$(SDKROOT)/System/Library/Frameworks/AudioUnit.framework',
-              '$(SDKROOT)/System/Library/Frameworks/DiskArbitration.framework',
-              '$(SDKROOT)/System/Library/Frameworks/IOKit.framework',
-              '$(SDKROOT)/System/Library/Frameworks/ImageCaptureCore.framework',
-              '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework',
-              '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
-              '$(SDKROOT)/System/Library/Frameworks/SecurityInterface.framework',
-            ],
-          },
-        }],
-        ['enable_rlz==1', {
-          'dependencies': [
-            'browser_rlz',
-          ],
-        }],
-        # Temporary fix to break the browser target into smaller chunks so it
-        # will link with goma builds.
-        ['OS=="win" and chromium_win_pch==0', {
-          'msvs_shard': 4,
-        }],
-        ['OS=="win"', {
-          'sources': [ '<@(chrome_browser_win_sources)' ],
-          'include_dirs': [
-            '<(DEPTH)/third_party/wtl/include',
-          ],
-          'dependencies': [
-            'chrome_process_finder',
-            'chrome_watcher_client',
-            'file_pre_reader',
-            'installer_util_strings',
-            'metrics_constants_util_win',
-            '../chrome/common_constants.gyp:version_header',
-            '../chrome_elf/chrome_elf.gyp:blacklist',
-            '../chrome_elf/chrome_elf.gyp:chrome_elf_constants',
-            '../chrome_elf/chrome_elf.gyp:dll_hash',
-            '../components/components.gyp:browser_watcher',
-            '../components/components.gyp:browser_watcher_client',
-            # TODO(fdoray): Remove this once the PreRead field trial has
-            # expired. crbug.com/577698
-            '../components/components.gyp:startup_metric_utils_win',
-            '../google_update/google_update.gyp:google_update',
-            '../third_party/iaccessible2/iaccessible2.gyp:iaccessible2',
-            '../third_party/isimpledom/isimpledom.gyp:isimpledom',
-            '../third_party/kasko/kasko.gyp:kasko',
-            '../ui/views/controls/webview/webview.gyp:webview',
-            '../ui/views/views.gyp:views',
-          ],
-          'export_dependent_settings': [
-            '../third_party/kasko/kasko.gyp:kasko',
-            '../ui/views/controls/webview/webview.gyp:webview',
-            '../ui/views/views.gyp:views',
-          ],
-          'conditions': [
-            ['branding!="Chrome"', {
-              'dependencies!': [
-                '../google_update/google_update.gyp:google_update',
-              ],
-              'sources!': [
-                'browser/google/did_run_updater_win.cc',
-                'browser/google/did_run_updater_win.h',
-                'browser/google/google_update_win.cc',
-                'browser/google/google_update_win.h',
-              ],
-            }],
-          ],
-          'msvs_settings': {
-            'VCLinkerTool': {
-              'DelayLoadDLLs': [
-                # Used by browser/net/net_error_diagnostics_dialog_win.h
-                'ndfapi.dll',
-                # Used by browser/private_working_set_snapshot.h
-                'pdh.dll',
-              ],
-              'AdditionalDependencies': [
-                'cryptui.lib',
-                'dwmapi.lib',
-                'ndfapi.lib',
-                'pdh.lib',
-                'wtsapi32.lib',
-              ],
-            },
-          },
-          'all_dependent_settings': {
-            'msvs_settings': {
-              'VCLinkerTool': {
-                'DelayLoadDLLs': [
-                  'ndfapi.dll',
-                  'pdh.dll',  # The task manager is rarely used.
-                ],
-                'AdditionalDependencies': [
-                  'cryptui.lib',
-                  'dwmapi.lib',
-                  'ndfapi.lib',
-                  'netapi32.lib',
-                  'pdh.lib',
-                  'wtsapi32.lib',
-                ],
-              },
-            },
-          },
-        }, {  # 'OS!="win"
-          'sources': [ '<@(chrome_browser_non_win_sources)' ],
-          'conditions': [
-            ['use_aura==1', {
-              'dependencies': [
-                '../ui/views/controls/webview/webview.gyp:webview',
-                '../ui/views/views.gyp:views',
-              ],
-              'include_dirs': [
-                '<(INTERMEDIATE_DIR)',
-                '<(INTERMEDIATE_DIR)/chrome',
-              ],
-            }],
-          ],
-        }],
-        ['OS=="linux"', {
-          'conditions': [
-            ['use_aura==1', {
-              'dependencies': [
-                '../build/linux/system.gyp:dbus',
-                '../build/linux/system.gyp:fontconfig',
-                '../dbus/dbus.gyp:dbus',
-              ],
-            }],
-            # x11 build
-            ['use_x11==1', {
-              'dependencies': [
-                '../build/linux/system.gyp:x11',
-                '../ui/events/devices/events_devices.gyp:events_devices',
-                '../ui/gfx/x/gfx_x11.gyp:gfx_x11',
-              ],
-            }],
-          ],
-        }],
-        ['OS=="linux" or OS=="win"', {
-            'sources': [ '<@(chrome_browser_non_mac_desktop_sources)' ],
-        }],
-        ['desktop_linux==1', {
-          'sources': [ '<@(chrome_browser_linux_desktop_sources)' ],
-        }],
-        ['enable_plugin_installation==1', {
-          'sources': [ '<@(chrome_browser_plugin_installation_sources)' ],
-        }],
-        ['enable_app_list==1', {
-          'dependencies': [
-            '../ui/app_list/app_list.gyp:app_list',
-          ]
-        }],
-        ['enable_supervised_users==1', {
-          'sources': [ '<@(chrome_browser_supervised_user_sources)' ],
-        }],
-        ['enable_supervised_users==1 and OS!="android" and OS!="ios"', {
-          'sources': [ '<@(chrome_browser_supervised_user_legacy_sources)' ],
-        }],
-        ['enable_supervised_users==1 and enable_themes==1', {
-          'sources': [ '<@(chrome_browser_supervised_user_and_themes_sources)' ],
-        }],
-        ['enable_webrtc==1', {
-          'sources': [ '<@(chrome_browser_webrtc_sources)' ]
-        }],
-        ['enable_service_discovery==1', {
-          'sources': [ '<@(chrome_browser_service_discovery_sources)' ]
-        }],
-        ['enable_mdns==1', {
-          'sources' : [ '<@(chrome_browser_mdns_sources)' ]
-        }],
-        ['OS=="android" or OS=="ios"', {
-          'sources!': [
-            'browser/autofill/validation_rules_storage_factory.cc',
-            'browser/autofill/validation_rules_storage_factory.h',
-          ],
-        }],
-        [ 'enable_basic_printing==1 or enable_print_preview==1', {
-          'dependencies': [
-            '../components/components.gyp:printing_browser',
-          ]
-        }],
-        ['enable_wayland_server==1', {
-          'sources': [
-            'browser/chrome_browser_main_extra_parts_exo.cc',
-            'browser/chrome_browser_main_extra_parts_exo.h',
-          ],
-          'dependencies': [
-            '../components/components.gyp:exo',
-            '../components/components.gyp:exo_wayland',
-          ],
-        }],
-      ],
-    },
-    {
-      # Protobuf compiler / generator for Probe Message.
-      # GN version: //chrome/browser/net:probe_message_proto
-      'target_name': 'probe_message_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/net/probe_message.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/net',
-        'proto_out_dir': 'chrome/browser/net',
-      },
-      'includes': [ '../build/protoc.gypi' ]
-    },
-    {
-      # Protobuf compiler / generator for the safebrowsing chunk
-      # protocol buffer.
-      # GN version: //chrome/browser/safe_browsing:chunk_proto
-      'target_name': 'safe_browsing_chunk_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/safe_browsing/chunk.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/safe_browsing',
-        'proto_out_dir': 'chrome/browser/safe_browsing',
-      },
-      'includes': [ '../build/protoc.gypi' ]
-    },
-    {
-      # Protobuf compiler / generator for the safebrowsing incident reporting
-      # service state store data protocol buffer.
-      # GN version: //chrome/browser/safe_browsing/incident_reporting:state_store_data_proto
-      'target_name': 'incident_reporting_state_store_data_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/safe_browsing/incident_reporting/state_store_data.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/safe_browsing/incident_reporting',
-        'proto_out_dir': 'chrome/browser/safe_browsing/incident_reporting',
-      },
-      'includes': [ '../build/protoc.gypi' ],
-    },
-    {
-      # Protobuf compiler / generator for the budget database protocol buffer.
-      # GN version: //chrome/browser/budget_service:budget_proto
-      'target_name': 'budget_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/budget_service/budget.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/budget_service',
-        'proto_out_dir': 'chrome/browser/budget_service',
-      },
-      'includes': [ '../build/protoc.gypi' ]
-    },
-    {
-      # Protobuf compiler / generator for reset reports
-      # protocol buffer.
-      # GN version: //chrome/browser/profile_resetter:profile_reset_report_proto
-      'target_name': 'profile_reset_report_proto',
-      'type': 'static_library',
-      'sources': [ 'browser/profile_resetter/profile_reset_report.proto' ],
-      'variables': {
-        'proto_in_dir': 'browser/profile_resetter',
-        'proto_out_dir': 'chrome/browser/profile_resetter',
-      },
-      'includes': [ '../build/protoc.gypi' ]
-    },
-  ],
-  'conditions': [
-    ['android_java_ui == 1', {
-      'targets': [
-        {
-          # GN: //chrome/browser:jni_headers
-          'target_name': 'chrome_browser_jni_headers',
-          'type': 'none',
-          'sources': [ '<@(chrome_browser_jni_sources)' ],
-          'variables': {
-            'jni_gen_package': 'chrome',
-          },
-          'includes': [ '../build/jni_generator.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'activity_type_ids_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/activity_type_ids.h',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'connectivity_check_result_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/feedback/connectivity_checker.cc',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'most_visited_tile_type_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/ntp/most_visited_sites.cc',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'policy_auditor_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/policy/policy_auditor.cc',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:resource_id_javagen
-          'target_name': 'resource_id_java',
-          'type': 'none',
-          'sources': [
-            'android/java/ResourceId.template',
-          ],
-          'variables': {
-            'package_name': 'org/chromium/chrome/browser',
-            'template_deps': ['browser/android/resource_id.h'],
-          },
-          'includes': [ '../build/android/java_cpp_template.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'profile_account_management_metrics_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/profiles/profile_metrics.h',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'tab_load_status_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/tab_android.h',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'infobar_action_type_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/ui/android/infobars/infobar_android.h',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          # GN: //chrome/android:chrome_android_java_enums_srcjar
-          'target_name': 'shortcut_source_java',
-          'type': 'none',
-          'variables': {
-            'source_file': 'browser/android/shortcut_info.h',
-          },
-          'includes': [ '../build/android/java_cpp_enum.gypi' ],
-        },
-        {
-          #GN: //chrome/browser:client_discourse_context_proto
-          'target_name': 'client_discourse_context_proto',
-          'type': 'static_library',
-          'sources': ['browser/android/proto/client_discourse_context.proto' ],
-          'variables': {
-            'proto_in_dir': 'browser/android/proto',
-            'proto_out_dir': 'chrome/browser/android/proto',
-          },
-          'includes': [ '../build/protoc.gypi', ],
-        },
-        {
-          #GN: //chrome/browser:delta_file_proto
-          'target_name': 'delta_file_proto',
-          'type': 'static_library',
-          'sources': [ 'browser/android/proto/delta_file.proto' ],
-          'variables': {
-            'proto_in_dir': 'browser/android/proto',
-            'proto_out_dir': 'chrome/browser/android/proto',
-          },
-          'includes': [ '../build/protoc.gypi', ],
-        },
-        {
-          # Protobuf compiler / generator for Android's DocumentTabModel
-          # protocol buffer.
-          # GN: //chrome/android: document_tab_model_info_proto_java
-          'target_name': 'document_tab_model_info_proto_java',
-          'type': 'none',
-          'variables': {
-            'proto_in_dir': 'android/java/src/org/chromium/chrome/browser/tabmodel/document',
-          },
-          'sources': [
-            '<(proto_in_dir)/document_tab_model_info.proto',
-          ],
-          'includes': ['../build/protoc_java.gypi'],
-        },
-      ],
-    },],
-    ['enable_extensions==1', {
-      'targets': [
-        {
-          # Protobuf compiler / generator for Sync FileSystem protocol buffer.
-          # GN version: //chrome/browser/sync_file_system/drive_backend:sync_file_system_drive_proto
-          'target_name': 'sync_file_system_drive_proto',
-          'type': 'static_library',
-          'sources': [
-            'browser/sync_file_system/drive_backend/metadata_database.proto',
-          ],
-          'variables': {
-            'proto_in_dir': 'browser/sync_file_system/drive_backend',
-            'proto_out_dir': 'chrome/browser/sync_file_system/drive_backend',
-          },
-          'includes': [ '../build/protoc.gypi' ]
-        },
-      ],
-    },],
-    ['enable_rlz_support==1', {
-      'targets': [
-        {
-          # GN version: // chrome/browser:rlz
-          'target_name': 'browser_rlz',
-          'type': 'static_library',
-          'sources': [
-            '<@(chrome_browser_rlz_sources)',
-          ],
-          'dependencies': [
-            '../components/components.gyp:google_core_browser',
-            '../components/components.gyp:omnibox_browser',
-            '../components/components.gyp:rlz',
-            '../components/components.gyp:search_engines',
-            '../rlz/rlz.gyp:rlz_lib',
-            'common',
-          ],
-        },
-      ],
-    }],
-  ],
-}
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi
deleted file mode 100644
index 025857be..0000000
--- a/chrome/chrome_browser_ui.gypi
+++ /dev/null
@@ -1,3344 +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.
-
-{
-  'variables': {
-    # There are two sections of sources:
-    # * "Platform"-based sources (OS, toolkit, etc.)
-    # * Feature/directory-based sources (e.g., history, printing)
-
-    ### Platform-based sources ###
-    'chrome_browser_ui_non_ios_sources': [
-      'browser/ui/accelerator_utils.h',
-      'browser/ui/android/android_about_app_info.cc',
-      'browser/ui/android/android_about_app_info.h',
-      'browser/ui/android/external_protocol_dialog_android.cc',
-      'browser/ui/android/status_tray_android.cc',
-      'browser/ui/app_list/app_list_util.cc',
-      'browser/ui/app_list/app_list_util.h',
-      # All other browser/ui/app_list files go in chrome_browser_ui_app_list_sources.
-      'browser/ui/autofill/autofill_dialog_models.cc',
-      'browser/ui/autofill/autofill_dialog_models.h',
-      'browser/ui/autofill/autofill_popup_controller.h',
-      'browser/ui/autofill/autofill_popup_controller_impl.cc',
-      'browser/ui/autofill/autofill_popup_controller_impl.h',
-      'browser/ui/autofill/autofill_popup_layout_model.cc',
-      'browser/ui/autofill/autofill_popup_layout_model.h',
-      'browser/ui/autofill/autofill_popup_view.h',
-      'browser/ui/autofill/autofill_popup_view_delegate.h',
-      'browser/ui/autofill/chrome_autofill_client.cc',
-      'browser/ui/autofill/chrome_autofill_client.h',
-      'browser/ui/autofill/country_combobox_model.cc',
-      'browser/ui/autofill/country_combobox_model.h',
-      'browser/ui/autofill/create_card_unmask_prompt_view.h',
-      'browser/ui/autofill/credit_card_scanner_controller.cc',
-      'browser/ui/autofill/credit_card_scanner_controller.h',
-      'browser/ui/autofill/credit_card_scanner_view.cc',
-      'browser/ui/autofill/credit_card_scanner_view.h',
-      'browser/ui/autofill/credit_card_scanner_view_delegate.h',
-      'browser/ui/autofill/password_generation_popup_controller.h',
-      'browser/ui/autofill/password_generation_popup_controller_impl.cc',
-      'browser/ui/autofill/password_generation_popup_controller_impl.h',
-      'browser/ui/autofill/password_generation_popup_observer.h',
-      'browser/ui/autofill/password_generation_popup_view.cc',
-      'browser/ui/autofill/password_generation_popup_view.h',
-      'browser/ui/autofill/popup_controller_common.cc',
-      'browser/ui/autofill/popup_controller_common.h',
-      'browser/ui/autofill/popup_view_common.cc',
-      'browser/ui/autofill/popup_view_common.h',
-      'browser/ui/blocked_content/blocked_window_params.cc',
-      'browser/ui/blocked_content/blocked_window_params.h',
-      'browser/ui/blocked_content/popup_blocker_tab_helper.cc',
-      'browser/ui/blocked_content/popup_blocker_tab_helper.h',
-      'browser/ui/bookmarks/bookmark_bar.h',
-      'browser/ui/bookmarks/bookmark_bar_constants.h',
-      'browser/ui/bookmarks/bookmark_bar_instructions_delegate.h',
-      'browser/ui/bookmarks/bookmark_bubble_observer.h',
-      'browser/ui/bookmarks/bookmark_editor.cc',
-      'browser/ui/bookmarks/bookmark_editor.h',
-      'browser/ui/bookmarks/bookmark_utils.cc',
-      'browser/ui/bookmarks/bookmark_utils.h',
-      'browser/ui/bookmarks/recently_used_folders_combo_model.cc',
-      'browser/ui/bookmarks/recently_used_folders_combo_model.h',
-      'browser/ui/browser_commands_chromeos.cc',
-      'browser/ui/browser_commands_chromeos.h',
-      'browser/ui/browser_commands_mac.cc',
-      'browser/ui/browser_commands_mac.h',
-      'browser/ui/browser_dialogs.h',
-      'browser/ui/browser_mac.cc',
-      'browser/ui/browser_mac.h',
-      'browser/ui/browser_navigator_params.cc',
-      'browser/ui/browser_navigator_params.h',
-      'browser/ui/browser_ui_prefs.cc',
-      'browser/ui/browser_ui_prefs.h',
-      'browser/ui/chrome_select_file_policy.cc',
-      'browser/ui/chrome_select_file_policy.h',
-      'browser/ui/confirm_bubble.h',
-      'browser/ui/crypto_module_password_dialog.h',
-      'browser/ui/find_bar/find_bar.h',
-      'browser/ui/find_bar/find_bar_state.h',
-      'browser/ui/find_bar/find_bar_state_factory.cc',
-      'browser/ui/find_bar/find_bar_state_factory.h',
-      'browser/ui/find_bar/find_notification_details.h',
-      'browser/ui/find_bar/find_tab_helper.cc',
-      'browser/ui/find_bar/find_tab_helper.h',
-      'browser/ui/javascript_dialogs/chrome_javascript_native_dialog_factory.h',
-      'browser/ui/login/login_handler.cc',
-      'browser/ui/login/login_handler.h',
-      'browser/ui/login/login_interstitial_delegate.cc',
-      'browser/ui/login/login_interstitial_delegate.h',
-      'browser/ui/media_utils.cc',
-      'browser/ui/media_utils.h',
-      'browser/ui/navigation_correction_tab_observer.cc',
-      'browser/ui/navigation_correction_tab_observer.h',
-      'browser/ui/passwords/account_avatar_fetcher.cc',
-      'browser/ui/passwords/account_avatar_fetcher.h',
-      'browser/ui/passwords/manage_passwords_state.cc',
-      'browser/ui/passwords/manage_passwords_state.h',
-      'browser/ui/passwords/manage_passwords_view_utils.cc',
-      'browser/ui/passwords/manage_passwords_view_utils.h',
-      'browser/ui/passwords/password_manager_presenter.cc',
-      'browser/ui/passwords/password_manager_presenter.h',
-      'browser/ui/passwords/password_ui_view.h',
-      'browser/ui/platform_keys_certificate_selector_chromeos.h',
-      'browser/ui/prefs/prefs_tab_helper.cc',
-      'browser/ui/prefs/prefs_tab_helper.h',
-      'browser/ui/process_singleton_dialog_linux.h',
-      'browser/ui/profile_chooser_constants.h',
-      'browser/ui/profile_error_dialog.cc',
-      'browser/ui/profile_error_dialog.h',
-      'browser/ui/protocol_dialog_delegate.h',
-      'browser/ui/proximity_auth/proximity_auth_error_bubble.h',
-      'browser/ui/screen_capture_notification_ui.h',
-      'browser/ui/search/instant_search_prerenderer.cc',
-      'browser/ui/search/instant_search_prerenderer.h',
-      'browser/ui/search/instant_tab.cc',
-      'browser/ui/search/instant_tab.h',
-      'browser/ui/search/new_tab_page_interceptor_service.cc',
-      'browser/ui/search/new_tab_page_interceptor_service.h',
-      'browser/ui/search/new_tab_page_interceptor_service_factory.cc',
-      'browser/ui/search/new_tab_page_interceptor_service_factory.h',
-      'browser/ui/search/search_ipc_router.cc',
-      'browser/ui/search/search_ipc_router.h',
-      'browser/ui/search/search_ipc_router_policy_impl.cc',
-      'browser/ui/search/search_ipc_router_policy_impl.h',
-      'browser/ui/search/search_model.cc',
-      'browser/ui/search/search_model.h',
-      'browser/ui/search/search_model_observer.h',
-      'browser/ui/search/search_tab_helper.cc',
-      'browser/ui/search/search_tab_helper.h',
-      'browser/ui/search/search_tab_helper_delegate.cc',
-      'browser/ui/search/search_tab_helper_delegate.h',
-      'browser/ui/search_engines/edit_search_engine_controller.cc',
-      'browser/ui/search_engines/edit_search_engine_controller.h',
-      'browser/ui/search_engines/keyword_editor_controller.cc',
-      'browser/ui/search_engines/keyword_editor_controller.h',
-      'browser/ui/search_engines/search_engine_tab_helper.cc',
-      'browser/ui/search_engines/search_engine_tab_helper.h',
-      'browser/ui/search_engines/template_url_table_model.cc',
-      'browser/ui/search_engines/template_url_table_model.h',
-      'browser/ui/session_crashed_bubble.h',
-      'browser/ui/simple_message_box.h',
-      'browser/ui/simple_message_box_internal.cc',
-      'browser/ui/simple_message_box_internal.h',
-      'browser/ui/status_bubble.h',
-      'browser/ui/sync/bubble_sync_promo_delegate.h',
-      'browser/ui/sync/profile_signin_confirmation_helper.cc',
-      'browser/ui/sync/profile_signin_confirmation_helper.h',
-      'browser/ui/sync/tab_contents_synced_tab_delegate.cc',
-      'browser/ui/sync/tab_contents_synced_tab_delegate.h',
-      'browser/ui/tab_contents/chrome_web_contents_view_delegate.h',
-      'browser/ui/tab_contents/core_tab_helper.cc',
-      'browser/ui/tab_contents/core_tab_helper.h',
-      'browser/ui/tab_contents/core_tab_helper_delegate.cc',
-      'browser/ui/tab_contents/core_tab_helper_delegate.h',
-      'browser/ui/tab_dialogs.cc',
-      'browser/ui/tab_dialogs.h',
-      'browser/ui/tab_helpers.cc',
-      'browser/ui/tab_helpers.h',
-      'browser/ui/tab_modal_confirm_dialog.h',
-      'browser/ui/translate/language_combobox_model.cc',
-      'browser/ui/translate/language_combobox_model.h',
-      'browser/ui/translate/translate_bubble_model.h',
-      'browser/ui/translate/translate_bubble_model_impl.cc',
-      'browser/ui/translate/translate_bubble_model_impl.h',
-      'browser/ui/translate/translate_bubble_view_state_transition.cc',
-      'browser/ui/translate/translate_bubble_view_state_transition.h',
-      'browser/ui/uninstall_browser_prompt.h',
-      'browser/ui/validation_message_bubble.h',
-      'browser/ui/view_ids.h',
-      'browser/ui/views/platform_keys_certificate_selector_chromeos.cc',
-      'browser/ui/views/platform_keys_certificate_selector_chromeos.h',
-      'browser/ui/web_contents_sizer.h',
-      'browser/ui/website_settings/website_settings.cc',
-      'browser/ui/website_settings/website_settings.h',
-      'browser/ui/website_settings/website_settings_ui.cc',
-      'browser/ui/website_settings/website_settings_ui.h',
-      'browser/ui/webui/about_ui.cc',
-      'browser/ui/webui/about_ui.h',
-      'browser/ui/webui/browsing_history_handler.cc',
-      'browser/ui/webui/browsing_history_handler.h',
-      'browser/ui/webui/chrome_web_ui_controller_factory.cc',
-      'browser/ui/webui/chrome_web_ui_controller_factory.h',
-      'browser/ui/webui/chromeos/bluetooth_pairing_ui.cc',
-      'browser/ui/webui/chromeos/bluetooth_pairing_ui.h',
-      'browser/ui/webui/chromeos/certificate_manager_dialog_ui.cc',
-      'browser/ui/webui/chromeos/certificate_manager_dialog_ui.h',
-      'browser/ui/webui/chromeos/choose_mobile_network_ui.cc',
-      'browser/ui/webui/chromeos/choose_mobile_network_ui.h',
-      'browser/ui/webui/chromeos/cryptohome_ui.cc',
-      'browser/ui/webui/chromeos/cryptohome_ui.h',
-      'browser/ui/webui/chromeos/cryptohome_web_ui_handler.cc',
-      'browser/ui/webui/chromeos/cryptohome_web_ui_handler.h',
-      'browser/ui/webui/chromeos/drive_internals_ui.cc',
-      'browser/ui/webui/chromeos/drive_internals_ui.h',
-      'browser/ui/webui/chromeos/first_run/first_run_actor.cc',
-      'browser/ui/webui/chromeos/first_run/first_run_actor.h',
-      'browser/ui/webui/chromeos/first_run/first_run_handler.cc',
-      'browser/ui/webui/chromeos/first_run/first_run_handler.h',
-      'browser/ui/webui/chromeos/first_run/first_run_ui.cc',
-      'browser/ui/webui/chromeos/first_run/first_run_ui.h',
-      'browser/ui/webui/chromeos/image_source.cc',
-      'browser/ui/webui/chromeos/image_source.h',
-      'browser/ui/webui/chromeos/keyboard_overlay_ui.cc',
-      'browser/ui/webui/chromeos/keyboard_overlay_ui.h',
-      'browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/app_launch_splash_screen_handler.h',
-      'browser/ui/webui/chromeos/login/authenticated_user_email_retriever.cc',
-      'browser/ui/webui/chromeos/login/authenticated_user_email_retriever.h',
-      'browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/auto_enrollment_check_screen_handler.h',
-      'browser/ui/webui/chromeos/login/base_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/base_screen_handler.h',
-      'browser/ui/webui/chromeos/login/controller_pairing_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/controller_pairing_screen_handler.h',
-      'browser/ui/webui/chromeos/login/core_oobe_handler.cc',
-      'browser/ui/webui/chromeos/login/core_oobe_handler.h',
-      'browser/ui/webui/chromeos/login/demo_mode_detector.cc',
-      'browser/ui/webui/chromeos/login/demo_mode_detector.h',
-      'browser/ui/webui/chromeos/login/device_disabled_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/device_disabled_screen_handler.h',
-      'browser/ui/webui/chromeos/login/enable_debugging_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/enable_debugging_screen_handler.h',
-      'browser/ui/webui/chromeos/login/enrollment_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/enrollment_screen_handler.h',
-      'browser/ui/webui/chromeos/login/error_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/error_screen_handler.h',
-      'browser/ui/webui/chromeos/login/eula_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/eula_screen_handler.h',
-      'browser/ui/webui/chromeos/login/gaia_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/gaia_screen_handler.h',
-      'browser/ui/webui/chromeos/login/hid_detection_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/hid_detection_screen_handler.h',
-      'browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/host_pairing_screen_handler.h',
-      'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc',
-      'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h',
-      'browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h',
-      'browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/kiosk_enable_screen_handler.h',
-      'browser/ui/webui/chromeos/login/l10n_util.cc',
-      'browser/ui/webui/chromeos/login/l10n_util.h',
-      'browser/ui/webui/chromeos/login/network_dropdown.cc',
-      'browser/ui/webui/chromeos/login/network_dropdown.h',
-      'browser/ui/webui/chromeos/login/network_dropdown_handler.cc',
-      'browser/ui/webui/chromeos/login/network_dropdown_handler.h',
-      'browser/ui/webui/chromeos/login/network_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/network_screen_handler.h',
-      'browser/ui/webui/chromeos/login/network_state_informer.cc',
-      'browser/ui/webui/chromeos/login/network_state_informer.h',
-      'browser/ui/webui/chromeos/login/oobe_screen.cc',
-      'browser/ui/webui/chromeos/login/oobe_screen.h',
-      'browser/ui/webui/chromeos/login/oobe_ui.cc',
-      'browser/ui/webui/chromeos/login/oobe_ui.h',
-      'browser/ui/webui/chromeos/login/reset_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/reset_screen_handler.h',
-      'browser/ui/webui/chromeos/login/screenlock_icon_provider.cc',
-      'browser/ui/webui/chromeos/login/screenlock_icon_provider.h',
-      'browser/ui/webui/chromeos/login/screenlock_icon_source.cc',
-      'browser/ui/webui/chromeos/login/screenlock_icon_source.h',
-      'browser/ui/webui/chromeos/login/signin_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/signin_screen_handler.h',
-      'browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/supervised_user_creation_screen_handler.h',
-      'browser/ui/webui/chromeos/login/terms_of_service_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h',
-      'browser/ui/webui/chromeos/login/update_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/update_screen_handler.h',
-      'browser/ui/webui/chromeos/login/user_board_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/user_board_screen_handler.h',
-      'browser/ui/webui/chromeos/login/user_image_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/user_image_screen_handler.h',
-      'browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.cc',
-      'browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h',
-      'browser/ui/webui/chromeos/mobile_setup_dialog.cc',
-      'browser/ui/webui/chromeos/mobile_setup_dialog.h',
-      'browser/ui/webui/chromeos/mobile_setup_ui.cc',
-      'browser/ui/webui/chromeos/mobile_setup_ui.h',
-      'browser/ui/webui/chromeos/network_ui.cc',
-      'browser/ui/webui/chromeos/network_ui.h',
-      'browser/ui/webui/chromeos/power_ui.cc',
-      'browser/ui/webui/chromeos/power_ui.h',
-      'browser/ui/webui/chromeos/proxy_settings_ui.cc',
-      'browser/ui/webui/chromeos/proxy_settings_ui.h',
-      'browser/ui/webui/chromeos/set_time_ui.cc',
-      'browser/ui/webui/chromeos/set_time_ui.h',
-      'browser/ui/webui/chromeos/sim_unlock_ui.cc',
-      'browser/ui/webui/chromeos/sim_unlock_ui.h',
-      'browser/ui/webui/chromeos/slow_trace_ui.cc',
-      'browser/ui/webui/chromeos/slow_trace_ui.h',
-      'browser/ui/webui/chromeos/slow_ui.cc',
-      'browser/ui/webui/chromeos/slow_ui.h',
-      'browser/ui/webui/chromeos/touch_view_controller_delegate.cc',
-      'browser/ui/webui/chromeos/touch_view_controller_delegate.h',
-      'browser/ui/webui/chromeos/ui_account_tweaks.cc',
-      'browser/ui/webui/chromeos/ui_account_tweaks.h',
-      'browser/ui/webui/components_ui.cc',
-      'browser/ui/webui/components_ui.h',
-      'browser/ui/webui/constrained_web_dialog_ui.cc',
-      'browser/ui/webui/constrained_web_dialog_ui.h',
-      'browser/ui/webui/cookies_tree_model_util.cc',
-      'browser/ui/webui/cookies_tree_model_util.h',
-      'browser/ui/webui/crashes_ui.cc',
-      'browser/ui/webui/crashes_ui.h',
-      'browser/ui/webui/device_log_ui.cc',
-      'browser/ui/webui/device_log_ui.h',
-      'browser/ui/webui/domain_reliability_internals_ui.cc',
-      'browser/ui/webui/domain_reliability_internals_ui.h',
-      'browser/ui/webui/engagement/site_engagement_ui.cc',
-      'browser/ui/webui/engagement/site_engagement_ui.h',
-      'browser/ui/webui/fallback_icon_source.cc',
-      'browser/ui/webui/fallback_icon_source.h',
-      'browser/ui/webui/favicon_source.cc',
-      'browser/ui/webui/favicon_source.h',
-      'browser/ui/webui/fileicon_source.cc',
-      'browser/ui/webui/fileicon_source.h',
-      'browser/ui/webui/flags_ui.cc',
-      'browser/ui/webui/flags_ui.h',
-      'browser/ui/webui/gcm_internals_ui.cc',
-      'browser/ui/webui/gcm_internals_ui.h',
-      'browser/ui/webui/history_ui.cc',
-      'browser/ui/webui/history_ui.h',
-      'browser/ui/webui/instant_ui.cc',
-      'browser/ui/webui/instant_ui.h',
-      'browser/ui/webui/interstitials/interstitial_ui.cc',
-      'browser/ui/webui/interstitials/interstitial_ui.h',
-      'browser/ui/webui/invalidations_message_handler.cc',
-      'browser/ui/webui/invalidations_message_handler.h',
-      'browser/ui/webui/invalidations_ui.cc',
-      'browser/ui/webui/invalidations_ui.h',
-      'browser/ui/webui/large_icon_source.cc',
-      'browser/ui/webui/large_icon_source.h',
-      'browser/ui/webui/local_state/local_state_ui.cc',
-      'browser/ui/webui/local_state/local_state_ui.h',
-      'browser/ui/webui/log_web_ui_url.cc',
-      'browser/ui/webui/log_web_ui_url.h',
-      'browser/ui/webui/metrics_handler.cc',
-      'browser/ui/webui/metrics_handler.h',
-      'browser/ui/webui/mojo_web_ui_controller.cc',
-      'browser/ui/webui/mojo_web_ui_controller.h',
-      'browser/ui/webui/mojo_web_ui_handler.h',
-      'browser/ui/webui/net_export_ui.cc',
-      'browser/ui/webui/net_export_ui.h',
-      'browser/ui/webui/net_internals/net_internals_ui.cc',
-      'browser/ui/webui/net_internals/net_internals_ui.h',
-      'browser/ui/webui/ntp/ntp_user_data_logger.cc',
-      'browser/ui/webui/ntp/ntp_user_data_logger.h',
-      'browser/ui/webui/omnibox/omnibox_page_handler.cc',
-      'browser/ui/webui/omnibox/omnibox_page_handler.h',
-      'browser/ui/webui/omnibox/omnibox_ui.cc',
-      'browser/ui/webui/omnibox/omnibox_ui.h',
-      'browser/ui/webui/password_manager_internals/password_manager_internals_ui.cc',
-      'browser/ui/webui/password_manager_internals/password_manager_internals_ui.h',
-      'browser/ui/webui/policy_material_design_ui.cc',
-      'browser/ui/webui/policy_material_design_ui.h',
-      'browser/ui/webui/policy_ui.cc',
-      'browser/ui/webui/policy_ui.h',
-      'browser/ui/webui/policy_ui_handler.cc',
-      'browser/ui/webui/policy_ui_handler.h',
-      'browser/ui/webui/predictors/predictors_handler.cc',
-      'browser/ui/webui/predictors/predictors_handler.h',
-      'browser/ui/webui/predictors/predictors_ui.cc',
-      'browser/ui/webui/predictors/predictors_ui.h',
-      'browser/ui/webui/profiler_ui.cc',
-      'browser/ui/webui/profiler_ui.h',
-      'browser/ui/webui/signin_internals_ui.cc',
-      'browser/ui/webui/signin_internals_ui.h',
-      'browser/ui/webui/supervised_user_internals_message_handler.cc',
-      'browser/ui/webui/supervised_user_internals_message_handler.h',
-      'browser/ui/webui/supervised_user_internals_ui.cc',
-      'browser/ui/webui/supervised_user_internals_ui.h',
-      'browser/ui/webui/sync_internals_message_handler.cc',
-      'browser/ui/webui/sync_internals_message_handler.h',
-      'browser/ui/webui/sync_internals_ui.cc',
-      'browser/ui/webui/sync_internals_ui.h',
-      'browser/ui/webui/test_files_request_filter.cc',
-      'browser/ui/webui/test_files_request_filter.h',
-      'browser/ui/webui/theme_source.cc',
-      'browser/ui/webui/theme_source.h',
-      'browser/ui/webui/translate_internals/translate_internals_handler.cc',
-      'browser/ui/webui/translate_internals/translate_internals_handler.h',
-      'browser/ui/webui/translate_internals/translate_internals_ui.cc',
-      'browser/ui/webui/translate_internals/translate_internals_ui.h',
-      'browser/ui/webui/usb_internals/usb_internals_page_handler.cc',
-      'browser/ui/webui/usb_internals/usb_internals_page_handler.h',
-      'browser/ui/webui/usb_internals/usb_internals_ui.cc',
-      'browser/ui/webui/usb_internals/usb_internals_ui.h',
-      'browser/ui/webui/user_actions/user_actions_ui.cc',
-      'browser/ui/webui/user_actions/user_actions_ui.h',
-      'browser/ui/webui/user_actions/user_actions_ui_handler.cc',
-      'browser/ui/webui/user_actions/user_actions_ui_handler.h',
-      'browser/ui/webui/version_handler.cc',
-      'browser/ui/webui/version_handler.h',
-      'browser/ui/webui/version_handler_chromeos.cc',
-      'browser/ui/webui/version_handler_chromeos.h',
-      'browser/ui/webui/version_ui.cc',
-      'browser/ui/webui/version_ui.h',
-      'browser/ui/window_sizer/window_sizer_mac.mm',
-      'browser/ui/zoom/chrome_zoom_level_otr_delegate.cc',
-      'browser/ui/zoom/chrome_zoom_level_otr_delegate.h',
-      'browser/ui/zoom/chrome_zoom_level_prefs.cc',
-      'browser/ui/zoom/chrome_zoom_level_prefs.h',
-    ],
-    'chrome_browser_ui_android_java_ui_sources': [
-      'browser/ui/android/autofill/autofill_keyboard_accessory_view.cc',
-      'browser/ui/android/autofill/autofill_keyboard_accessory_view.h',
-      'browser/ui/android/autofill/autofill_logger_android.cc',
-      'browser/ui/android/autofill/autofill_logger_android.h',
-      'browser/ui/android/autofill/autofill_popup_view_android.cc',
-      'browser/ui/android/autofill/autofill_popup_view_android.h',
-      'browser/ui/android/autofill/card_unmask_prompt_view_android.cc',
-      'browser/ui/android/autofill/card_unmask_prompt_view_android.h',
-      'browser/ui/android/autofill/credit_card_scanner_view_android.cc',
-      'browser/ui/android/autofill/credit_card_scanner_view_android.h',
-      'browser/ui/android/autofill/password_generation_popup_view_android.cc',
-      'browser/ui/android/autofill/password_generation_popup_view_android.h',
-      'browser/ui/android/bluetooth_chooser_android.cc',
-      'browser/ui/android/bluetooth_chooser_android.h',
-      'browser/ui/android/certificate_viewer_android.cc',
-      'browser/ui/android/certificate_viewer_android.h',
-      'browser/ui/android/chrome_http_auth_handler.cc',
-      'browser/ui/android/chrome_http_auth_handler.h',
-      'browser/ui/android/color_chooser_dialog_android.cc',
-      'browser/ui/android/connection_info_popup_android.cc',
-      'browser/ui/android/connection_info_popup_android.h',
-      'browser/ui/android/content_settings/popup_blocked_infobar_delegate.cc',
-      'browser/ui/android/content_settings/popup_blocked_infobar_delegate.h',
-      'browser/ui/android/content_settings/subresource_filter_infobar_delegate.cc',
-      'browser/ui/android/content_settings/subresource_filter_infobar_delegate.h',
-      'browser/ui/android/context_menu_helper.cc',
-      'browser/ui/android/context_menu_helper.h',
-      'browser/ui/android/infobars/app_banner_infobar_android.cc',
-      'browser/ui/android/infobars/app_banner_infobar_android.h',
-      'browser/ui/android/infobars/autofill_credit_card_filling_infobar.cc',
-      'browser/ui/android/infobars/autofill_credit_card_filling_infobar.h',
-      'browser/ui/android/infobars/autofill_save_card_infobar.cc',
-      'browser/ui/android/infobars/autofill_save_card_infobar.h',
-      'browser/ui/android/infobars/confirm_infobar.cc',
-      'browser/ui/android/infobars/confirm_infobar.h',
-      'browser/ui/android/infobars/data_reduction_promo_infobar.cc',
-      'browser/ui/android/infobars/data_reduction_promo_infobar.h',
-      'browser/ui/android/infobars/download_overwrite_infobar.cc',
-      'browser/ui/android/infobars/download_overwrite_infobar.h',
-      'browser/ui/android/infobars/generated_password_saved_infobar.cc',
-      'browser/ui/android/infobars/generated_password_saved_infobar.h',
-      'browser/ui/android/infobars/grouped_permission_infobar.cc',
-      'browser/ui/android/infobars/grouped_permission_infobar.h',
-      'browser/ui/android/infobars/infobar_android.cc',
-      'browser/ui/android/infobars/infobar_android.h',
-      'browser/ui/android/infobars/infobar_container_android.cc',
-      'browser/ui/android/infobars/infobar_container_android.h',
-      'browser/ui/android/infobars/instant_apps_infobar.cc',
-      'browser/ui/android/infobars/instant_apps_infobar.h',
-      'browser/ui/android/infobars/permission_infobar.cc',
-      'browser/ui/android/infobars/permission_infobar.h',
-      'browser/ui/android/infobars/save_password_infobar.cc',
-      'browser/ui/android/infobars/save_password_infobar.h',
-      'browser/ui/android/infobars/simple_confirm_infobar_builder.cc',
-      'browser/ui/android/infobars/simple_confirm_infobar_builder.h',
-      'browser/ui/android/infobars/translate_infobar.cc',
-      'browser/ui/android/infobars/translate_infobar.h',
-      'browser/ui/android/infobars/update_password_infobar.cc',
-      'browser/ui/android/infobars/update_password_infobar.h',
-      'browser/ui/android/javascript_app_modal_dialog_android.cc',
-      'browser/ui/android/login_handler_android.cc',
-      'browser/ui/android/omnibox/omnibox_url_emphasizer.cc',
-      'browser/ui/android/omnibox/omnibox_url_emphasizer.h',
-      'browser/ui/android/omnibox/omnibox_view_util.cc',
-      'browser/ui/android/omnibox/omnibox_view_util.h',
-      'browser/ui/android/simple_message_box_android.cc',
-      'browser/ui/android/snackbars/auto_signin_prompt_controller.cc',
-      'browser/ui/android/snackbars/auto_signin_prompt_controller.h',
-      'browser/ui/android/ssl_client_certificate_request.cc',
-      'browser/ui/android/ssl_client_certificate_request.h',
-      'browser/ui/android/tab_contents/chrome_web_contents_view_delegate_android.cc',
-      'browser/ui/android/tab_contents/chrome_web_contents_view_delegate_android.h',
-      'browser/ui/android/tab_model/android_live_tab_context.cc',
-      'browser/ui/android/tab_model/android_live_tab_context.h',
-      'browser/ui/android/tab_model/single_tab_model.cc',
-      'browser/ui/android/tab_model/single_tab_model.h',
-      'browser/ui/android/tab_model/tab_model.cc',
-      'browser/ui/android/tab_model/tab_model.h',
-      'browser/ui/android/tab_model/tab_model_jni_bridge.cc',
-      'browser/ui/android/tab_model/tab_model_jni_bridge.h',
-      'browser/ui/android/tab_model/tab_model_list.cc',
-      'browser/ui/android/tab_model/tab_model_list.h',
-      'browser/ui/android/toolbar/toolbar_model_android.cc',
-      'browser/ui/android/toolbar/toolbar_model_android.h',
-      'browser/ui/android/usb_chooser_dialog_android.cc',
-      'browser/ui/android/usb_chooser_dialog_android.h',
-      'browser/ui/android/view_android_helper.cc',
-      'browser/ui/android/view_android_helper.h',
-      'browser/ui/android/website_settings_popup_android.cc',
-      'browser/ui/android/website_settings_popup_android.h',
-      'browser/ui/browser_otr_state_android.cc',
-      'browser/ui/screen_capture_notification_ui_stub.cc',
-      'browser/ui/webui/offline/offline_internals_ui.cc',
-      'browser/ui/webui/offline/offline_internals_ui.h',
-      'browser/ui/webui/offline/offline_internals_ui_message_handler.cc',
-      'browser/ui/webui/offline/offline_internals_ui_message_handler.h',
-      'browser/ui/webui/popular_sites_internals_message_handler.cc',
-      'browser/ui/webui/popular_sites_internals_message_handler.h',
-      'browser/ui/webui/popular_sites_internals_ui.cc',
-      'browser/ui/webui/popular_sites_internals_ui.h',
-      'browser/ui/webui/snippets_internals_message_handler.cc',
-      'browser/ui/webui/snippets_internals_message_handler.h',
-      'browser/ui/webui/snippets_internals_ui.cc',
-      'browser/ui/webui/snippets_internals_ui.h',
-    ],
-    # Cross-platform ash sources.
-    'chrome_browser_ui_ash_sources': [
-      'browser/ui/ash/app_list/app_list_controller_ash.cc',
-      'browser/ui/ash/app_list/app_list_controller_ash.h',
-      'browser/ui/ash/app_list/app_list_presenter_delegate_mus.cc',
-      'browser/ui/ash/app_list/app_list_presenter_delegate_mus.h',
-      'browser/ui/ash/app_list/app_list_service_ash.cc',
-      'browser/ui/ash/app_list/app_list_service_ash.h',
-      'browser/ui/ash/app_list/app_sync_ui_state_watcher.cc',
-      'browser/ui/ash/app_list/app_sync_ui_state_watcher.h',
-      'browser/ui/ash/app_sync_ui_state.cc',
-      'browser/ui/ash/app_sync_ui_state.h',
-      'browser/ui/ash/app_sync_ui_state_factory.cc',
-      'browser/ui/ash/app_sync_ui_state_factory.h',
-      'browser/ui/ash/app_sync_ui_state_observer.h',
-      'browser/ui/ash/ash_init.cc',
-      'browser/ui/ash/ash_init.h',
-      'browser/ui/ash/ash_util.cc',
-      'browser/ui/ash/ash_util.h',
-      'browser/ui/ash/cast_config_delegate_chromeos.cc',
-      'browser/ui/ash/cast_config_delegate_chromeos.h',
-      'browser/ui/ash/cast_config_delegate_media_router.cc',
-      'browser/ui/ash/cast_config_delegate_media_router.h',
-      'browser/ui/ash/chrome_keyboard_ui.cc',
-      'browser/ui/ash/chrome_keyboard_ui.h',
-      'browser/ui/ash/chrome_launcher_prefs.cc',
-      'browser/ui/ash/chrome_launcher_prefs.h',
-      'browser/ui/ash/chrome_new_window_delegate.cc',
-      'browser/ui/ash/chrome_new_window_delegate.h',
-      'browser/ui/ash/chrome_screenshot_grabber.cc',
-      'browser/ui/ash/chrome_screenshot_grabber.h',
-      'browser/ui/ash/chrome_shell_content_state.cc',
-      'browser/ui/ash/chrome_shell_content_state.h',
-      'browser/ui/ash/chrome_shell_content_state_chromeos.cc',
-      'browser/ui/ash/chrome_shell_delegate.cc',
-      'browser/ui/ash/chrome_shell_delegate.h',
-      'browser/ui/ash/ime_controller_chromeos.cc',
-      'browser/ui/ash/ime_controller_chromeos.h',
-      'browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h',
-      'browser/ui/ash/launcher/app_window_launcher_controller.cc',
-      'browser/ui/ash/launcher/app_window_launcher_controller.h',
-      'browser/ui/ash/launcher/app_window_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/app_window_launcher_item_controller.h',
-      'browser/ui/ash/launcher/arc_playstore_shortcut_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/arc_playstore_shortcut_launcher_item_controller.h',
-      'browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h',
-      'browser/ui/ash/launcher/browser_status_monitor.cc',
-      'browser/ui/ash/launcher/browser_status_monitor.h',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item.cc',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item.h',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_browser.cc',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_browser.h',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_tab.cc',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_tab.h',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_v2app.cc',
-      'browser/ui/ash/launcher/chrome_launcher_app_menu_item_v2app.h',
-      'browser/ui/ash/launcher/chrome_launcher_controller.cc',
-      'browser/ui/ash/launcher/chrome_launcher_controller.h',
-      'browser/ui/ash/launcher/chrome_launcher_controller_impl.cc',
-      'browser/ui/ash/launcher/chrome_launcher_controller_impl.h',
-      'browser/ui/ash/launcher/chrome_launcher_controller_util.cc',
-      'browser/ui/ash/launcher/chrome_launcher_controller_util.h',
-      'browser/ui/ash/launcher/desktop_shell_launcher_context_menu.cc',
-      'browser/ui/ash/launcher/desktop_shell_launcher_context_menu.h',
-      'browser/ui/ash/launcher/extension_app_window_launcher_controller.cc',
-      'browser/ui/ash/launcher/extension_app_window_launcher_controller.h',
-      'browser/ui/ash/launcher/extension_app_window_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/extension_app_window_launcher_item_controller.h',
-      'browser/ui/ash/launcher/extension_launcher_context_menu.cc',
-      'browser/ui/ash/launcher/extension_launcher_context_menu.h',
-      'browser/ui/ash/launcher/launcher_app_updater.cc',
-      'browser/ui/ash/launcher/launcher_app_updater.h',
-      'browser/ui/ash/launcher/launcher_application_menu_item_model.cc',
-      'browser/ui/ash/launcher/launcher_application_menu_item_model.h',
-      'browser/ui/ash/launcher/launcher_context_menu.cc',
-      'browser/ui/ash/launcher/launcher_context_menu.h',
-      'browser/ui/ash/launcher/launcher_controller_helper.cc',
-      'browser/ui/ash/launcher/launcher_controller_helper.h',
-      'browser/ui/ash/launcher/launcher_extension_app_updater.cc',
-      'browser/ui/ash/launcher/launcher_extension_app_updater.h',
-      'browser/ui/ash/launcher/launcher_favicon_loader.cc',
-      'browser/ui/ash/launcher/launcher_favicon_loader.h',
-      'browser/ui/ash/launcher/launcher_item_controller.cc',
-      'browser/ui/ash/launcher/launcher_item_controller.h',
-      'browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.cc',
-      'browser/ui/ash/launcher/multi_profile_app_window_launcher_controller.h',
-      'browser/ui/ash/launcher/multi_profile_browser_status_monitor.cc',
-      'browser/ui/ash/launcher/multi_profile_browser_status_monitor.h',
-      'browser/ui/ash/media_delegate_chromeos.cc',
-      'browser/ui/ash/media_delegate_chromeos.h',
-      'browser/ui/ash/metrics/chrome_user_metrics_recorder.cc',
-      'browser/ui/ash/metrics/chrome_user_metrics_recorder.h',
-      'browser/ui/ash/multi_user/multi_user_context_menu.h',
-      'browser/ui/ash/multi_user/multi_user_context_menu_chromeos.cc',
-      'browser/ui/ash/multi_user/multi_user_notification_blocker_chromeos.cc',
-      'browser/ui/ash/multi_user/multi_user_notification_blocker_chromeos.h',
-      'browser/ui/ash/multi_user/multi_user_util.cc',
-      'browser/ui/ash/multi_user/multi_user_util.h',
-      'browser/ui/ash/multi_user/multi_user_warning_dialog.cc',
-      'browser/ui/ash/multi_user/multi_user_warning_dialog.h',
-      'browser/ui/ash/multi_user/multi_user_window_manager.cc',
-      'browser/ui/ash/multi_user/multi_user_window_manager.h',
-      'browser/ui/ash/multi_user/multi_user_window_manager_chromeos.cc',
-      'browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h',
-      'browser/ui/ash/multi_user/multi_user_window_manager_stub.cc',
-      'browser/ui/ash/multi_user/multi_user_window_manager_stub.h',
-      'browser/ui/ash/multi_user/user_switch_animator_chromeos.cc',
-      'browser/ui/ash/multi_user/user_switch_animator_chromeos.h',
-      'browser/ui/ash/multi_user/user_switch_util.cc',
-      'browser/ui/ash/multi_user/user_switch_util.h',
-      'browser/ui/ash/network_connect_delegate_chromeos.cc',
-      'browser/ui/ash/network_connect_delegate_chromeos.h',
-      'browser/ui/ash/networking_config_delegate_chromeos.cc',
-      'browser/ui/ash/networking_config_delegate_chromeos.h',
-      'browser/ui/ash/palette_delegate_chromeos.cc',
-      'browser/ui/ash/palette_delegate_chromeos.h',
-      'browser/ui/ash/session_state_delegate_chromeos.cc',
-      'browser/ui/ash/session_state_delegate_chromeos.h',
-      'browser/ui/ash/session_util.cc',
-      'browser/ui/ash/session_util.h',
-      'browser/ui/ash/system_tray_delegate_chromeos.cc',
-      'browser/ui/ash/system_tray_delegate_chromeos.h',
-      'browser/ui/ash/system_tray_delegate_utils.cc',
-      'browser/ui/ash/system_tray_delegate_utils.h',
-      'browser/ui/ash/volume_controller_chromeos.cc',
-      'browser/ui/ash/volume_controller_chromeos.h',
-      'browser/ui/ash/vpn_delegate_chromeos.cc',
-      'browser/ui/ash/vpn_delegate_chromeos.h',
-      'browser/ui/views/ash/chrome_browser_main_extra_parts_ash.cc',
-      'browser/ui/views/ash/chrome_browser_main_extra_parts_ash.h',
-      'browser/ui/views/ash/tab_scrubber.cc',
-      'browser/ui/views/ash/tab_scrubber.h',
-      'browser/ui/views/touch_uma/touch_uma_ash.cc',
-      'browser/ui/window_sizer/window_sizer_ash.cc',
-    ],
-    # Ash + Views.
-    'chrome_browser_ui_ash_views_sources': [
-      'browser/ui/views/frame/browser_frame_ash.cc',
-      'browser/ui/views/frame/browser_frame_ash.h',
-      'browser/ui/views/frame/browser_header_painter_ash.cc',
-      'browser/ui/views/frame/browser_header_painter_ash.h',
-      'browser/ui/views/frame/browser_non_client_frame_view_ash.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view_ash.h',
-      'browser/ui/views/frame/immersive_context_mus.cc',
-      'browser/ui/views/frame/immersive_context_mus.h',
-      'browser/ui/views/frame/immersive_handler_factory_mus.cc',
-      'browser/ui/views/frame/immersive_handler_factory_mus.h',
-      'browser/ui/views/frame/immersive_mode_controller_ash.cc',
-      'browser/ui/views/frame/immersive_mode_controller_ash.h',
-      'browser/ui/views/frame/web_app_left_header_view_ash.cc',
-      'browser/ui/views/frame/web_app_left_header_view_ash.h',
-      'browser/ui/views/tabs/window_finder_ash.cc',
-    ],
-    # Used when ash is disabled.
-    'chrome_browser_ui_non_ash_sources': [
-      'browser/ui/views/touch_uma/touch_uma.cc',
-    ],
-    # Cross-platform aura sources.
-    'chrome_browser_ui_aura_sources': [
-      'browser/ui/aura/accessibility/automation_manager_aura.cc',
-      'browser/ui/aura/accessibility/automation_manager_aura.h',
-      'browser/ui/aura/accessibility/ax_root_obj_wrapper.cc',
-      'browser/ui/aura/accessibility/ax_root_obj_wrapper.h',
-      'browser/ui/aura/accessibility/ax_tree_source_aura.cc',
-      'browser/ui/aura/accessibility/ax_tree_source_aura.h',
-      'browser/ui/aura/native_window_tracker_aura.cc',
-      'browser/ui/aura/native_window_tracker_aura.h',
-      'browser/ui/aura/tab_contents/web_drag_bookmark_handler_aura.cc',
-      'browser/ui/aura/tab_contents/web_drag_bookmark_handler_aura.h',
-      'browser/ui/ime/ime_window.cc',
-      'browser/ui/ime/ime_window.h',
-      'browser/ui/views/accelerator_utils_aura.cc',
-      'browser/ui/views/apps/app_window_desktop_native_widget_aura_win.cc',
-      'browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h',
-      'browser/ui/views/apps/app_window_desktop_window_tree_host_win.cc',
-      'browser/ui/views/apps/app_window_desktop_window_tree_host_win.h',
-      'browser/ui/views/apps/app_window_easy_resize_window_targeter.cc',
-      'browser/ui/views/apps/app_window_easy_resize_window_targeter.h',
-      'browser/ui/views/apps/chrome_app_window_client_views_chromeos.cc',
-      'browser/ui/views/apps/chrome_app_window_client_views_win.cc',
-      'browser/ui/views/apps/chrome_native_app_window_views_aura.cc',
-      'browser/ui/views/apps/chrome_native_app_window_views_aura.h',
-      'browser/ui/views/apps/chrome_native_app_window_views_win.cc',
-      'browser/ui/views/apps/chrome_native_app_window_views_win.h',
-      'browser/ui/views/apps/glass_app_window_frame_view_win.cc',
-      'browser/ui/views/apps/glass_app_window_frame_view_win.h',
-      'browser/ui/views/apps/shaped_app_window_targeter.cc',
-      'browser/ui/views/apps/shaped_app_window_targeter.h',
-      'browser/ui/views/color_chooser_aura.cc',
-      'browser/ui/views/color_chooser_aura.h',
-      'browser/ui/views/crypto_module_password_dialog_view.cc',
-      'browser/ui/views/crypto_module_password_dialog_view.h',
-      'browser/ui/views/desktop_capture/desktop_media_list_view.cc',
-      'browser/ui/views/desktop_capture/desktop_media_list_view.h',
-      'browser/ui/views/desktop_capture/desktop_media_picker_views.cc',
-      'browser/ui/views/desktop_capture/desktop_media_picker_views.h',
-      'browser/ui/views/desktop_capture/desktop_media_source_view.cc',
-      'browser/ui/views/desktop_capture/desktop_media_source_view.h',
-      'browser/ui/views/desktop_media_picker_views_deprecated.cc',
-      'browser/ui/views/desktop_media_picker_views_deprecated.h',
-      'browser/ui/views/dropdown_bar_host_aura.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view_factory_views.cc',
-      'browser/ui/views/ime/ime_window_frame_view.cc',
-      'browser/ui/views/ime/ime_window_frame_view.h',
-      'browser/ui/views/ime/ime_window_view.cc',
-      'browser/ui/views/ime/ime_window_view.h',
-      'browser/ui/views/renderer_context_menu/render_view_context_menu_views.cc',
-      'browser/ui/views/renderer_context_menu/render_view_context_menu_views.h',
-      'browser/ui/views/sad_tab_view.cc',
-      'browser/ui/views/sad_tab_view.h',
-      'browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc',
-      'browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h',
-      'browser/ui/window_sizer/window_sizer_aura.cc',
-    ],
-    # Aura but not ChromeOS.
-    'chrome_browser_ui_aura_non_chromeos': [
-      'browser/ui/views/frame/desktop_browser_frame_aura.cc',
-      'browser/ui/views/frame/desktop_browser_frame_aura.h',
-      'browser/ui/views/message_center/message_center_frame_view.cc',
-      'browser/ui/views/message_center/message_center_frame_view.h',
-      'browser/ui/views/message_center/web_notification_tray.cc',
-      'browser/ui/views/message_center/web_notification_tray.h',
-    ],
-    # ChromeOS-only sources that don't end in _chromeos or live in a chromeos
-    # directory.
-    'chrome_browser_ui_chromeos_sources': [
-      'browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader.cc',
-      'browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader.h',
-      'browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader_impl.cc',
-      'browser/ui/app_list/search/launcher_search/launcher_search_icon_image_loader_impl.h',
-      'browser/ui/app_list/search/launcher_search/launcher_search_provider.cc',
-      'browser/ui/app_list/search/launcher_search/launcher_search_provider.h',
-      'browser/ui/app_list/search/launcher_search/launcher_search_result.cc',
-      'browser/ui/app_list/search/launcher_search/launcher_search_result.h',
-      'browser/ui/extensions/extension_installed_notification.cc',
-      'browser/ui/extensions/extension_installed_notification.h',
-      'browser/ui/input_method/input_method_engine_base.cc',
-      'browser/ui/input_method/input_method_engine_base.h',
-      'browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc',
-      'browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h',
-      'browser/ui/views/intent_picker_bubble_view.cc',
-      'browser/ui/views/intent_picker_bubble_view.h',
-      # On chromeos, file manager extension handles the file open/save dialog.
-      'browser/ui/views/select_file_dialog_extension.cc',
-      'browser/ui/views/select_file_dialog_extension.h',
-      'browser/ui/views/select_file_dialog_extension_factory.cc',
-      'browser/ui/views/select_file_dialog_extension_factory.h',
-      'browser/ui/webui/cast/cast_ui.cc',
-      'browser/ui/webui/cast/cast_ui.h',
-    ],
-    # ARC-only sources.
-    'chrome_browser_ui_chromeos_arc_sources': [
-      'browser/ui/app_list/arc/arc_app_context_menu.cc',
-      'browser/ui/app_list/arc/arc_app_context_menu.h',
-      'browser/ui/app_list/arc/arc_app_icon.cc',
-      'browser/ui/app_list/arc/arc_app_icon.h',
-      'browser/ui/app_list/arc/arc_app_icon_loader.cc',
-      'browser/ui/app_list/arc/arc_app_icon_loader.h',
-      'browser/ui/app_list/arc/arc_app_item.cc',
-      'browser/ui/app_list/arc/arc_app_item.h',
-      'browser/ui/app_list/arc/arc_app_launcher.cc',
-      'browser/ui/app_list/arc/arc_app_launcher.h',
-      'browser/ui/app_list/arc/arc_app_list_prefs.cc',
-      'browser/ui/app_list/arc/arc_app_list_prefs.h',
-      'browser/ui/app_list/arc/arc_app_list_prefs_factory.cc',
-      'browser/ui/app_list/arc/arc_app_list_prefs_factory.h',
-      'browser/ui/app_list/arc/arc_app_model_builder.cc',
-      'browser/ui/app_list/arc/arc_app_model_builder.h',
-      'browser/ui/app_list/arc/arc_app_utils.cc',
-      'browser/ui/app_list/arc/arc_app_utils.h',
-      'browser/ui/app_list/arc/arc_default_app_list.cc',
-      'browser/ui/app_list/arc/arc_default_app_list.h',
-      'browser/ui/app_list/arc/arc_package_sync_data_type_controller.cc',
-      'browser/ui/app_list/arc/arc_package_sync_data_type_controller.h',
-      'browser/ui/app_list/arc/arc_package_syncable_service.cc',
-      'browser/ui/app_list/arc/arc_package_syncable_service.h',
-      'browser/ui/app_list/arc/arc_package_syncable_service_factory.cc',
-      'browser/ui/app_list/arc/arc_package_syncable_service_factory.h',
-      'browser/ui/app_list/search/arc_app_result.cc',
-      'browser/ui/app_list/search/arc_app_result.h',
-      'browser/ui/ash/launcher/arc_app_deferred_launcher_controller.cc',
-      'browser/ui/ash/launcher/arc_app_deferred_launcher_controller.h',
-      'browser/ui/ash/launcher/arc_app_deferred_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/arc_app_deferred_launcher_item_controller.h',
-      'browser/ui/ash/launcher/arc_app_window_launcher_controller.cc',
-      'browser/ui/ash/launcher/arc_app_window_launcher_controller.h',
-      'browser/ui/ash/launcher/arc_app_window_launcher_item_controller.cc',
-      'browser/ui/ash/launcher/arc_app_window_launcher_item_controller.h',
-      'browser/ui/ash/launcher/arc_launcher_context_menu.cc',
-      'browser/ui/ash/launcher/arc_launcher_context_menu.h',
-      'browser/ui/ash/launcher/launcher_arc_app_updater.cc',
-      'browser/ui/ash/launcher/launcher_arc_app_updater.h',
-    ],
-    # ChromeOS sources that should not be included in the official build.
-    'chrome_browser_ui_chromeos_non_official_sources': [
-      'browser/ui/webui/chromeos/emulator/device_emulator_message_handler.cc',
-      'browser/ui/webui/chromeos/emulator/device_emulator_message_handler.h',
-      'browser/ui/webui/chromeos/emulator/device_emulator_ui.cc',
-      'browser/ui/webui/chromeos/emulator/device_emulator_ui.h',
-    ],
-    # Mac sources, except when mac_views_browser==1.
-    'chrome_browser_ui_cocoa_sources': [
-      'browser/ui/cocoa/animatable_image.h',
-      'browser/ui/cocoa/animatable_image.mm',
-      'browser/ui/cocoa/animatable_view.h',
-      'browser/ui/cocoa/animatable_view.mm',
-      'browser/ui/cocoa/app_menu/app_menu_button_cell.h',
-      'browser/ui/cocoa/app_menu/app_menu_button_cell.mm',
-      'browser/ui/cocoa/app_menu/app_menu_controller.h',
-      'browser/ui/cocoa/app_menu/app_menu_controller.mm',
-      'browser/ui/cocoa/app_menu/menu_tracked_button.h',
-      'browser/ui/cocoa/app_menu/menu_tracked_button.mm',
-      'browser/ui/cocoa/app_menu/menu_tracked_root_view.h',
-      'browser/ui/cocoa/app_menu/menu_tracked_root_view.mm',
-      'browser/ui/cocoa/app_menu/recent_tabs_menu_model_delegate.h',
-      'browser/ui/cocoa/app_menu/recent_tabs_menu_model_delegate.mm',
-      'browser/ui/cocoa/applescript/apple_event_util.h',
-      'browser/ui/cocoa/applescript/apple_event_util.mm',
-      'browser/ui/cocoa/applescript/bookmark_folder_applescript.h',
-      'browser/ui/cocoa/applescript/bookmark_folder_applescript.mm',
-      'browser/ui/cocoa/applescript/bookmark_item_applescript.h',
-      'browser/ui/cocoa/applescript/bookmark_item_applescript.mm',
-      'browser/ui/cocoa/applescript/bookmark_node_applescript.h',
-      'browser/ui/cocoa/applescript/bookmark_node_applescript.mm',
-      'browser/ui/cocoa/applescript/browsercrapplication+applescript.h',
-      'browser/ui/cocoa/applescript/browsercrapplication+applescript.mm',
-      'browser/ui/cocoa/applescript/constants_applescript.h',
-      'browser/ui/cocoa/applescript/constants_applescript.mm',
-      'browser/ui/cocoa/applescript/element_applescript.h',
-      'browser/ui/cocoa/applescript/element_applescript.mm',
-      'browser/ui/cocoa/applescript/error_applescript.h',
-      'browser/ui/cocoa/applescript/error_applescript.mm',
-      'browser/ui/cocoa/applescript/metrics_applescript.h',
-      'browser/ui/cocoa/applescript/metrics_applescript.mm',
-      'browser/ui/cocoa/applescript/tab_applescript.h',
-      'browser/ui/cocoa/applescript/tab_applescript.mm',
-      'browser/ui/cocoa/applescript/window_applescript.h',
-      'browser/ui/cocoa/applescript/window_applescript.mm',
-      'browser/ui/cocoa/apps/chrome_app_window_client_views_cocoa.mm',
-      'browser/ui/cocoa/apps/native_app_window_cocoa.h',
-      'browser/ui/cocoa/apps/native_app_window_cocoa.mm',
-      'browser/ui/cocoa/autofill/autofill_bubble_controller.h',
-      'browser/ui/cocoa/autofill/autofill_bubble_controller.mm',
-      'browser/ui/cocoa/autofill/autofill_layout.h',
-      'browser/ui/cocoa/autofill/autofill_pop_up_button.h',
-      'browser/ui/cocoa/autofill/autofill_pop_up_button.mm',
-      'browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.h',
-      'browser/ui/cocoa/autofill/autofill_popup_base_view_cocoa.mm',
-      'browser/ui/cocoa/autofill/autofill_popup_view_bridge.h',
-      'browser/ui/cocoa/autofill/autofill_popup_view_bridge.mm',
-      'browser/ui/cocoa/autofill/autofill_popup_view_cocoa.h',
-      'browser/ui/cocoa/autofill/autofill_popup_view_cocoa.mm',
-      'browser/ui/cocoa/autofill/autofill_textfield.h',
-      'browser/ui/cocoa/autofill/autofill_textfield.mm',
-      'browser/ui/cocoa/autofill/autofill_tooltip_controller.h',
-      'browser/ui/cocoa/autofill/autofill_tooltip_controller.mm',
-      'browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.h',
-      'browser/ui/cocoa/autofill/card_unmask_prompt_view_bridge.mm',
-      'browser/ui/cocoa/autofill/card_unmask_prompt_view_views.mm',
-      'browser/ui/cocoa/autofill/down_arrow_popup_menu_cell.h',
-      'browser/ui/cocoa/autofill/down_arrow_popup_menu_cell.mm',
-      'browser/ui/cocoa/autofill/layout_view.h',
-      'browser/ui/cocoa/autofill/layout_view.mm',
-      'browser/ui/cocoa/autofill/password_generation_popup_view_bridge.h',
-      'browser/ui/cocoa/autofill/password_generation_popup_view_bridge.mm',
-      'browser/ui/cocoa/autofill/password_generation_popup_view_cocoa.h',
-      'browser/ui/cocoa/autofill/password_generation_popup_view_cocoa.mm',
-      'browser/ui/cocoa/autofill/save_card_bubble_view_bridge.h',
-      'browser/ui/cocoa/autofill/save_card_bubble_view_bridge.mm',
-      'browser/ui/cocoa/autofill/simple_grid_layout.h',
-      'browser/ui/cocoa/autofill/simple_grid_layout.mm',
-      'browser/ui/cocoa/background_gradient_view.h',
-      'browser/ui/cocoa/background_gradient_view.mm',
-      'browser/ui/cocoa/base_bubble_controller.h',
-      'browser/ui/cocoa/base_bubble_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_all_tabs_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_bridge.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_bridge.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_constants.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_button_cell.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_button_cell.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_hover_state.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_view.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_window.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_folder_window.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_state.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_toolbar_view.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bar_view_cocoa.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bubble_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_bubble_observer_cocoa.h',
-      'browser/ui/cocoa/bookmarks/bookmark_bubble_observer_cocoa.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_button.h',
-      'browser/ui/cocoa/bookmarks/bookmark_button.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_button_cell.h',
-      'browser/ui/cocoa/bookmarks/bookmark_button_cell.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_context_menu_cocoa_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_context_menu_cocoa_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_drag_drop_cocoa.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_editor_base_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_editor_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_editor_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_folder_target.h',
-      'browser/ui/cocoa/bookmarks/bookmark_folder_target.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.h',
-      'browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_name_folder_controller.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell.h',
-      'browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell.mm',
-      'browser/ui/cocoa/browser/exclusive_access_controller_views.h',
-      'browser/ui/cocoa/browser/exclusive_access_controller_views.mm',
-      'browser/ui/cocoa/browser/zoom_bubble_controller.h',
-      'browser/ui/cocoa/browser/zoom_bubble_controller.mm',
-      'browser/ui/cocoa/browser_window_cocoa.h',
-      'browser/ui/cocoa/browser_window_cocoa.mm',
-      'browser/ui/cocoa/browser_window_controller.h',
-      'browser/ui/cocoa/browser_window_controller.mm',
-      'browser/ui/cocoa/browser_window_controller_private.h',
-      'browser/ui/cocoa/browser_window_controller_private.mm',
-      'browser/ui/cocoa/browser_window_factory_cocoa.mm',
-      'browser/ui/cocoa/browser_window_fullscreen_transition.h',
-      'browser/ui/cocoa/browser_window_fullscreen_transition.mm',
-      'browser/ui/cocoa/browser_window_layout.h',
-      'browser/ui/cocoa/browser_window_layout.mm',
-      'browser/ui/cocoa/browser_window_utils.h',
-      'browser/ui/cocoa/browser_window_utils.mm',
-      'browser/ui/cocoa/bubble_combobox.h',
-      'browser/ui/cocoa/bubble_combobox.mm',
-      'browser/ui/cocoa/bubble_sync_promo_controller.h',
-      'browser/ui/cocoa/bubble_sync_promo_controller.mm',
-      'browser/ui/cocoa/bubble_view.h',
-      'browser/ui/cocoa/bubble_view.mm',
-      'browser/ui/cocoa/certificate_viewer_mac_cocoa.h',
-      'browser/ui/cocoa/certificate_viewer_mac_cocoa.mm',
-      'browser/ui/cocoa/chooser_content_view_cocoa.h',
-      'browser/ui/cocoa/chooser_content_view_cocoa.mm',
-      'browser/ui/cocoa/chrome_browser_window.h',
-      'browser/ui/cocoa/chrome_browser_window.mm',
-      'browser/ui/cocoa/chrome_event_processing_window.h',
-      'browser/ui/cocoa/chrome_event_processing_window.mm',
-      'browser/ui/cocoa/clickhold_button_cell.h',
-      'browser/ui/cocoa/clickhold_button_cell.mm',
-      'browser/ui/cocoa/confirm_bubble_cocoa.h',
-      'browser/ui/cocoa/confirm_bubble_cocoa.mm',
-      'browser/ui/cocoa/confirm_bubble_controller.h',
-      'browser/ui/cocoa/confirm_bubble_controller.mm',
-      'browser/ui/cocoa/constrained_web_dialog_delegate_mac.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_alert.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_alert.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_button.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_button.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_control_utils.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_control_utils.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_custom_sheet.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_custom_window.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_custom_window.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_mac.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_mac.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_sheet.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_sheet_controller.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_sheet_controller.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_sheet_info.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_sheet_info.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_web_dialog_sheet.h',
-      'browser/ui/cocoa/constrained_window/constrained_window_web_dialog_sheet.mm',
-      'browser/ui/cocoa/content_settings/collected_cookies_mac.h',
-      'browser/ui/cocoa/content_settings/collected_cookies_mac.mm',
-      'browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.h',
-      'browser/ui/cocoa/content_settings/content_setting_bubble_cocoa.mm',
-      'browser/ui/cocoa/content_settings/cookie_details.h',
-      'browser/ui/cocoa/content_settings/cookie_details.mm',
-      'browser/ui/cocoa/content_settings/cookie_details_view_controller.h',
-      'browser/ui/cocoa/content_settings/cookie_details_view_controller.mm',
-      'browser/ui/cocoa/content_settings/cookie_tree_node.h',
-      'browser/ui/cocoa/content_settings/cookie_tree_node.mm',
-      'browser/ui/cocoa/content_settings/cookies_tree_controller_bridge.h',
-      'browser/ui/cocoa/content_settings/cookies_tree_controller_bridge.mm',
-      'browser/ui/cocoa/create_application_shortcut_cocoa.mm',
-      'browser/ui/cocoa/create_native_web_modal_manager_cocoa.mm',
-      'browser/ui/cocoa/custom_frame_view.h',
-      'browser/ui/cocoa/custom_frame_view.mm',
-      'browser/ui/cocoa/dev_tools_controller.h',
-      'browser/ui/cocoa/dev_tools_controller.mm',
-      'browser/ui/cocoa/download/background_theme.h',
-      'browser/ui/cocoa/download/background_theme.mm',
-      'browser/ui/cocoa/download/download_danger_prompt_impl.cc',
-      'browser/ui/cocoa/download/download_danger_prompt_impl.h',
-      'browser/ui/cocoa/download/download_item_button.h',
-      'browser/ui/cocoa/download/download_item_button.mm',
-      'browser/ui/cocoa/download/download_item_cell.h',
-      'browser/ui/cocoa/download/download_item_cell.mm',
-      'browser/ui/cocoa/download/download_item_controller.h',
-      'browser/ui/cocoa/download/download_item_controller.mm',
-      'browser/ui/cocoa/download/download_item_mac.h',
-      'browser/ui/cocoa/download/download_item_mac.mm',
-      'browser/ui/cocoa/download/download_shelf_context_menu_controller.h',
-      'browser/ui/cocoa/download/download_shelf_context_menu_controller.mm',
-      'browser/ui/cocoa/download/download_shelf_controller.h',
-      'browser/ui/cocoa/download/download_shelf_controller.mm',
-      'browser/ui/cocoa/download/download_shelf_mac.h',
-      'browser/ui/cocoa/download/download_shelf_mac.mm',
-      'browser/ui/cocoa/download/download_shelf_view_cocoa.h',
-      'browser/ui/cocoa/download/download_shelf_view_cocoa.mm',
-      'browser/ui/cocoa/download/download_show_all_button.h',
-      'browser/ui/cocoa/download/download_show_all_button.mm',
-      'browser/ui/cocoa/download/download_show_all_cell.h',
-      'browser/ui/cocoa/download/download_show_all_cell.mm',
-      'browser/ui/cocoa/download/download_started_animation_mac.mm',
-      'browser/ui/cocoa/drag_util.h',
-      'browser/ui/cocoa/drag_util.mm',
-      'browser/ui/cocoa/draggable_button.h',
-      'browser/ui/cocoa/draggable_button.mm',
-      'browser/ui/cocoa/draggable_button_mixin.h',
-      'browser/ui/cocoa/draggable_button_mixin.mm',
-      'browser/ui/cocoa/extensions/browser_action_button.h',
-      'browser/ui/cocoa/extensions/browser_action_button.mm',
-      'browser/ui/cocoa/extensions/browser_actions_container_view.h',
-      'browser/ui/cocoa/extensions/browser_actions_container_view.mm',
-      'browser/ui/cocoa/extensions/browser_actions_controller.h',
-      'browser/ui/cocoa/extensions/browser_actions_controller.mm',
-      'browser/ui/cocoa/extensions/chooser_dialog_cocoa.h',
-      'browser/ui/cocoa/extensions/chooser_dialog_cocoa.mm',
-      'browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.h',
-      'browser/ui/cocoa/extensions/chooser_dialog_cocoa_controller.mm',
-      'browser/ui/cocoa/extensions/device_permissions_dialog_controller.h',
-      'browser/ui/cocoa/extensions/device_permissions_dialog_controller.mm',
-      'browser/ui/cocoa/extensions/device_permissions_view_controller.h',
-      'browser/ui/cocoa/extensions/device_permissions_view_controller.mm',
-      'browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.h',
-      'browser/ui/cocoa/extensions/extension_action_platform_delegate_cocoa.mm',
-      'browser/ui/cocoa/extensions/extension_install_dialog_controller.h',
-      'browser/ui/cocoa/extensions/extension_install_dialog_controller.mm',
-      'browser/ui/cocoa/extensions/extension_install_view_controller.h',
-      'browser/ui/cocoa/extensions/extension_install_view_controller.mm',
-      'browser/ui/cocoa/extensions/extension_installed_bubble_controller.h',
-      'browser/ui/cocoa/extensions/extension_installed_bubble_controller.mm',
-      'browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa.h',
-      'browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa.mm',
-      'browser/ui/cocoa/extensions/extension_popup_controller.h',
-      'browser/ui/cocoa/extensions/extension_popup_controller.mm',
-      'browser/ui/cocoa/extensions/extension_uninstall_dialog_cocoa.mm',
-      'browser/ui/cocoa/extensions/extension_view_mac.h',
-      'browser/ui/cocoa/extensions/extension_view_mac.mm',
-      'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.h',
-      'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa.mm',
-      'browser/ui/cocoa/extensions/media_gallery_list_entry_view.h',
-      'browser/ui/cocoa/extensions/media_gallery_list_entry_view.mm',
-      'browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.h',
-      'browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.mm',
-      'browser/ui/cocoa/extensions/windowed_install_dialog_controller.h',
-      'browser/ui/cocoa/extensions/windowed_install_dialog_controller.mm',
-      'browser/ui/cocoa/external_protocol_dialog.h',
-      'browser/ui/cocoa/external_protocol_dialog.mm',
-      'browser/ui/cocoa/fast_resize_view.h',
-      'browser/ui/cocoa/fast_resize_view.mm',
-      'browser/ui/cocoa/find_bar/find_bar_bridge.h',
-      'browser/ui/cocoa/find_bar/find_bar_bridge.mm',
-      'browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h',
-      'browser/ui/cocoa/find_bar/find_bar_cocoa_controller.mm',
-      'browser/ui/cocoa/find_bar/find_bar_text_field.h',
-      'browser/ui/cocoa/find_bar/find_bar_text_field.mm',
-      'browser/ui/cocoa/find_bar/find_bar_text_field_cell.h',
-      'browser/ui/cocoa/find_bar/find_bar_text_field_cell.mm',
-      'browser/ui/cocoa/find_bar/find_bar_view_cocoa.h',
-      'browser/ui/cocoa/find_bar/find_bar_view_cocoa.mm',
-      'browser/ui/cocoa/first_run_bubble_controller.h',
-      'browser/ui/cocoa/first_run_bubble_controller.mm',
-      'browser/ui/cocoa/floating_bar_backing_view.h',
-      'browser/ui/cocoa/floating_bar_backing_view.mm',
-      'browser/ui/cocoa/framed_browser_window.h',
-      'browser/ui/cocoa/framed_browser_window.mm',
-      'browser/ui/cocoa/full_size_content_window.h',
-      'browser/ui/cocoa/full_size_content_window.mm',
-      'browser/ui/cocoa/fullscreen_low_power_coordinator.h',
-      'browser/ui/cocoa/fullscreen_low_power_coordinator.mm',
-      'browser/ui/cocoa/fullscreen_toolbar_controller.h',
-      'browser/ui/cocoa/fullscreen_toolbar_controller.mm',
-      'browser/ui/cocoa/fullscreen_window.h',
-      'browser/ui/cocoa/fullscreen_window.mm',
-      'browser/ui/cocoa/global_error_bubble_controller.h',
-      'browser/ui/cocoa/global_error_bubble_controller.mm',
-      'browser/ui/cocoa/gradient_button_cell.h',
-      'browser/ui/cocoa/gradient_button_cell.mm',
-      'browser/ui/cocoa/has_weak_browser_pointer.h',
-      'browser/ui/cocoa/hover_close_button.h',
-      'browser/ui/cocoa/hover_close_button.mm',
-      'browser/ui/cocoa/hung_renderer_controller.h',
-      'browser/ui/cocoa/hung_renderer_controller.mm',
-      'browser/ui/cocoa/image_button_cell.h',
-      'browser/ui/cocoa/image_button_cell.mm',
-      'browser/ui/cocoa/importer/import_lock_dialog_cocoa.mm',
-      'browser/ui/cocoa/info_bubble_view.h',
-      'browser/ui/cocoa/info_bubble_view.mm',
-      'browser/ui/cocoa/info_bubble_window.h',
-      'browser/ui/cocoa/info_bubble_window.mm',
-      'browser/ui/cocoa/infobars/after_translate_infobar_controller.h',
-      'browser/ui/cocoa/infobars/after_translate_infobar_controller.mm',
-      'browser/ui/cocoa/infobars/alternate_nav_infobar_controller.h',
-      'browser/ui/cocoa/infobars/alternate_nav_infobar_controller.mm',
-      'browser/ui/cocoa/infobars/before_translate_infobar_controller.h',
-      'browser/ui/cocoa/infobars/before_translate_infobar_controller.mm',
-      'browser/ui/cocoa/infobars/confirm_infobar_controller.h',
-      'browser/ui/cocoa/infobars/confirm_infobar_controller.mm',
-      'browser/ui/cocoa/infobars/infobar_cocoa.h',
-      'browser/ui/cocoa/infobars/infobar_cocoa.mm',
-      'browser/ui/cocoa/infobars/infobar_container_cocoa.h',
-      'browser/ui/cocoa/infobars/infobar_container_cocoa.mm',
-      'browser/ui/cocoa/infobars/infobar_container_controller.h',
-      'browser/ui/cocoa/infobars/infobar_container_controller.mm',
-      'browser/ui/cocoa/infobars/infobar_controller.h',
-      'browser/ui/cocoa/infobars/infobar_controller.mm',
-      'browser/ui/cocoa/infobars/infobar_gradient_view.h',
-      'browser/ui/cocoa/infobars/infobar_gradient_view.mm',
-      'browser/ui/cocoa/infobars/infobar_utilities.h',
-      'browser/ui/cocoa/infobars/infobar_utilities.mm',
-      'browser/ui/cocoa/infobars/translate_infobar_base.h',
-      'browser/ui/cocoa/infobars/translate_infobar_base.mm',
-      'browser/ui/cocoa/infobars/translate_message_infobar_controller.h',
-      'browser/ui/cocoa/infobars/translate_message_infobar_controller.mm',
-      'browser/ui/cocoa/javascript_app_modal_dialog_cocoa.h',
-      'browser/ui/cocoa/javascript_app_modal_dialog_cocoa.mm',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field.h',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field.mm',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field_cell.h',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field_cell.mm',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field_editor.h',
-      'browser/ui/cocoa/location_bar/autocomplete_text_field_editor.mm',
-      'browser/ui/cocoa/location_bar/bubble_decoration.h',
-      'browser/ui/cocoa/location_bar/bubble_decoration.mm',
-      'browser/ui/cocoa/location_bar/content_setting_decoration.h',
-      'browser/ui/cocoa/location_bar/content_setting_decoration.mm',
-      'browser/ui/cocoa/location_bar/ev_bubble_decoration.h',
-      'browser/ui/cocoa/location_bar/ev_bubble_decoration.mm',
-      'browser/ui/cocoa/location_bar/image_decoration.h',
-      'browser/ui/cocoa/location_bar/image_decoration.mm',
-      'browser/ui/cocoa/location_bar/keyword_hint_decoration.h',
-      'browser/ui/cocoa/location_bar/keyword_hint_decoration.mm',
-      'browser/ui/cocoa/location_bar/location_bar_decoration.h',
-      'browser/ui/cocoa/location_bar/location_bar_decoration.mm',
-      'browser/ui/cocoa/location_bar/location_bar_view_mac.h',
-      'browser/ui/cocoa/location_bar/location_bar_view_mac.mm',
-      'browser/ui/cocoa/location_bar/location_icon_decoration.h',
-      'browser/ui/cocoa/location_bar/location_icon_decoration.mm',
-      'browser/ui/cocoa/location_bar/manage_passwords_decoration.h',
-      'browser/ui/cocoa/location_bar/manage_passwords_decoration.mm',
-      'browser/ui/cocoa/location_bar/page_action_decoration.h',
-      'browser/ui/cocoa/location_bar/page_action_decoration.mm',
-      'browser/ui/cocoa/location_bar/save_credit_card_decoration.h',
-      'browser/ui/cocoa/location_bar/save_credit_card_decoration.mm',
-      'browser/ui/cocoa/location_bar/selected_keyword_decoration.h',
-      'browser/ui/cocoa/location_bar/selected_keyword_decoration.mm',
-      'browser/ui/cocoa/location_bar/star_decoration.h',
-      'browser/ui/cocoa/location_bar/star_decoration.mm',
-      'browser/ui/cocoa/location_bar/translate_decoration.h',
-      'browser/ui/cocoa/location_bar/translate_decoration.mm',
-      'browser/ui/cocoa/location_bar/zoom_decoration.h',
-      'browser/ui/cocoa/location_bar/zoom_decoration.mm',
-      'browser/ui/cocoa/login_handler_cocoa.h',
-      'browser/ui/cocoa/login_handler_cocoa.mm',
-      'browser/ui/cocoa/main_menu_item.h',
-      'browser/ui/cocoa/menu_button.h',
-      'browser/ui/cocoa/menu_button.mm',
-      'browser/ui/cocoa/multi_key_equivalent_button.h',
-      'browser/ui/cocoa/multi_key_equivalent_button.mm',
-      'browser/ui/cocoa/new_tab_button.h',
-      'browser/ui/cocoa/new_tab_button.mm',
-      'browser/ui/cocoa/omnibox/omnibox_popup_cell.h',
-      'browser/ui/cocoa/omnibox/omnibox_popup_cell.mm',
-      'browser/ui/cocoa/omnibox/omnibox_popup_matrix.h',
-      'browser/ui/cocoa/omnibox/omnibox_popup_matrix.mm',
-      'browser/ui/cocoa/omnibox/omnibox_popup_separator_view.h',
-      'browser/ui/cocoa/omnibox/omnibox_popup_separator_view.mm',
-      'browser/ui/cocoa/omnibox/omnibox_popup_view_mac.h',
-      'browser/ui/cocoa/omnibox/omnibox_popup_view_mac.mm',
-      'browser/ui/cocoa/omnibox/omnibox_view_mac.h',
-      'browser/ui/cocoa/omnibox/omnibox_view_mac.mm',
-      'browser/ui/cocoa/one_click_signin_dialog_controller.h',
-      'browser/ui/cocoa/one_click_signin_dialog_controller.mm',
-      'browser/ui/cocoa/one_click_signin_view_controller.h',
-      'browser/ui/cocoa/one_click_signin_view_controller.mm',
-      'browser/ui/cocoa/passwords/account_avatar_fetcher_manager.h',
-      'browser/ui/cocoa/passwords/account_avatar_fetcher_manager.mm',
-      'browser/ui/cocoa/passwords/account_chooser_view_controller.h',
-      'browser/ui/cocoa/passwords/account_chooser_view_controller.mm',
-      'browser/ui/cocoa/passwords/auto_signin_view_controller.h',
-      'browser/ui/cocoa/passwords/auto_signin_view_controller.mm',
-      'browser/ui/cocoa/passwords/autosignin_prompt_view_controller.h',
-      'browser/ui/cocoa/passwords/autosignin_prompt_view_controller.mm',
-      'browser/ui/cocoa/passwords/base_passwords_content_view_controller.h',
-      'browser/ui/cocoa/passwords/base_passwords_content_view_controller.mm',
-      'browser/ui/cocoa/passwords/confirmation_password_saved_view_controller.h',
-      'browser/ui/cocoa/passwords/confirmation_password_saved_view_controller.mm',
-      'browser/ui/cocoa/passwords/credential_item_button.h',
-      'browser/ui/cocoa/passwords/credential_item_button.mm',
-      'browser/ui/cocoa/passwords/credentials_selection_view.h',
-      'browser/ui/cocoa/passwords/credentials_selection_view.mm',
-      'browser/ui/cocoa/passwords/manage_passwords_view_controller.h',
-      'browser/ui/cocoa/passwords/manage_passwords_view_controller.mm',
-      'browser/ui/cocoa/passwords/password_item_views.h',
-      'browser/ui/cocoa/passwords/password_prompt_view_bridge.h',
-      'browser/ui/cocoa/passwords/password_prompt_view_bridge.mm',
-      'browser/ui/cocoa/passwords/passwords_bubble_cocoa.h',
-      'browser/ui/cocoa/passwords/passwords_bubble_cocoa.mm',
-      'browser/ui/cocoa/passwords/passwords_bubble_controller.h',
-      'browser/ui/cocoa/passwords/passwords_bubble_controller.mm',
-      'browser/ui/cocoa/passwords/passwords_bubble_utils.h',
-      'browser/ui/cocoa/passwords/passwords_bubble_utils.mm',
-      'browser/ui/cocoa/passwords/passwords_list_view_controller.h',
-      'browser/ui/cocoa/passwords/passwords_list_view_controller.mm',
-      'browser/ui/cocoa/passwords/pending_password_view_controller.h',
-      'browser/ui/cocoa/passwords/pending_password_view_controller.mm',
-      'browser/ui/cocoa/passwords/save_pending_password_view_controller.h',
-      'browser/ui/cocoa/passwords/save_pending_password_view_controller.mm',
-      'browser/ui/cocoa/passwords/signin_promo_view_controller.h',
-      'browser/ui/cocoa/passwords/signin_promo_view_controller.mm',
-      'browser/ui/cocoa/passwords/update_pending_password_view_controller.h',
-      'browser/ui/cocoa/passwords/update_pending_password_view_controller.mm',
-      'browser/ui/cocoa/profiles/avatar_base_controller.h',
-      'browser/ui/cocoa/profiles/avatar_base_controller.mm',
-      'browser/ui/cocoa/profiles/avatar_button.h',
-      'browser/ui/cocoa/profiles/avatar_button.mm',
-      'browser/ui/cocoa/profiles/avatar_button_controller.h',
-      'browser/ui/cocoa/profiles/avatar_button_controller.mm',
-      'browser/ui/cocoa/profiles/avatar_icon_controller.h',
-      'browser/ui/cocoa/profiles/avatar_icon_controller.mm',
-      'browser/ui/cocoa/profiles/avatar_menu_bubble_controller.h',
-      'browser/ui/cocoa/profiles/avatar_menu_bubble_controller.mm',
-      'browser/ui/cocoa/profiles/profile_chooser_controller.h',
-      'browser/ui/cocoa/profiles/profile_chooser_controller.mm',
-      'browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.h',
-      'browser/ui/cocoa/profiles/profile_signin_confirmation_dialog_cocoa.mm',
-      'browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.h',
-      'browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller.mm',
-      'browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.h',
-      'browser/ui/cocoa/profiles/signin_view_controller_delegate_mac.mm',
-      'browser/ui/cocoa/profiles/user_manager_mac.h',
-      'browser/ui/cocoa/profiles/user_manager_mac.mm',
-      'browser/ui/cocoa/rect_path_utils.h',
-      'browser/ui/cocoa/rect_path_utils.mm',
-      'browser/ui/cocoa/restart_browser.h',
-      'browser/ui/cocoa/restart_browser.mm',
-      'browser/ui/cocoa/screen_capture_notification_ui_cocoa.h',
-      'browser/ui/cocoa/screen_capture_notification_ui_cocoa.mm',
-      'browser/ui/cocoa/session_crashed_bubble.mm',
-      'browser/ui/cocoa/simple_message_box_mac.mm',
-      'browser/ui/cocoa/single_web_contents_dialog_manager_cocoa.h',
-      'browser/ui/cocoa/single_web_contents_dialog_manager_cocoa.mm',
-      'browser/ui/cocoa/spinner_view.h',
-      'browser/ui/cocoa/spinner_view.mm',
-      'browser/ui/cocoa/sprite_view.h',
-      'browser/ui/cocoa/sprite_view.mm',
-      'browser/ui/cocoa/ssl_client_certificate_selector_cocoa.h',
-      'browser/ui/cocoa/ssl_client_certificate_selector_cocoa.mm',
-      'browser/ui/cocoa/status_bubble_mac.h',
-      'browser/ui/cocoa/status_bubble_mac.mm',
-      'browser/ui/cocoa/styled_text_field.h',
-      'browser/ui/cocoa/styled_text_field.mm',
-      'browser/ui/cocoa/styled_text_field_cell.h',
-      'browser/ui/cocoa/styled_text_field_cell.mm',
-      'browser/ui/cocoa/tab_contents/favicon_util_mac.h',
-      'browser/ui/cocoa/tab_contents/favicon_util_mac.mm',
-      'browser/ui/cocoa/tab_contents/overlayable_contents_controller.h',
-      'browser/ui/cocoa/tab_contents/overlayable_contents_controller.mm',
-      'browser/ui/cocoa/tab_contents/tab_contents_controller.h',
-      'browser/ui/cocoa/tab_contents/tab_contents_controller.mm',
-      'browser/ui/cocoa/tab_dialogs_cocoa.h',
-      'browser/ui/cocoa/tab_dialogs_cocoa.mm',
-      'browser/ui/cocoa/tab_modal_confirm_dialog_mac.h',
-      'browser/ui/cocoa/tab_modal_confirm_dialog_mac.mm',
-      'browser/ui/cocoa/tabs/alert_indicator_button_cocoa.h',
-      'browser/ui/cocoa/tabs/alert_indicator_button_cocoa.mm',
-      'browser/ui/cocoa/tabs/tab_controller.h',
-      'browser/ui/cocoa/tabs/tab_controller.mm',
-      'browser/ui/cocoa/tabs/tab_strip_background_view.h',
-      'browser/ui/cocoa/tabs/tab_strip_background_view.mm',
-      'browser/ui/cocoa/tabs/tab_strip_controller.h',
-      'browser/ui/cocoa/tabs/tab_strip_controller.mm',
-      'browser/ui/cocoa/tabs/tab_strip_drag_controller.h',
-      'browser/ui/cocoa/tabs/tab_strip_drag_controller.mm',
-      'browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.h',
-      'browser/ui/cocoa/tabs/tab_strip_model_observer_bridge.mm',
-      'browser/ui/cocoa/tabs/tab_strip_view.h',
-      'browser/ui/cocoa/tabs/tab_strip_view.mm',
-      'browser/ui/cocoa/tabs/tab_view.h',
-      'browser/ui/cocoa/tabs/tab_view.mm',
-      'browser/ui/cocoa/tabs/tab_window_controller.h',
-      'browser/ui/cocoa/tabs/tab_window_controller.mm',
-      'browser/ui/cocoa/task_manager_mac.h',
-      'browser/ui/cocoa/task_manager_mac.mm',
-      'browser/ui/cocoa/themed_window.h',
-      'browser/ui/cocoa/themed_window.mm',
-      'browser/ui/cocoa/toolbar/app_toolbar_button.h',
-      'browser/ui/cocoa/toolbar/app_toolbar_button.mm',
-      'browser/ui/cocoa/toolbar/app_toolbar_button_cell.h',
-      'browser/ui/cocoa/toolbar/app_toolbar_button_cell.mm',
-      'browser/ui/cocoa/toolbar/back_forward_menu_controller.h',
-      'browser/ui/cocoa/toolbar/back_forward_menu_controller.mm',
-      'browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.h',
-      'browser/ui/cocoa/toolbar/media_router_action_platform_delegate_cocoa.mm',
-      'browser/ui/cocoa/toolbar/reload_button_cocoa.h',
-      'browser/ui/cocoa/toolbar/reload_button_cocoa.mm',
-      'browser/ui/cocoa/toolbar/toolbar_button_cocoa.h',
-      'browser/ui/cocoa/toolbar/toolbar_button_cocoa.mm',
-      'browser/ui/cocoa/toolbar/toolbar_controller.h',
-      'browser/ui/cocoa/toolbar/toolbar_controller.mm',
-      'browser/ui/cocoa/toolbar/toolbar_view_cocoa.h',
-      'browser/ui/cocoa/toolbar/toolbar_view_cocoa.mm',
-      'browser/ui/cocoa/translate/translate_bubble_controller.h',
-      'browser/ui/cocoa/translate/translate_bubble_controller.mm',
-      'browser/ui/cocoa/url_drop_target.h',
-      'browser/ui/cocoa/url_drop_target.mm',
-      'browser/ui/cocoa/validation_message_bubble_cocoa.h',
-      'browser/ui/cocoa/validation_message_bubble_cocoa.mm',
-      'browser/ui/cocoa/validation_message_bubble_controller.h',
-      'browser/ui/cocoa/vertical_gradient_view.h',
-      'browser/ui/cocoa/vertical_gradient_view.mm',
-      'browser/ui/cocoa/view_id_util.h',
-      'browser/ui/cocoa/view_id_util.mm',
-      'browser/ui/cocoa/view_resizer.h',
-      'browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac.h',
-      'browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac.mm',
-      'browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.h',
-      'browser/ui/cocoa/website_settings/chooser_bubble_ui_cocoa.mm',
-      'browser/ui/cocoa/website_settings/permission_bubble_cocoa.h',
-      'browser/ui/cocoa/website_settings/permission_bubble_cocoa.mm',
-      'browser/ui/cocoa/website_settings/permission_bubble_controller.h',
-      'browser/ui/cocoa/website_settings/permission_bubble_controller.mm',
-      'browser/ui/cocoa/website_settings/permission_prompt_impl_views_mac.mm',
-      'browser/ui/cocoa/website_settings/permission_selector_button.h',
-      'browser/ui/cocoa/website_settings/permission_selector_button.mm',
-      'browser/ui/cocoa/website_settings/split_block_button.h',
-      'browser/ui/cocoa/website_settings/split_block_button.mm',
-      'browser/ui/cocoa/website_settings/website_settings_bubble_controller.h',
-      'browser/ui/cocoa/website_settings/website_settings_bubble_controller.mm',
-      'browser/ui/cocoa/website_settings/website_settings_utils_cocoa.h',
-      'browser/ui/cocoa/website_settings/website_settings_utils_cocoa.mm',
-      'browser/ui/cocoa/window_size_autosaver.h',
-      'browser/ui/cocoa/window_size_autosaver.mm',
-      # TODO(estade): this class should be deleted in favor of a combobox model.
-      # See crbug.com/590850
-      'browser/ui/content_settings/content_setting_media_menu_model.cc',
-      'browser/ui/content_settings/content_setting_media_menu_model.h',
-      'browser/ui/proximity_auth/proximity_auth_error_bubble_stub.cc',
-    ],
-    # Files used only on desktop systems (not iOS, Android, ChromeOS).
-    'chrome_browser_ui_desktop_sources': [
-      'browser/ui/avatar_button_error_controller.cc',
-      'browser/ui/avatar_button_error_controller.h',
-      'browser/ui/avatar_button_error_controller_delegate.h',
-      'browser/ui/startup/default_browser_infobar_delegate.cc',
-      'browser/ui/startup/default_browser_infobar_delegate.h',
-      'browser/ui/startup/default_browser_prompt.cc',
-      'browser/ui/startup/default_browser_prompt.h',
-      'browser/ui/startup/default_browser_prompt_win.cc',
-      'browser/ui/sync/one_click_signin_links_delegate.h',
-      'browser/ui/sync/one_click_signin_links_delegate_impl.cc',
-      'browser/ui/sync/one_click_signin_links_delegate_impl.h',
-      'browser/ui/sync/one_click_signin_sync_observer.cc',
-      'browser/ui/sync/one_click_signin_sync_observer.h',
-      'browser/ui/sync/one_click_signin_sync_starter.cc',
-      'browser/ui/sync/one_click_signin_sync_starter.h',
-      'browser/ui/views/frame/avatar_button_manager.cc',
-      'browser/ui/views/frame/avatar_button_manager.h',
-      'browser/ui/views/profiles/avatar_button_delegate.h',
-      'browser/ui/views/profiles/avatar_button_style.h',
-      'browser/ui/views/profiles/new_avatar_button.cc',
-      'browser/ui/views/profiles/new_avatar_button.h',
-      'browser/ui/webui/app_launcher_page_ui.cc',
-      'browser/ui/webui/app_launcher_page_ui.h',
-      'browser/ui/webui/settings/settings_default_browser_handler.cc',
-      'browser/ui/webui/settings/settings_default_browser_handler.h',
-      'browser/ui/webui/settings/system_handler.cc',
-      'browser/ui/webui/settings/system_handler.h',
-      'browser/ui/webui/settings_utils_linux.cc',
-      'browser/ui/webui/settings_utils_mac.mm',
-      'browser/ui/webui/settings_utils_win.cc',
-      'browser/ui/webui/signin/inline_login_handler.cc',
-      'browser/ui/webui/signin/inline_login_handler.h',
-      'browser/ui/webui/signin/inline_login_handler_impl.cc',
-      'browser/ui/webui/signin/inline_login_handler_impl.h',
-      'browser/ui/webui/signin/inline_login_ui.cc',
-      'browser/ui/webui/signin/inline_login_ui.h',
-      'browser/ui/webui/signin/md_user_manager_ui.cc',
-      'browser/ui/webui/signin/md_user_manager_ui.h',
-      'browser/ui/webui/signin/signin_create_profile_handler.cc',
-      'browser/ui/webui/signin/signin_create_profile_handler.h',
-      'browser/ui/webui/signin/signin_supervised_user_import_handler.cc',
-      'browser/ui/webui/signin/signin_supervised_user_import_handler.h',
-      'browser/ui/webui/signin/sync_confirmation_handler.cc',
-      'browser/ui/webui/signin/sync_confirmation_handler.h',
-      'browser/ui/webui/signin/sync_confirmation_ui.cc',
-      'browser/ui/webui/signin/sync_confirmation_ui.h',
-      'browser/ui/webui/signin/user_manager_screen_handler.cc',
-      'browser/ui/webui/signin/user_manager_screen_handler.h',
-      'browser/ui/webui/signin/user_manager_ui.cc',
-      'browser/ui/webui/signin/user_manager_ui.h',
-    ],
-    # Desktop Linux. Assume aura/ash/views/x11.
-    'chrome_browser_ui_desktop_linux_sources': [
-      'browser/ui/input_method/input_method_engine.cc',
-      'browser/ui/input_method/input_method_engine.h',
-      'browser/ui/input_method/input_method_engine_base.cc',
-      'browser/ui/input_method/input_method_engine_base.h',
-      'browser/ui/views/apps/chrome_app_window_client_views_linux.cc',
-      'browser/ui/views/first_run_dialog.cc',
-      'browser/ui/views/first_run_dialog.h',
-      'browser/ui/views/frame/browser_desktop_window_tree_host.h',
-      'browser/ui/views/frame/browser_desktop_window_tree_host_x11.cc',
-      'browser/ui/views/frame/browser_desktop_window_tree_host_x11.h',
-      'browser/ui/views/frame/desktop_browser_frame_auralinux.cc',
-      'browser/ui/views/frame/desktop_browser_frame_auralinux.h',
-      'browser/ui/views/frame/global_menu_bar_registrar_x11.cc',
-      'browser/ui/views/frame/global_menu_bar_registrar_x11.h',
-      'browser/ui/views/frame/global_menu_bar_x11.cc',
-      'browser/ui/views/frame/global_menu_bar_x11.h',
-      'browser/ui/views/frame/native_browser_frame_factory_auralinux.cc',
-      'browser/ui/views/javascript_app_modal_dialog_views_x11.cc',
-      'browser/ui/views/javascript_app_modal_dialog_views_x11.h',
-      'browser/ui/views/status_icons/status_icon_linux_wrapper.cc',
-      'browser/ui/views/status_icons/status_icon_linux_wrapper.h',
-      'browser/ui/webui/help/version_updater_basic.cc',
-      'browser/ui/webui/help/version_updater_basic.h',
-    ],
-    # Files used on iOS. iOS uses only these files and does not share other
-    # lists, so a file may appear here and in the non_ios_sources also.
-    'chrome_browser_ui_ios_sources': [
-      'browser/ui/profile_error_dialog.cc',
-      'browser/ui/profile_error_dialog.h',
-    ],
-    # Counts desktop Linux and ChromeOS.
-    'chrome_browser_ui_linux_sources': [
-      'browser/ui/certificate_dialogs.cc',
-      'browser/ui/certificate_dialogs.h',
-      'browser/ui/webui/certificate_viewer_ui.cc',
-      'browser/ui/webui/certificate_viewer_ui.h',
-      'browser/ui/webui/certificate_viewer_webui.cc',
-      'browser/ui/webui/certificate_viewer_webui.h',
-    ],
-    'chrome_browser_ui_mac_sources': [
-      'browser/ui/certificate_viewer_mac.h',
-      'browser/ui/certificate_viewer_mac.mm',
-      'browser/ui/chrome_style.cc',
-      'browser/ui/chrome_style.h',
-      'browser/ui/cocoa/accelerator_utils_cocoa.mm',
-      'browser/ui/cocoa/accelerators_cocoa.h',
-      'browser/ui/cocoa/accelerators_cocoa.mm',
-      'browser/ui/cocoa/apps/app_shim_menu_controller_mac.h',
-      'browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm',
-      'browser/ui/cocoa/apps/quit_with_apps_controller_mac.cc',
-      'browser/ui/cocoa/apps/quit_with_apps_controller_mac.h',
-      'browser/ui/cocoa/apps/titlebar_background_view.h',
-      'browser/ui/cocoa/apps/titlebar_background_view.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_menu_bridge.h',
-      'browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm',
-      'browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.h',
-      'browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm',
-      'browser/ui/cocoa/browser_window_command_handler.h',
-      'browser/ui/cocoa/browser_window_command_handler.mm',
-      'browser/ui/cocoa/chrome_command_dispatcher_delegate.h',
-      'browser/ui/cocoa/chrome_command_dispatcher_delegate.mm',
-      'browser/ui/cocoa/color_chooser_mac.mm',
-      'browser/ui/cocoa/confirm_quit.h',
-      'browser/ui/cocoa/confirm_quit_panel_controller.h',
-      'browser/ui/cocoa/confirm_quit_panel_controller.mm',
-      'browser/ui/cocoa/dock_icon.h',
-      'browser/ui/cocoa/dock_icon.mm',
-      'browser/ui/cocoa/download/download_item_drag_mac.mm',
-      'browser/ui/cocoa/download/download_util_mac.h',
-      'browser/ui/cocoa/download/download_util_mac.mm',
-      'browser/ui/cocoa/first_run_dialog.h',
-      'browser/ui/cocoa/first_run_dialog.mm',
-      'browser/ui/cocoa/handoff_active_url_observer.cc',
-      'browser/ui/cocoa/handoff_active_url_observer.h',
-      'browser/ui/cocoa/handoff_active_url_observer_bridge.h',
-      'browser/ui/cocoa/handoff_active_url_observer_bridge.mm',
-      'browser/ui/cocoa/handoff_active_url_observer_delegate.h',
-      'browser/ui/cocoa/history_menu_bridge.h',
-      'browser/ui/cocoa/history_menu_bridge.mm',
-      'browser/ui/cocoa/history_menu_cocoa_controller.h',
-      'browser/ui/cocoa/history_menu_cocoa_controller.mm',
-      'browser/ui/cocoa/history_overlay_controller.h',
-      'browser/ui/cocoa/history_overlay_controller.mm',
-      'browser/ui/cocoa/key_equivalent_constants.h',
-      'browser/ui/cocoa/key_equivalent_constants.mm',
-      'browser/ui/cocoa/keystone_infobar_delegate.h',
-      'browser/ui/cocoa/keystone_infobar_delegate.mm',
-      'browser/ui/cocoa/l10n_util.h',
-      'browser/ui/cocoa/l10n_util.mm',
-      'browser/ui/cocoa/last_active_browser_cocoa.cc',
-      'browser/ui/cocoa/last_active_browser_cocoa.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_bridge.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_bridge.mm',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_cocoa.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_cocoa.mm',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_controller.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_controller.mm',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_controller_deprecated.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_controller_deprecated.mm',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_item.h',
-      'browser/ui/cocoa/media_picker/desktop_media_picker_item.mm',
-      'browser/ui/cocoa/native_window_tracker_cocoa.h',
-      'browser/ui/cocoa/native_window_tracker_cocoa.mm',
-      'browser/ui/cocoa/notifications/message_center_tray_bridge.h',
-      'browser/ui/cocoa/notifications/message_center_tray_bridge.mm',
-      'browser/ui/cocoa/nsmenuitem_additions.h',
-      'browser/ui/cocoa/nsmenuitem_additions.mm',
-      'browser/ui/cocoa/profiles/profile_menu_controller.h',
-      'browser/ui/cocoa/profiles/profile_menu_controller.mm',
-      'browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.h',
-      'browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac.mm',
-      'browser/ui/cocoa/status_icons/status_icon_mac.h',
-      'browser/ui/cocoa/status_icons/status_icon_mac.mm',
-      'browser/ui/cocoa/status_icons/status_tray_mac.h',
-      'browser/ui/cocoa/status_icons/status_tray_mac.mm',
-      'browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h',
-      'browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm',
-      'browser/ui/cocoa/tab_contents/sad_tab_controller.h',
-      'browser/ui/cocoa/tab_contents/sad_tab_controller.mm',
-      'browser/ui/cocoa/tab_contents/sad_tab_view_cocoa.h',
-      'browser/ui/cocoa/tab_contents/sad_tab_view_cocoa.mm',
-      'browser/ui/cocoa/tab_contents/web_drag_bookmark_handler_mac.h',
-      'browser/ui/cocoa/tab_contents/web_drag_bookmark_handler_mac.mm',
-      'browser/ui/cocoa/ui_localizer.h',
-      'browser/ui/cocoa/ui_localizer.mm',
-      'browser/ui/cocoa/web_contents_modal_dialog_host_cocoa.h',
-      'browser/ui/cocoa/web_contents_modal_dialog_host_cocoa.mm',
-      # TODO(estade): this class should be folded into
-      # manage_passwords_decoration.mm
-      'browser/ui/passwords/manage_passwords_icon.cc',
-      'browser/ui/passwords/manage_passwords_icon.h',
-      'browser/ui/web_contents_sizer.mm',
-      'browser/ui/webui/cast/cast_ui.cc',
-      'browser/ui/webui/cast/cast_ui.h',
-    ],
-    'chrome_browser_ui_media_router_sources': [
-      'browser/ui/toolbar/media_router_action.cc',
-      'browser/ui/toolbar/media_router_action.h',
-      'browser/ui/toolbar/media_router_action_platform_delegate.h',
-      'browser/ui/toolbar/media_router_contextual_menu.cc',
-      'browser/ui/toolbar/media_router_contextual_menu.h',
-      'browser/ui/views/toolbar/media_router_action_platform_delegate_views.cc',
-      'browser/ui/views/toolbar/media_router_action_platform_delegate_views.h',
-      'browser/ui/webui/media_router/media_cast_mode.cc',
-      'browser/ui/webui/media_router/media_cast_mode.h',
-      'browser/ui/webui/media_router/media_router_dialog_controller_impl.cc',
-      'browser/ui/webui/media_router/media_router_dialog_controller_impl.h',
-      'browser/ui/webui/media_router/media_router_localized_strings_provider.cc',
-      'browser/ui/webui/media_router/media_router_localized_strings_provider.h',
-      'browser/ui/webui/media_router/media_router_resources_provider.cc',
-      'browser/ui/webui/media_router/media_router_resources_provider.h',
-      'browser/ui/webui/media_router/media_router_ui.cc',
-      'browser/ui/webui/media_router/media_router_ui.h',
-      'browser/ui/webui/media_router/media_router_webui_message_handler.cc',
-      'browser/ui/webui/media_router/media_router_webui_message_handler.h',
-      'browser/ui/webui/media_router/media_sink_with_cast_modes.cc',
-      'browser/ui/webui/media_router/media_sink_with_cast_modes.h',
-      'browser/ui/webui/media_router/query_result_manager.cc',
-      'browser/ui/webui/media_router/query_result_manager.h',
-    ],
-    'chrome_browser_ui_non_mac_sources': [
-      'browser/ui/web_contents_sizer.cc',
-    ],
-    'chrome_browser_ui_non_mobile_sources': [
-      'browser/ui/apps/app_info_dialog.h',
-      'browser/ui/apps/chrome_app_delegate.cc',
-      'browser/ui/apps/chrome_app_delegate.h',
-      'browser/ui/apps/chrome_app_window_client.cc',
-      'browser/ui/apps/chrome_app_window_client.h',
-      'browser/ui/apps/directory_access_confirmation_dialog.cc',
-      'browser/ui/apps/directory_access_confirmation_dialog.h',
-      'browser/ui/blocked_content/app_modal_dialog_helper.cc',
-      'browser/ui/blocked_content/app_modal_dialog_helper.h',
-      'browser/ui/bluetooth/bluetooth_chooser_controller.cc',
-      'browser/ui/bluetooth/bluetooth_chooser_controller.h',
-      'browser/ui/bluetooth/bluetooth_chooser_desktop.cc',
-      'browser/ui/bluetooth/bluetooth_chooser_desktop.h',
-      'browser/ui/bluetooth/chrome_extension_bluetooth_chooser.cc',
-      'browser/ui/bluetooth/chrome_extension_bluetooth_chooser.h',
-      'browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.cc',
-      'browser/ui/bookmarks/bookmark_bubble_sign_in_delegate.h',
-      'browser/ui/bookmarks/bookmark_context_menu_controller.cc',
-      'browser/ui/bookmarks/bookmark_context_menu_controller.h',
-      'browser/ui/bookmarks/bookmark_drag_drop.cc',
-      'browser/ui/bookmarks/bookmark_drag_drop.h',
-      'browser/ui/bookmarks/bookmark_tab_helper.cc',
-      'browser/ui/bookmarks/bookmark_tab_helper.h',
-      'browser/ui/bookmarks/bookmark_tab_helper_delegate.cc',
-      'browser/ui/bookmarks/bookmark_tab_helper_delegate.h',
-      'browser/ui/bookmarks/bookmark_utils_desktop.cc',
-      'browser/ui/bookmarks/bookmark_utils_desktop.h',
-      'browser/ui/bookmarks/enhanced_bookmark_key_service.cc',
-      'browser/ui/bookmarks/enhanced_bookmark_key_service.h',
-      'browser/ui/bookmarks/enhanced_bookmark_key_service_factory.cc',
-      'browser/ui/bookmarks/enhanced_bookmark_key_service_factory.h',
-      'browser/ui/browser.cc',
-      'browser/ui/browser.h',
-      'browser/ui/browser_command_controller.cc',
-      'browser/ui/browser_command_controller.h',
-      'browser/ui/browser_commands.cc',
-      'browser/ui/browser_commands.h',
-      'browser/ui/browser_content_setting_bubble_model_delegate.cc',
-      'browser/ui/browser_content_setting_bubble_model_delegate.h',
-      'browser/ui/browser_finder.cc',
-      'browser/ui/browser_finder.h',
-      'browser/ui/browser_instant_controller.cc',
-      'browser/ui/browser_instant_controller.h',
-      'browser/ui/browser_list.cc',
-      'browser/ui/browser_list.h',
-      'browser/ui/browser_live_tab_context.cc',
-      'browser/ui/browser_live_tab_context.h',
-      'browser/ui/browser_navigator.cc',
-      'browser/ui/browser_navigator.h',
-      'browser/ui/browser_otr_state.cc',
-      'browser/ui/browser_otr_state.h',
-      'browser/ui/browser_tab_restorer.cc',
-      'browser/ui/browser_tab_strip_model_delegate.cc',
-      'browser/ui/browser_tab_strip_model_delegate.h',
-      'browser/ui/browser_tab_strip_tracker.cc',
-      'browser/ui/browser_tab_strip_tracker.h',
-      'browser/ui/browser_tab_strip_tracker_delegate.h',
-      'browser/ui/browser_tabrestore.cc',
-      'browser/ui/browser_tabrestore.h',
-      'browser/ui/browser_tabstrip.cc',
-      'browser/ui/browser_tabstrip.h',
-      'browser/ui/browser_toolbar_model_delegate.cc',
-      'browser/ui/browser_toolbar_model_delegate.h',
-      'browser/ui/browser_view_prefs.cc',
-      'browser/ui/browser_view_prefs.h',
-      'browser/ui/browser_window_state.cc',
-      'browser/ui/browser_window_state.h',
-      'browser/ui/chrome_bubble_manager.cc',
-      'browser/ui/chrome_bubble_manager.h',
-      'browser/ui/chrome_pages.cc',
-      'browser/ui/chrome_pages.h',
-      'browser/ui/chrome_web_modal_dialog_manager_delegate.cc',
-      'browser/ui/chrome_web_modal_dialog_manager_delegate.h',
-      'browser/ui/collected_cookies_infobar_delegate.cc',
-      'browser/ui/collected_cookies_infobar_delegate.h',
-      'browser/ui/confirm_bubble_model.cc',
-      'browser/ui/confirm_bubble_model.h',
-      'browser/ui/content_settings/content_setting_bubble_model.cc',
-      'browser/ui/content_settings/content_setting_bubble_model.h',
-      'browser/ui/content_settings/content_setting_bubble_model_delegate.h',
-      'browser/ui/content_settings/content_setting_image_model.cc',
-      'browser/ui/content_settings/content_setting_image_model.h',
-      'browser/ui/exclusive_access/exclusive_access_bubble.cc',
-      'browser/ui/exclusive_access/exclusive_access_bubble.h',
-      'browser/ui/exclusive_access/exclusive_access_bubble_type.cc',
-      'browser/ui/exclusive_access/exclusive_access_bubble_type.h',
-      'browser/ui/exclusive_access/exclusive_access_context.cc',
-      'browser/ui/exclusive_access/exclusive_access_context.h',
-      'browser/ui/exclusive_access/exclusive_access_controller_base.cc',
-      'browser/ui/exclusive_access/exclusive_access_controller_base.h',
-      'browser/ui/exclusive_access/exclusive_access_manager.cc',
-      'browser/ui/exclusive_access/exclusive_access_manager.h',
-      'browser/ui/exclusive_access/fullscreen_controller.cc',
-      'browser/ui/exclusive_access/fullscreen_controller.h',
-      'browser/ui/exclusive_access/fullscreen_within_tab_helper.cc',
-      'browser/ui/exclusive_access/fullscreen_within_tab_helper.h',
-      'browser/ui/exclusive_access/mouse_lock_controller.cc',
-      'browser/ui/exclusive_access/mouse_lock_controller.h',
-      'browser/ui/fast_unload_controller.cc',
-      'browser/ui/fast_unload_controller.h',
-      'browser/ui/find_bar/find_bar_controller.cc',
-      'browser/ui/find_bar/find_bar_controller.h',
-      'browser/ui/global_error/global_error.cc',
-      'browser/ui/global_error/global_error.h',
-      'browser/ui/global_error/global_error_bubble_view_base.h',
-      'browser/ui/global_error/global_error_service.cc',
-      'browser/ui/global_error/global_error_service.h',
-      'browser/ui/global_error/global_error_service_factory.cc',
-      'browser/ui/global_error/global_error_service_factory.h',
-      'browser/ui/infobar_container_delegate.cc',
-      'browser/ui/infobar_container_delegate.h',
-      'browser/ui/layout_constants.cc',
-      'browser/ui/layout_constants.h',
-      'browser/ui/location_bar/location_bar.cc',
-      'browser/ui/location_bar/location_bar.h',
-      'browser/ui/location_bar/location_bar_util.cc',
-      'browser/ui/location_bar/location_bar_util.h',
-      'browser/ui/native_window_tracker.h',
-      'browser/ui/passwords/manage_passwords_bubble_model.cc',
-      'browser/ui/passwords/manage_passwords_bubble_model.h',
-      'browser/ui/passwords/manage_passwords_icon_view.h',
-      'browser/ui/passwords/manage_passwords_ui_controller.cc',
-      'browser/ui/passwords/manage_passwords_ui_controller.h',
-      'browser/ui/passwords/manage_passwords_view_utils_desktop.cc',
-      'browser/ui/passwords/manage_passwords_view_utils_desktop.h',
-      'browser/ui/passwords/password_dialog_controller.h',
-      'browser/ui/passwords/password_dialog_controller_impl.cc',
-      'browser/ui/passwords/password_dialog_controller_impl.h',
-      'browser/ui/passwords/password_dialog_prompts.h',
-      'browser/ui/passwords/passwords_client_ui_delegate.cc',
-      'browser/ui/passwords/passwords_client_ui_delegate.h',
-      'browser/ui/passwords/passwords_model_delegate.cc',
-      'browser/ui/passwords/passwords_model_delegate.h',
-      'browser/ui/pdf/adobe_reader_info_win.cc',
-      'browser/ui/pdf/adobe_reader_info_win.h',
-      'browser/ui/pdf/chrome_pdf_web_contents_helper_client.cc',
-      'browser/ui/pdf/chrome_pdf_web_contents_helper_client.h',
-      'browser/ui/pdf/pdf_unsupported_feature.cc',
-      'browser/ui/pdf/pdf_unsupported_feature.h',
-      'browser/ui/sad_tab.cc',
-      'browser/ui/sad_tab.h',
-      'browser/ui/sad_tab_helper.cc',
-      'browser/ui/sad_tab_helper.h',
-      'browser/ui/sad_tab_types.h',
-      'browser/ui/scoped_tabbed_browser_displayer.cc',
-      'browser/ui/scoped_tabbed_browser_displayer.h',
-      'browser/ui/search/instant_controller.cc',
-      'browser/ui/search/instant_controller.h',
-      'browser/ui/search/search_delegate.cc',
-      'browser/ui/search/search_delegate.h',
-      'browser/ui/settings_window_manager.cc',
-      'browser/ui/settings_window_manager.h',
-      'browser/ui/settings_window_manager_observer.h',
-      'browser/ui/signin_view_controller.cc',
-      'browser/ui/signin_view_controller.h',
-      'browser/ui/signin_view_controller_delegate.cc',
-      'browser/ui/signin_view_controller_delegate.h',
-      'browser/ui/singleton_tabs.cc',
-      'browser/ui/singleton_tabs.h',
-      'browser/ui/startup/bad_flags_prompt.cc',
-      'browser/ui/startup/bad_flags_prompt.h',
-      'browser/ui/startup/google_api_keys_infobar_delegate.cc',
-      'browser/ui/startup/google_api_keys_infobar_delegate.h',
-      'browser/ui/startup/obsolete_system_infobar_delegate.cc',
-      'browser/ui/startup/obsolete_system_infobar_delegate.h',
-      'browser/ui/startup/session_crashed_infobar_delegate.cc',
-      'browser/ui/startup/session_crashed_infobar_delegate.h',
-      'browser/ui/startup/startup_browser_creator.cc',
-      'browser/ui/startup/startup_browser_creator.h',
-      'browser/ui/startup/startup_browser_creator_impl.cc',
-      'browser/ui/startup/startup_browser_creator_impl.h',
-      'browser/ui/startup/startup_tab.cc',
-      'browser/ui/startup/startup_tab.h',
-      'browser/ui/startup/startup_types.h',
-      'browser/ui/sync/browser_synced_window_delegate.cc',
-      'browser/ui/sync/browser_synced_window_delegate.h',
-      'browser/ui/sync/browser_synced_window_delegates_getter.cc',
-      'browser/ui/sync/browser_synced_window_delegates_getter.h',
-      'browser/ui/sync/sync_promo_ui.cc',
-      'browser/ui/sync/sync_promo_ui.h',
-      'browser/ui/tab_contents/tab_contents_iterator.cc',
-      'browser/ui/tab_contents/tab_contents_iterator.h',
-      'browser/ui/tab_modal_confirm_dialog_delegate.cc',
-      'browser/ui/tab_modal_confirm_dialog_delegate.h',
-      'browser/ui/tabs/hover_tab_selector.cc',
-      'browser/ui/tabs/hover_tab_selector.h',
-      'browser/ui/tabs/pinned_tab_codec.cc',
-      'browser/ui/tabs/pinned_tab_codec.h',
-      'browser/ui/tabs/pinned_tab_service.cc',
-      'browser/ui/tabs/pinned_tab_service.h',
-      'browser/ui/tabs/pinned_tab_service_factory.cc',
-      'browser/ui/tabs/pinned_tab_service_factory.h',
-      'browser/ui/tabs/tab_menu_model.cc',
-      'browser/ui/tabs/tab_menu_model.h',
-      'browser/ui/tabs/tab_strip_model.cc',
-      'browser/ui/tabs/tab_strip_model.h',
-      'browser/ui/tabs/tab_strip_model_delegate.h',
-      'browser/ui/tabs/tab_strip_model_observer.cc',
-      'browser/ui/tabs/tab_strip_model_observer.h',
-      'browser/ui/tabs/tab_strip_model_order_controller.cc',
-      'browser/ui/tabs/tab_strip_model_order_controller.h',
-      'browser/ui/tabs/tab_strip_model_stats_recorder.cc',
-      'browser/ui/tabs/tab_strip_model_stats_recorder.h',
-      'browser/ui/tabs/tab_strip_model_utils.cc',
-      'browser/ui/tabs/tab_strip_model_utils.h',
-      'browser/ui/tabs/tab_utils.cc',
-      'browser/ui/tabs/tab_utils.h',
-      'browser/ui/task_manager/task_manager_columns.cc',
-      'browser/ui/task_manager/task_manager_columns.h',
-      'browser/ui/task_manager/task_manager_table_model.cc',
-      'browser/ui/task_manager/task_manager_table_model.h',
-      'browser/ui/toolbar/app_menu_icon_controller.cc',
-      'browser/ui/toolbar/app_menu_icon_controller.h',
-      'browser/ui/toolbar/app_menu_icon_painter.cc',
-      'browser/ui/toolbar/app_menu_icon_painter.h',
-      'browser/ui/toolbar/app_menu_model.cc',
-      'browser/ui/toolbar/app_menu_model.h',
-      'browser/ui/toolbar/back_forward_menu_model.cc',
-      'browser/ui/toolbar/back_forward_menu_model.h',
-      'browser/ui/toolbar/bookmark_sub_menu_model.cc',
-      'browser/ui/toolbar/bookmark_sub_menu_model.h',
-      'browser/ui/toolbar/component_toolbar_actions_factory.cc',
-      'browser/ui/toolbar/component_toolbar_actions_factory.h',
-      'browser/ui/toolbar/recent_tabs_sub_menu_model.cc',
-      'browser/ui/toolbar/recent_tabs_sub_menu_model.h',
-      'browser/ui/toolbar/toolbar_action_view_controller.h',
-      'browser/ui/toolbar/toolbar_action_view_delegate.h',
-      'browser/ui/toolbar/toolbar_actions_bar.cc',
-      'browser/ui/toolbar/toolbar_actions_bar.h',
-      'browser/ui/toolbar/toolbar_actions_bar_bubble_delegate.h',
-      'browser/ui/toolbar/toolbar_actions_bar_delegate.h',
-      'browser/ui/toolbar/toolbar_actions_bar_observer.h',
-      'browser/ui/translate/translate_bubble_factory.cc',
-      'browser/ui/translate/translate_bubble_factory.h',
-      'browser/ui/uma_browsing_activity_observer.cc',
-      'browser/ui/uma_browsing_activity_observer.h',
-      'browser/ui/unload_controller.cc',
-      'browser/ui/unload_controller.h',
-      'browser/ui/user_manager.cc',
-      'browser/ui/user_manager.h',
-      'browser/ui/website_settings/chooser_bubble_delegate.cc',
-      'browser/ui/website_settings/chooser_bubble_delegate.h',
-      'browser/ui/website_settings/permission_menu_model.cc',
-      'browser/ui/website_settings/permission_menu_model.h',
-      'browser/ui/website_settings/permission_prompt.h',
-      'browser/ui/website_settings/website_settings_infobar_delegate.cc',
-      'browser/ui/website_settings/website_settings_infobar_delegate.h',
-      'browser/ui/webui/app_launcher_login_handler.cc',
-      'browser/ui/webui/app_launcher_login_handler.h',
-      'browser/ui/webui/bookmarks_ui.cc',
-      'browser/ui/webui/bookmarks_ui.h',
-      'browser/ui/webui/chrome_web_contents_handler.cc',
-      'browser/ui/webui/chrome_web_contents_handler.h',
-      'browser/ui/webui/constrained_web_dialog_delegate_base.cc',
-      'browser/ui/webui/constrained_web_dialog_delegate_base.h',
-      'browser/ui/webui/devtools_ui.cc',
-      'browser/ui/webui/devtools_ui.h',
-      'browser/ui/webui/extensions/extension_loader_handler.cc',
-      'browser/ui/webui/extensions/extension_loader_handler.h',
-      'browser/ui/webui/extensions/extension_settings_handler.cc',
-      'browser/ui/webui/extensions/extension_settings_handler.h',
-      'browser/ui/webui/extensions/extensions_ui.cc',
-      'browser/ui/webui/extensions/extensions_ui.h',
-      'browser/ui/webui/extensions/install_extension_handler.cc',
-      'browser/ui/webui/extensions/install_extension_handler.h',
-      'browser/ui/webui/foreign_session_handler.cc',
-      'browser/ui/webui/foreign_session_handler.h',
-      'browser/ui/webui/help/help_handler.cc',
-      'browser/ui/webui/help/help_handler.h',
-      'browser/ui/webui/help/help_ui.cc',
-      'browser/ui/webui/help/help_ui.h',
-      'browser/ui/webui/help/help_utils_chromeos.cc',
-      'browser/ui/webui/help/help_utils_chromeos.h',
-      'browser/ui/webui/help/version_updater.h',
-      'browser/ui/webui/help/version_updater_chromeos.cc',
-      'browser/ui/webui/help/version_updater_chromeos.h',
-      'browser/ui/webui/help/version_updater_mac.h',
-      'browser/ui/webui/help/version_updater_mac.mm',
-      'browser/ui/webui/help/version_updater_win.cc',
-      'browser/ui/webui/history_login_handler.cc',
-      'browser/ui/webui/history_login_handler.h',
-      'browser/ui/webui/identity_internals_ui.cc',
-      'browser/ui/webui/identity_internals_ui.h',
-      'browser/ui/webui/inspect_ui.cc',
-      'browser/ui/webui/inspect_ui.h',
-      'browser/ui/webui/md_downloads/downloads_list_tracker.cc',
-      'browser/ui/webui/md_downloads/downloads_list_tracker.h',
-      'browser/ui/webui/md_downloads/md_downloads_dom_handler.cc',
-      'browser/ui/webui/md_downloads/md_downloads_dom_handler.h',
-      'browser/ui/webui/md_downloads/md_downloads_ui.cc',
-      'browser/ui/webui/md_downloads/md_downloads_ui.h',
-      'browser/ui/webui/md_feedback/md_feedback_dialog_controller.cc',
-      'browser/ui/webui/md_feedback/md_feedback_dialog_controller.h',
-      'browser/ui/webui/md_feedback/md_feedback_ui.cc',
-      'browser/ui/webui/md_feedback/md_feedback_ui.h',
-      'browser/ui/webui/md_history_ui.cc',
-      'browser/ui/webui/md_history_ui.h',
-      'browser/ui/webui/ntp/app_launcher_handler.cc',
-      'browser/ui/webui/ntp/app_launcher_handler.h',
-      'browser/ui/webui/ntp/app_resource_cache_factory.cc',
-      'browser/ui/webui/ntp/app_resource_cache_factory.h',
-      'browser/ui/webui/ntp/core_app_launcher_handler.cc',
-      'browser/ui/webui/ntp/core_app_launcher_handler.h',
-      'browser/ui/webui/ntp/favicon_webui_handler.cc',
-      'browser/ui/webui/ntp/favicon_webui_handler.h',
-      'browser/ui/webui/ntp/new_tab_ui.cc',
-      'browser/ui/webui/ntp/new_tab_ui.h',
-      'browser/ui/webui/ntp/ntp_resource_cache.cc',
-      'browser/ui/webui/ntp/ntp_resource_cache.h',
-      'browser/ui/webui/ntp/ntp_resource_cache_factory.cc',
-      'browser/ui/webui/ntp/ntp_resource_cache_factory.h',
-      'browser/ui/webui/options/autofill_options_handler.cc',
-      'browser/ui/webui/options/autofill_options_handler.h',
-      'browser/ui/webui/options/automatic_settings_reset_handler.cc',
-      'browser/ui/webui/options/automatic_settings_reset_handler.h',
-      'browser/ui/webui/options/browser_options_handler.cc',
-      'browser/ui/webui/options/browser_options_handler.h',
-      'browser/ui/webui/options/chromeos/accounts_options_handler.cc',
-      'browser/ui/webui/options/chromeos/accounts_options_handler.h',
-      'browser/ui/webui/options/chromeos/bluetooth_options_handler.cc',
-      'browser/ui/webui/options/chromeos/bluetooth_options_handler.h',
-      'browser/ui/webui/options/chromeos/change_picture_options_handler.cc',
-      'browser/ui/webui/options/chromeos/change_picture_options_handler.h',
-      'browser/ui/webui/options/chromeos/core_chromeos_options_handler.cc',
-      'browser/ui/webui/options/chromeos/core_chromeos_options_handler.h',
-      'browser/ui/webui/options/chromeos/cros_language_options_handler.cc',
-      'browser/ui/webui/options/chromeos/cros_language_options_handler.h',
-      'browser/ui/webui/options/chromeos/date_time_options_handler.cc',
-      'browser/ui/webui/options/chromeos/date_time_options_handler.h',
-      'browser/ui/webui/options/chromeos/display_options_handler.cc',
-      'browser/ui/webui/options/chromeos/display_options_handler.h',
-      'browser/ui/webui/options/chromeos/display_overscan_handler.cc',
-      'browser/ui/webui/options/chromeos/display_overscan_handler.h',
-      'browser/ui/webui/options/chromeos/internet_options_handler.cc',
-      'browser/ui/webui/options/chromeos/internet_options_handler.h',
-      'browser/ui/webui/options/chromeos/internet_options_handler_strings.cc',
-      'browser/ui/webui/options/chromeos/internet_options_handler_strings.h',
-      'browser/ui/webui/options/chromeos/keyboard_handler.cc',
-      'browser/ui/webui/options/chromeos/keyboard_handler.h',
-      'browser/ui/webui/options/chromeos/options_stylus_handler.cc',
-      'browser/ui/webui/options/chromeos/options_stylus_handler.h',
-      'browser/ui/webui/options/chromeos/pointer_handler.cc',
-      'browser/ui/webui/options/chromeos/pointer_handler.h',
-      'browser/ui/webui/options/chromeos/power_handler.cc',
-      'browser/ui/webui/options/chromeos/power_handler.h',
-      'browser/ui/webui/options/chromeos/proxy_handler.cc',
-      'browser/ui/webui/options/chromeos/proxy_handler.h',
-      'browser/ui/webui/options/chromeos/stats_options_handler.cc',
-      'browser/ui/webui/options/chromeos/stats_options_handler.h',
-      'browser/ui/webui/options/chromeos/storage_manager_handler.cc',
-      'browser/ui/webui/options/chromeos/storage_manager_handler.h',
-      'browser/ui/webui/options/chromeos/user_image_source.cc',
-      'browser/ui/webui/options/chromeos/user_image_source.h',
-      'browser/ui/webui/options/clear_browser_data_handler.cc',
-      'browser/ui/webui/options/clear_browser_data_handler.h',
-      'browser/ui/webui/options/content_settings_handler.cc',
-      'browser/ui/webui/options/content_settings_handler.h',
-      'browser/ui/webui/options/cookies_view_handler.cc',
-      'browser/ui/webui/options/cookies_view_handler.h',
-      'browser/ui/webui/options/core_options_handler.cc',
-      'browser/ui/webui/options/core_options_handler.h',
-      'browser/ui/webui/options/create_profile_handler.cc',
-      'browser/ui/webui/options/create_profile_handler.h',
-      'browser/ui/webui/options/easy_unlock_handler.cc',
-      'browser/ui/webui/options/easy_unlock_handler.h',
-      'browser/ui/webui/options/font_settings_handler.cc',
-      'browser/ui/webui/options/font_settings_handler.h',
-      'browser/ui/webui/options/font_settings_utils.h',
-      'browser/ui/webui/options/font_settings_utils_linux.cc',
-      'browser/ui/webui/options/font_settings_utils_mac.mm',
-      'browser/ui/webui/options/font_settings_utils_win.cc',
-      'browser/ui/webui/options/handler_options_handler.cc',
-      'browser/ui/webui/options/handler_options_handler.h',
-      'browser/ui/webui/options/help_overlay_handler.cc',
-      'browser/ui/webui/options/help_overlay_handler.h',
-      'browser/ui/webui/options/home_page_overlay_handler.cc',
-      'browser/ui/webui/options/home_page_overlay_handler.h',
-      'browser/ui/webui/options/import_data_handler.cc',
-      'browser/ui/webui/options/import_data_handler.h',
-      'browser/ui/webui/options/language_dictionary_overlay_handler.cc',
-      'browser/ui/webui/options/language_dictionary_overlay_handler.h',
-      'browser/ui/webui/options/language_options_handler.cc',
-      'browser/ui/webui/options/language_options_handler.h',
-      'browser/ui/webui/options/language_options_handler_common.cc',
-      'browser/ui/webui/options/language_options_handler_common.h',
-      'browser/ui/webui/options/manage_profile_handler.cc',
-      'browser/ui/webui/options/manage_profile_handler.h',
-      'browser/ui/webui/options/media_devices_selection_handler.cc',
-      'browser/ui/webui/options/media_devices_selection_handler.h',
-      'browser/ui/webui/options/options_ui.cc',
-      'browser/ui/webui/options/options_ui.h',
-      'browser/ui/webui/options/password_manager_handler.cc',
-      'browser/ui/webui/options/password_manager_handler.h',
-      'browser/ui/webui/options/pepper_flash_content_settings_utils.cc',
-      'browser/ui/webui/options/pepper_flash_content_settings_utils.h',
-      'browser/ui/webui/options/reset_profile_settings_handler.cc',
-      'browser/ui/webui/options/reset_profile_settings_handler.h',
-      'browser/ui/webui/options/search_engine_manager_handler.cc',
-      'browser/ui/webui/options/search_engine_manager_handler.h',
-      'browser/ui/webui/options/startup_pages_handler.cc',
-      'browser/ui/webui/options/startup_pages_handler.h',
-      'browser/ui/webui/options/supervised_user_create_confirm_handler.cc',
-      'browser/ui/webui/options/supervised_user_create_confirm_handler.h',
-      'browser/ui/webui/options/supervised_user_import_handler.cc',
-      'browser/ui/webui/options/supervised_user_import_handler.h',
-      'browser/ui/webui/options/supervised_user_learn_more_handler.cc',
-      'browser/ui/webui/options/supervised_user_learn_more_handler.h',
-      'browser/ui/webui/options/sync_setup_handler.cc',
-      'browser/ui/webui/options/sync_setup_handler.h',
-      'browser/ui/webui/policy_indicator_localized_strings_provider.cc',
-      'browser/ui/webui/policy_indicator_localized_strings_provider.h',
-      'browser/ui/webui/profile_helper.cc',
-      'browser/ui/webui/profile_helper.h',
-      'browser/ui/webui/profile_info_watcher.cc',
-      'browser/ui/webui/profile_info_watcher.h',
-      'browser/ui/webui/quota_internals/quota_internals_handler.cc',
-      'browser/ui/webui/quota_internals/quota_internals_handler.h',
-      'browser/ui/webui/quota_internals/quota_internals_proxy.cc',
-      'browser/ui/webui/quota_internals/quota_internals_proxy.h',
-      'browser/ui/webui/quota_internals/quota_internals_types.cc',
-      'browser/ui/webui/quota_internals/quota_internals_types.h',
-      'browser/ui/webui/quota_internals/quota_internals_ui.cc',
-      'browser/ui/webui/quota_internals/quota_internals_ui.h',
-      'browser/ui/webui/set_as_default_browser_ui_win.cc',
-      'browser/ui/webui/set_as_default_browser_ui_win.h',
-      'browser/ui/webui/settings/about_handler.cc',
-      'browser/ui/webui/settings/about_handler.h',
-      'browser/ui/webui/settings/appearance_handler.cc',
-      'browser/ui/webui/settings/appearance_handler.h',
-      'browser/ui/webui/settings/browser_lifetime_handler.cc',
-      'browser/ui/webui/settings/browser_lifetime_handler.h',
-      'browser/ui/webui/settings/chromeos/accessibility_handler.cc',
-      'browser/ui/webui/settings/chromeos/accessibility_handler.h',
-      'browser/ui/webui/settings/chromeos/change_picture_handler.cc',
-      'browser/ui/webui/settings/chromeos/change_picture_handler.h',
-      'browser/ui/webui/settings/chromeos/cups_printers_handler.cc',
-      'browser/ui/webui/settings/chromeos/cups_printers_handler.h',
-      'browser/ui/webui/settings/chromeos/device_keyboard_handler.cc',
-      'browser/ui/webui/settings/chromeos/device_keyboard_handler.h',
-      'browser/ui/webui/settings/chromeos/device_pointer_handler.cc',
-      'browser/ui/webui/settings/chromeos/device_pointer_handler.h',
-      'browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.cc',
-      'browser/ui/webui/settings/chromeos/easy_unlock_settings_handler.h',
-      'browser/ui/webui/settings/chromeos/internet_handler.cc',
-      'browser/ui/webui/settings/chromeos/internet_handler.h',
-      'browser/ui/webui/settings/downloads_handler.cc',
-      'browser/ui/webui/settings/downloads_handler.h',
-      'browser/ui/webui/settings/font_handler.cc',
-      'browser/ui/webui/settings/font_handler.h',
-      'browser/ui/webui/settings/languages_handler.cc',
-      'browser/ui/webui/settings/languages_handler.h',
-      'browser/ui/webui/settings/md_settings_localized_strings_provider.cc',
-      'browser/ui/webui/settings/md_settings_localized_strings_provider.h',
-      'browser/ui/webui/settings/md_settings_ui.cc',
-      'browser/ui/webui/settings/md_settings_ui.h',
-      'browser/ui/webui/settings/metrics_reporting_handler.cc',
-      'browser/ui/webui/settings/metrics_reporting_handler.h',
-      'browser/ui/webui/settings/people_handler.cc',
-      'browser/ui/webui/settings/people_handler.h',
-      'browser/ui/webui/settings/profile_info_handler.cc',
-      'browser/ui/webui/settings/profile_info_handler.h',
-      'browser/ui/webui/settings/protocol_handlers_handler.cc',
-      'browser/ui/webui/settings/protocol_handlers_handler.h',
-      'browser/ui/webui/settings/reset_settings_handler.cc',
-      'browser/ui/webui/settings/reset_settings_handler.h',
-      'browser/ui/webui/settings/search_engines_handler.cc',
-      'browser/ui/webui/settings/search_engines_handler.h',
-      'browser/ui/webui/settings/settings_clear_browsing_data_handler.cc',
-      'browser/ui/webui/settings/settings_clear_browsing_data_handler.h',
-      'browser/ui/webui/settings/settings_cookies_view_handler.cc',
-      'browser/ui/webui/settings/settings_cookies_view_handler.h',
-      'browser/ui/webui/settings/settings_manage_profile_handler.cc',
-      'browser/ui/webui/settings/settings_manage_profile_handler.h',
-      'browser/ui/webui/settings/settings_media_devices_selection_handler.cc',
-      'browser/ui/webui/settings/settings_media_devices_selection_handler.h',
-      'browser/ui/webui/settings/settings_page_ui_handler.cc',
-      'browser/ui/webui/settings/settings_page_ui_handler.h',
-      'browser/ui/webui/settings/settings_startup_pages_handler.cc',
-      'browser/ui/webui/settings/settings_startup_pages_handler.h',
-      'browser/ui/webui/settings/site_settings_handler.cc',
-      'browser/ui/webui/settings/site_settings_handler.h',
-      'browser/ui/webui/settings_utils.cc',
-      'browser/ui/webui/settings_utils.h',
-      'browser/ui/webui/signin/get_auth_frame.cc',
-      'browser/ui/webui/signin/get_auth_frame.h',
-      'browser/ui/webui/signin/login_ui_service.cc',
-      'browser/ui/webui/signin/login_ui_service.h',
-      'browser/ui/webui/signin/login_ui_service_factory.cc',
-      'browser/ui/webui/signin/login_ui_service_factory.h',
-      'browser/ui/webui/signin/profile_signin_confirmation_dialog.cc',
-      'browser/ui/webui/signin/profile_signin_confirmation_dialog.h',
-      'browser/ui/webui/signin/profile_signin_confirmation_ui.cc',
-      'browser/ui/webui/signin/profile_signin_confirmation_ui.h',
-      'browser/ui/webui/site_settings_helper.cc',
-      'browser/ui/webui/site_settings_helper.h',
-      'browser/ui/webui/sync_file_system_internals/dump_database_handler.cc',
-      'browser/ui/webui/sync_file_system_internals/dump_database_handler.h',
-      'browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc',
-      'browser/ui/webui/sync_file_system_internals/extension_statuses_handler.h',
-      'browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc',
-      'browser/ui/webui/sync_file_system_internals/file_metadata_handler.h',
-      'browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc',
-      'browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.h',
-      'browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.cc',
-      'browser/ui/webui/sync_file_system_internals/sync_file_system_internals_ui.h',
-      'browser/ui/webui/system_info_ui.cc',
-      'browser/ui/webui/system_info_ui.h',
-      'browser/ui/webui/theme_handler.cc',
-      'browser/ui/webui/theme_handler.h',
-      'browser/ui/webui/uber/uber_ui.cc',
-      'browser/ui/webui/uber/uber_ui.h',
-      'browser/ui/window_sizer/window_sizer.cc',
-      'browser/ui/window_sizer/window_sizer.h',
-    ],
-    # Cross-platform views sources also ready for toolkit-views on Mac.
-    'chrome_browser_ui_views_sources': [
-      'browser/ui/autofill/save_card_bubble_controller.h',
-      'browser/ui/autofill/save_card_bubble_controller_impl.cc',
-      'browser/ui/autofill/save_card_bubble_controller_impl.h',
-      'browser/ui/autofill/save_card_bubble_view.h',
-      'browser/ui/browser_dialogs_mac.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_dialog_container.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_dialog_container.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_dialog_views.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_dialog_views.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_footer_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_footer_panel.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_header_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_header_panel.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_panel.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_permissions_panel.h',
-      'browser/ui/views/apps/app_info_dialog/app_info_summary_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/app_info_summary_panel.h',
-      'browser/ui/views/apps/app_window_native_widget_mac.h',
-      'browser/ui/views/apps/app_window_native_widget_mac.mm',
-      'browser/ui/views/apps/chrome_native_app_window_views.cc',
-      'browser/ui/views/apps/chrome_native_app_window_views.h',
-      'browser/ui/views/apps/chrome_native_app_window_views_mac.h',
-      'browser/ui/views/apps/chrome_native_app_window_views_mac.mm',
-      'browser/ui/views/apps/native_app_window_frame_view_mac.h',
-      'browser/ui/views/apps/native_app_window_frame_view_mac.mm',
-      'browser/ui/views/autofill/card_unmask_prompt_views.cc',
-      'browser/ui/views/autofill/card_unmask_prompt_views.h',
-      'browser/ui/views/autofill/decorated_textfield.cc',
-      'browser/ui/views/autofill/decorated_textfield.h',
-      'browser/ui/views/autofill/info_bubble.cc',
-      'browser/ui/views/autofill/info_bubble.h',
-      'browser/ui/views/autofill/tooltip_icon.cc',
-      'browser/ui/views/autofill/tooltip_icon.h',
-      'browser/ui/views/bookmarks/bookmark_bubble_view.cc',
-      'browser/ui/views/bookmarks/bookmark_bubble_view.h',
-      'browser/ui/views/bookmarks/bookmark_editor_view.cc',
-      'browser/ui/views/bookmarks/bookmark_editor_view.h',
-      'browser/ui/views/browser_dialogs_views_mac.cc',
-      'browser/ui/views/chooser_content_view.cc',
-      'browser/ui/views/chooser_content_view.h',
-      'browser/ui/views/chrome_browser_main_extra_parts_views.cc',
-      'browser/ui/views/chrome_browser_main_extra_parts_views.h',
-      'browser/ui/views/chrome_constrained_window_views_client.cc',
-      'browser/ui/views/chrome_constrained_window_views_client.h',
-      'browser/ui/views/chrome_views_delegate.cc',
-      'browser/ui/views/chrome_views_delegate.h',
-      'browser/ui/views/collected_cookies_views.cc',
-      'browser/ui/views/collected_cookies_views.h',
-      'browser/ui/views/content_setting_bubble_contents.cc',
-      'browser/ui/views/content_setting_bubble_contents.h',
-      'browser/ui/views/cookie_info_view.cc',
-      'browser/ui/views/cookie_info_view.h',
-      'browser/ui/views/exclusive_access_bubble_views.cc',
-      'browser/ui/views/exclusive_access_bubble_views.h',
-      'browser/ui/views/exclusive_access_bubble_views_context.h',
-      'browser/ui/views/extensions/chooser_dialog_view.cc',
-      'browser/ui/views/extensions/chooser_dialog_view.h',
-      'browser/ui/views/extensions/device_permissions_dialog_view.cc',
-      'browser/ui/views/extensions/device_permissions_dialog_view.h',
-      'browser/ui/views/extensions/extension_install_dialog_view.cc',
-      'browser/ui/views/extensions/extension_keybinding_registry_views.cc',
-      'browser/ui/views/extensions/extension_keybinding_registry_views.h',
-      'browser/ui/views/frame/native_widget_mac_frameless_nswindow.h',
-      'browser/ui/views/frame/native_widget_mac_frameless_nswindow.mm',
-      'browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc',
-      'browser/ui/views/location_bar/location_bar_bubble_delegate_view.h',
-      'browser/ui/views/login_handler_views.cc',
-      'browser/ui/views/login_view.cc',
-      'browser/ui/views/login_view.h',
-      'browser/ui/views/new_back_shortcut_bubble.cc',
-      'browser/ui/views/new_back_shortcut_bubble.h',
-      'browser/ui/views/subtle_notification_view.cc',
-      'browser/ui/views/subtle_notification_view.h',
-      'browser/ui/views/sync/bubble_sync_promo_view.cc',
-      'browser/ui/views/sync/bubble_sync_promo_view.h',
-      'browser/ui/views/task_manager_view.cc',
-      'browser/ui/views/task_manager_view.h',
-      'browser/ui/views/website_settings/chosen_object_view.cc',
-      'browser/ui/views/website_settings/chosen_object_view.h',
-      'browser/ui/views/website_settings/permission_prompt_impl.cc',
-      'browser/ui/views/website_settings/permission_prompt_impl.h',
-      'browser/ui/views/website_settings/permission_selector_view.cc',
-      'browser/ui/views/website_settings/permission_selector_view.h',
-      'browser/ui/views/website_settings/permission_selector_view_observer.h',
-      'browser/ui/views/website_settings/website_settings_popup_view.cc',
-      'browser/ui/views/website_settings/website_settings_popup_view.h',
-    ],
-    # Views files for ChromeOS.
-    'chrome_browser_ui_views_chromeos_sources': [
-      'browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.cc',
-      'browser/ui/views/apps/app_info_dialog/arc_app_info_links_panel.h',
-    ],
-    # Views files for everywhere but ChromeOS.
-    'chrome_browser_ui_views_non_chromeos_sources': [
-      'browser/ui/external_protocol_dialog_delegate.cc',
-      'browser/ui/external_protocol_dialog_delegate.h',
-      'browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc',
-      'browser/ui/views/chrome_browser_main_extra_parts_views_linux.h',
-      'browser/ui/views/external_protocol_dialog.cc',
-      'browser/ui/views/external_protocol_dialog.h',
-      'browser/ui/views/frame/opaque_browser_frame_view.cc',
-      'browser/ui/views/frame/opaque_browser_frame_view.h',
-      'browser/ui/views/frame/opaque_browser_frame_view_layout.cc',
-      'browser/ui/views/frame/opaque_browser_frame_view_layout.h',
-      'browser/ui/views/frame/opaque_browser_frame_view_layout_delegate.h',
-      'browser/ui/views/frame/opaque_browser_frame_view_linux.cc',
-      'browser/ui/views/frame/opaque_browser_frame_view_linux.h',
-      'browser/ui/views/frame/opaque_browser_frame_view_platform_specific.cc',
-      'browser/ui/views/frame/opaque_browser_frame_view_platform_specific.h',
-      'browser/ui/views/profiles/profile_chooser_view.cc',
-      'browser/ui/views/profiles/profile_chooser_view.h',
-      'browser/ui/views/screen_capture_notification_ui_views.cc',
-      'browser/ui/views/sync/one_click_signin_dialog_view.cc',
-      'browser/ui/views/sync/one_click_signin_dialog_view.h',
-      'browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc',
-      'browser/ui/views/sync/profile_signin_confirmation_dialog_views.h',
-    ],
-    # Cross-platform (except Mac) views sources.
-    'chrome_browser_ui_views_non_mac_sources': [
-      # This test header is included because it contains forward declarations
-      # needed for 'friend' statements for use in tests.
-      'browser/ui/translate/translate_bubble_test_utils.h',
-      'browser/ui/views/accessibility/invert_bubble_view.cc',
-      'browser/ui/views/accessibility/invert_bubble_view.h',
-      'browser/ui/views/autofill/autofill_popup_base_view.cc',
-      'browser/ui/views/autofill/autofill_popup_base_view.h',
-      'browser/ui/views/autofill/autofill_popup_view_views.cc',
-      'browser/ui/views/autofill/autofill_popup_view_views.h',
-      'browser/ui/views/autofill/card_unmask_prompt_views_shim.cc',
-      'browser/ui/views/autofill/password_generation_popup_view_views.cc',
-      'browser/ui/views/autofill/password_generation_popup_view_views.h',
-      'browser/ui/views/autofill/save_card_bubble_views.cc',
-      'browser/ui/views/autofill/save_card_bubble_views.h',
-      'browser/ui/views/autofill/save_card_icon_view.cc',
-      'browser/ui/views/autofill/save_card_icon_view.h',
-      'browser/ui/views/bar_control_button.cc',
-      'browser/ui/views/bar_control_button.h',
-      'browser/ui/views/bookmarks/bookmark_bar_instructions_view.cc',
-      'browser/ui/views/bookmarks/bookmark_bar_instructions_view.h',
-      'browser/ui/views/bookmarks/bookmark_bar_view.cc',
-      'browser/ui/views/bookmarks/bookmark_bar_view.h',
-      'browser/ui/views/bookmarks/bookmark_bar_view_observer.h',
-      'browser/ui/views/bookmarks/bookmark_context_menu.cc',
-      'browser/ui/views/bookmarks/bookmark_context_menu.h',
-      'browser/ui/views/bookmarks/bookmark_drag_drop_views.cc',
-      'browser/ui/views/bookmarks/bookmark_menu_controller_observer.h',
-      'browser/ui/views/bookmarks/bookmark_menu_controller_views.cc',
-      'browser/ui/views/bookmarks/bookmark_menu_controller_views.h',
-      'browser/ui/views/bookmarks/bookmark_menu_delegate.cc',
-      'browser/ui/views/bookmarks/bookmark_menu_delegate.h',
-      'browser/ui/views/browser_dialogs_views.cc',
-      'browser/ui/views/certificate_selector.cc',
-      'browser/ui/views/certificate_selector.h',
-      'browser/ui/views/certificate_viewer_win.cc',
-      'browser/ui/views/chrome_javascript_native_dialog_factory_views.cc',
-      'browser/ui/views/chrome_views_delegate_chromeos.cc',
-      'browser/ui/views/chrome_web_dialog_view.cc',
-      'browser/ui/views/color_chooser_win.cc',
-      'browser/ui/views/confirm_bubble_views.cc',
-      'browser/ui/views/confirm_bubble_views.h',
-      'browser/ui/views/conflicting_module_view_win.cc',
-      'browser/ui/views/conflicting_module_view_win.h',
-      'browser/ui/views/constrained_web_dialog_delegate_views.cc',
-      'browser/ui/views/create_application_shortcut_view.cc',
-      'browser/ui/views/create_application_shortcut_view.h',
-      'browser/ui/views/download/download_danger_prompt_views.cc',
-      'browser/ui/views/download/download_feedback_dialog_view.cc',
-      'browser/ui/views/download/download_feedback_dialog_view.h',
-      'browser/ui/views/download/download_in_progress_dialog_view.cc',
-      'browser/ui/views/download/download_in_progress_dialog_view.h',
-      'browser/ui/views/download/download_item_view.cc',
-      'browser/ui/views/download/download_item_view.h',
-      'browser/ui/views/download/download_item_view_md.cc',
-      'browser/ui/views/download/download_item_view_md.h',
-      'browser/ui/views/download/download_shelf_context_menu_view.cc',
-      'browser/ui/views/download/download_shelf_context_menu_view.h',
-      'browser/ui/views/download/download_shelf_view.cc',
-      'browser/ui/views/download/download_shelf_view.h',
-      'browser/ui/views/download/download_started_animation_views.cc',
-      'browser/ui/views/dropdown_bar_host.cc',
-      'browser/ui/views/dropdown_bar_host.h',
-      'browser/ui/views/dropdown_bar_host_delegate.h',
-      'browser/ui/views/dropdown_bar_view.cc',
-      'browser/ui/views/dropdown_bar_view.h',
-      'browser/ui/views/elevation_icon_setter.cc',
-      'browser/ui/views/elevation_icon_setter.h',
-      'browser/ui/views/find_bar_host.cc',
-      'browser/ui/views/find_bar_host.h',
-      'browser/ui/views/find_bar_view.cc',
-      'browser/ui/views/find_bar_view.h',
-      'browser/ui/views/first_run_bubble.cc',
-      'browser/ui/views/first_run_bubble.h',
-      'browser/ui/views/frame/browser_command_handler_linux.cc',
-      'browser/ui/views/frame/browser_command_handler_linux.h',
-      'browser/ui/views/frame/browser_frame.cc',
-      'browser/ui/views/frame/browser_frame.h',
-      'browser/ui/views/frame/browser_non_client_frame_view.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view.h',
-      'browser/ui/views/frame/browser_root_view.cc',
-      'browser/ui/views/frame/browser_root_view.h',
-      'browser/ui/views/frame/browser_view.cc',
-      'browser/ui/views/frame/browser_view.h',
-      'browser/ui/views/frame/browser_view_layout.cc',
-      'browser/ui/views/frame/browser_view_layout.h',
-      'browser/ui/views/frame/browser_view_layout_delegate.h',
-      'browser/ui/views/frame/browser_window_factory.cc',
-      'browser/ui/views/frame/browser_window_property_manager_win.cc',
-      'browser/ui/views/frame/browser_window_property_manager_win.h',
-      'browser/ui/views/frame/contents_layout_manager.cc',
-      'browser/ui/views/frame/contents_layout_manager.h',
-      'browser/ui/views/frame/contents_web_view.cc',
-      'browser/ui/views/frame/contents_web_view.h',
-      'browser/ui/views/frame/immersive_mode_controller.cc',
-      'browser/ui/views/frame/immersive_mode_controller.h',
-      'browser/ui/views/frame/immersive_mode_controller_factory_views.cc',
-      'browser/ui/views/frame/immersive_mode_controller_stub.cc',
-      'browser/ui/views/frame/immersive_mode_controller_stub.h',
-      'browser/ui/views/frame/minimize_button_metrics_win.cc',
-      'browser/ui/views/frame/minimize_button_metrics_win.h',
-      'browser/ui/views/frame/native_browser_frame.h',
-      'browser/ui/views/frame/native_browser_frame_factory.cc',
-      'browser/ui/views/frame/native_browser_frame_factory.h',
-      'browser/ui/views/frame/native_browser_frame_factory_chromeos.cc',
-      'browser/ui/views/frame/system_menu_insertion_delegate_win.cc',
-      'browser/ui/views/frame/system_menu_insertion_delegate_win.h',
-      'browser/ui/views/frame/system_menu_model_builder.cc',
-      'browser/ui/views/frame/system_menu_model_builder.h',
-      'browser/ui/views/frame/system_menu_model_delegate.cc',
-      'browser/ui/views/frame/system_menu_model_delegate.h',
-      'browser/ui/views/frame/taskbar_decorator_win.cc',
-      'browser/ui/views/frame/taskbar_decorator_win.h',
-      'browser/ui/views/frame/top_container_view.cc',
-      'browser/ui/views/frame/top_container_view.h',
-      'browser/ui/views/frame/web_contents_close_handler.cc',
-      'browser/ui/views/frame/web_contents_close_handler.h',
-      'browser/ui/views/frame/web_contents_close_handler_delegate.h',
-      'browser/ui/views/global_error_bubble_view.cc',
-      'browser/ui/views/global_error_bubble_view.h',
-      'browser/ui/views/hung_renderer_view.cc',
-      'browser/ui/views/hung_renderer_view.h',
-      'browser/ui/views/ime/ime_warning_bubble_view.cc',
-      'browser/ui/views/ime/ime_warning_bubble_view.h',
-      'browser/ui/views/importer/import_lock_dialog_view.cc',
-      'browser/ui/views/importer/import_lock_dialog_view.h',
-      'browser/ui/views/infobars/alternate_nav_infobar_view.cc',
-      'browser/ui/views/infobars/alternate_nav_infobar_view.h',
-      'browser/ui/views/infobars/confirm_infobar.cc',
-      'browser/ui/views/infobars/confirm_infobar.h',
-      'browser/ui/views/infobars/infobar_background.cc',
-      'browser/ui/views/infobars/infobar_background.h',
-      'browser/ui/views/infobars/infobar_container_view.cc',
-      'browser/ui/views/infobars/infobar_container_view.h',
-      'browser/ui/views/infobars/infobar_view.cc',
-      'browser/ui/views/infobars/infobar_view.h',
-      'browser/ui/views/load_complete_listener.cc',
-      'browser/ui/views/load_complete_listener.h',
-      'browser/ui/views/location_bar/background_with_1_px_border.cc',
-      'browser/ui/views/location_bar/background_with_1_px_border.h',
-      'browser/ui/views/location_bar/bubble_icon_view.cc',
-      'browser/ui/views/location_bar/bubble_icon_view.h',
-      'browser/ui/views/location_bar/content_setting_image_view.cc',
-      'browser/ui/views/location_bar/content_setting_image_view.h',
-      'browser/ui/views/location_bar/icon_label_bubble_view.cc',
-      'browser/ui/views/location_bar/icon_label_bubble_view.h',
-      'browser/ui/views/location_bar/keyword_hint_view.cc',
-      'browser/ui/views/location_bar/keyword_hint_view.h',
-      'browser/ui/views/location_bar/location_bar_decoration_view.cc',
-      'browser/ui/views/location_bar/location_bar_decoration_view.h',
-      'browser/ui/views/location_bar/location_bar_layout.cc',
-      'browser/ui/views/location_bar/location_bar_layout.h',
-      'browser/ui/views/location_bar/location_bar_view.cc',
-      'browser/ui/views/location_bar/location_bar_view.h',
-      'browser/ui/views/location_bar/location_icon_view.cc',
-      'browser/ui/views/location_bar/location_icon_view.h',
-      'browser/ui/views/location_bar/open_pdf_in_reader_view.cc',
-      'browser/ui/views/location_bar/open_pdf_in_reader_view.h',
-      'browser/ui/views/location_bar/page_action_image_view.cc',
-      'browser/ui/views/location_bar/page_action_image_view.h',
-      'browser/ui/views/location_bar/page_action_with_badge_view.cc',
-      'browser/ui/views/location_bar/page_action_with_badge_view.h',
-      'browser/ui/views/location_bar/selected_keyword_view.cc',
-      'browser/ui/views/location_bar/selected_keyword_view.h',
-      'browser/ui/views/location_bar/star_view.cc',
-      'browser/ui/views/location_bar/star_view.h',
-      'browser/ui/views/location_bar/zoom_bubble_view.cc',
-      'browser/ui/views/location_bar/zoom_bubble_view.h',
-      'browser/ui/views/location_bar/zoom_view.cc',
-      'browser/ui/views/location_bar/zoom_view.h',
-      'browser/ui/views/omnibox/omnibox_popup_contents_view.cc',
-      'browser/ui/views/omnibox/omnibox_popup_contents_view.h',
-      'browser/ui/views/omnibox/omnibox_result_view.cc',
-      'browser/ui/views/omnibox/omnibox_result_view.h',
-      'browser/ui/views/omnibox/omnibox_view_views.cc',
-      'browser/ui/views/omnibox/omnibox_view_views.h',
-      'browser/ui/views/open_pdf_in_reader_bubble_view.cc',
-      'browser/ui/views/open_pdf_in_reader_bubble_view.h',
-      'browser/ui/views/outdated_upgrade_bubble_view.cc',
-      'browser/ui/views/outdated_upgrade_bubble_view.h',
-      'browser/ui/views/passwords/account_chooser_dialog_view.cc',
-      'browser/ui/views/passwords/account_chooser_dialog_view.h',
-      'browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc',
-      'browser/ui/views/passwords/auto_signin_first_run_dialog_view.h',
-      'browser/ui/views/passwords/credentials_item_view.cc',
-      'browser/ui/views/passwords/credentials_item_view.h',
-      'browser/ui/views/passwords/credentials_selection_view.cc',
-      'browser/ui/views/passwords/credentials_selection_view.h',
-      'browser/ui/views/passwords/manage_password_items_view.cc',
-      'browser/ui/views/passwords/manage_password_items_view.h',
-      'browser/ui/views/passwords/manage_passwords_bubble_view.cc',
-      'browser/ui/views/passwords/manage_passwords_bubble_view.h',
-      'browser/ui/views/passwords/manage_passwords_icon_views.cc',
-      'browser/ui/views/passwords/manage_passwords_icon_views.h',
-      'browser/ui/views/process_singleton_dialog_linux.cc',
-      'browser/ui/views/profiles/profile_indicator_icon.cc',
-      'browser/ui/views/profiles/profile_indicator_icon.h',
-      'browser/ui/views/profiles/signin_view_controller_delegate_views.cc',
-      'browser/ui/views/profiles/signin_view_controller_delegate_views.h',
-      'browser/ui/views/profiles/user_manager_view.cc',
-      'browser/ui/views/profiles/user_manager_view.h',
-      'browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.cc',
-      'browser/ui/views/proximity_auth/proximity_auth_error_bubble_view.h',
-      'browser/ui/views/session_crashed_bubble_view.cc',
-      'browser/ui/views/session_crashed_bubble_view.h',
-      'browser/ui/views/simple_message_box_views.cc',
-      'browser/ui/views/ssl_client_certificate_selector.cc',
-      'browser/ui/views/ssl_client_certificate_selector.h',
-      'browser/ui/views/status_bubble_views.cc',
-      'browser/ui/views/status_bubble_views.h',
-      'browser/ui/views/status_icons/status_icon_win.cc',
-      'browser/ui/views/status_icons/status_icon_win.h',
-      'browser/ui/views/status_icons/status_tray_linux.cc',
-      'browser/ui/views/status_icons/status_tray_linux.h',
-      'browser/ui/views/status_icons/status_tray_state_changer_win.cc',
-      'browser/ui/views/status_icons/status_tray_state_changer_win.h',
-      'browser/ui/views/status_icons/status_tray_win.cc',
-      'browser/ui/views/status_icons/status_tray_win.h',
-      'browser/ui/views/tab_dialogs_views.cc',
-      'browser/ui/views/tab_dialogs_views.h',
-      'browser/ui/views/tab_icon_view.cc',
-      'browser/ui/views/tab_icon_view.h',
-      'browser/ui/views/tab_modal_confirm_dialog_views.cc',
-      'browser/ui/views/tab_modal_confirm_dialog_views.h',
-      'browser/ui/views/tabs/alert_indicator_button.cc',
-      'browser/ui/views/tabs/alert_indicator_button.h',
-      'browser/ui/views/tabs/browser_tab_strip_controller.cc',
-      'browser/ui/views/tabs/browser_tab_strip_controller.h',
-      'browser/ui/views/tabs/stacked_tab_strip_layout.cc',
-      'browser/ui/views/tabs/stacked_tab_strip_layout.h',
-      'browser/ui/views/tabs/tab.cc',
-      'browser/ui/views/tabs/tab.h',
-      'browser/ui/views/tabs/tab_controller.h',
-      'browser/ui/views/tabs/tab_drag_controller.cc',
-      'browser/ui/views/tabs/tab_drag_controller.h',
-      'browser/ui/views/tabs/tab_strip.cc',
-      'browser/ui/views/tabs/tab_strip.h',
-      'browser/ui/views/tabs/tab_strip_controller.h',
-      'browser/ui/views/tabs/tab_strip_layout.cc',
-      'browser/ui/views/tabs/tab_strip_layout.h',
-      'browser/ui/views/tabs/window_finder.cc',
-      'browser/ui/views/tabs/window_finder.h',
-      'browser/ui/views/tabs/window_finder_chromeos.cc',
-      'browser/ui/views/tabs/window_finder_win.cc',
-      'browser/ui/views/theme_copying_widget.cc',
-      'browser/ui/views/theme_copying_widget.h',
-      'browser/ui/views/toolbar/app_menu.cc',
-      'browser/ui/views/toolbar/app_menu.h',
-      'browser/ui/views/toolbar/app_menu_button.cc',
-      'browser/ui/views/toolbar/app_menu_button.h',
-      'browser/ui/views/toolbar/app_menu_observer.h',
-      'browser/ui/views/toolbar/back_button.cc',
-      'browser/ui/views/toolbar/back_button.h',
-      'browser/ui/views/toolbar/browser_actions_container.cc',
-      'browser/ui/views/toolbar/browser_actions_container.h',
-      'browser/ui/views/toolbar/extension_toolbar_menu_view.cc',
-      'browser/ui/views/toolbar/extension_toolbar_menu_view.h',
-      'browser/ui/views/toolbar/home_button.cc',
-      'browser/ui/views/toolbar/home_button.h',
-      'browser/ui/views/toolbar/reload_button.cc',
-      'browser/ui/views/toolbar/reload_button.h',
-      'browser/ui/views/toolbar/toolbar_action_view.cc',
-      'browser/ui/views/toolbar/toolbar_action_view.h',
-      'browser/ui/views/toolbar/toolbar_action_view_delegate_views.h',
-      'browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc',
-      'browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.h',
-      'browser/ui/views/toolbar/toolbar_button.cc',
-      'browser/ui/views/toolbar/toolbar_button.h',
-      'browser/ui/views/toolbar/toolbar_view.cc',
-      'browser/ui/views/toolbar/toolbar_view.h',
-      'browser/ui/views/touch_uma/touch_uma.h',
-      'browser/ui/views/translate/translate_bubble_view.cc',
-      'browser/ui/views/translate/translate_bubble_view.h',
-      'browser/ui/views/translate/translate_icon_view.cc',
-      'browser/ui/views/translate/translate_icon_view.h',
-      'browser/ui/views/update_recommended_message_box.cc',
-      'browser/ui/views/update_recommended_message_box.h',
-      'browser/ui/views/validation_message_bubble_view.cc',
-      'browser/ui/views/validation_message_bubble_view.h',
-      'browser/ui/views/website_settings/chooser_bubble_ui_view.cc',
-      'browser/ui/views/website_settings/chooser_bubble_ui_view.h',
-      'browser/ui/views/website_settings/permission_prompt_impl_views.cc',
-    ],
-    'chrome_browser_ui_views_extensions_non_mac_sources': [
-      'browser/ui/views/extensions/bookmark_app_confirmation_view.cc',
-      'browser/ui/views/extensions/bookmark_app_confirmation_view.h',
-      'browser/ui/views/extensions/browser_action_drag_data.cc',
-      'browser/ui/views/extensions/browser_action_drag_data.h',
-      'browser/ui/views/extensions/extension_action_platform_delegate_views.cc',
-      'browser/ui/views/extensions/extension_action_platform_delegate_views.h',
-      'browser/ui/views/extensions/extension_dialog.cc',
-      'browser/ui/views/extensions/extension_dialog.h',
-      'browser/ui/views/extensions/extension_dialog_observer.cc',
-      'browser/ui/views/extensions/extension_dialog_observer.h',
-      'browser/ui/views/extensions/extension_installed_bubble_view.cc',
-      'browser/ui/views/extensions/extension_popup.cc',
-      'browser/ui/views/extensions/extension_popup.h',
-      'browser/ui/views/extensions/extension_popup_aura.cc',
-      'browser/ui/views/extensions/extension_popup_aura.h',
-      'browser/ui/views/extensions/extension_uninstall_dialog_view.cc',
-      'browser/ui/views/extensions/extension_view_views.cc',
-      'browser/ui/views/extensions/extension_view_views.h',
-      'browser/ui/views/extensions/media_galleries_dialog_views.cc',
-      'browser/ui/views/extensions/media_galleries_dialog_views.h',
-      'browser/ui/views/extensions/media_gallery_checkbox_view.cc',
-      'browser/ui/views/extensions/media_gallery_checkbox_view.h',
-    ],
-    # MacViews sources that we still want to keep behind a compile-time flag.
-    # TODO(jackhou): Move items to chrome_browser_ui_views_sources when they
-    # migrate from mac_views_browser to a chrome://flag.
-    'chrome_browser_ui_views_mac_experimental_sources': [
-      'browser/ui/views/apps/chrome_app_window_client_views_mac.mm',
-      'browser/ui/views/certificate_viewer_mac_views.mm',
-      'browser/ui/views/dropdown_bar_host_mac.mm',
-      'browser/ui/views/frame/browser_frame_mac.h',
-      'browser/ui/views/frame/browser_frame_mac.mm',
-      'browser/ui/views/frame/browser_non_client_frame_view_factory_mac.mm',
-      'browser/ui/views/frame/browser_non_client_frame_view_mac.h',
-      'browser/ui/views/frame/browser_non_client_frame_view_mac.mm',
-      'browser/ui/views/frame/native_browser_frame_factory_mac.mm',
-      'browser/ui/views/infobars/legacy_infobars_mac.cc',
-      'browser/ui/views/tabs/window_finder_mac.mm',
-    ],
-    # Windows-only. Assume ash/aura/views.
-    'chrome_browser_ui_win_sources': [
-      'browser/ui/input_method/input_method_engine.cc',
-      'browser/ui/input_method/input_method_engine.h',
-      'browser/ui/input_method/input_method_engine_base.cc',
-      'browser/ui/input_method/input_method_engine_base.h',
-      'browser/ui/network_profile_bubble.cc',
-      'browser/ui/network_profile_bubble.h',
-      'browser/ui/views/color_chooser_dialog.cc',
-      'browser/ui/views/color_chooser_dialog.h',
-      'browser/ui/views/critical_notification_bubble_view.cc',
-      'browser/ui/views/critical_notification_bubble_view.h',
-      'browser/ui/views/frame/browser_desktop_window_tree_host.h',
-      'browser/ui/views/frame/browser_desktop_window_tree_host_win.cc',
-      'browser/ui/views/frame/browser_desktop_window_tree_host_win.h',
-      'browser/ui/views/frame/glass_browser_frame_view.cc',
-      'browser/ui/views/frame/glass_browser_frame_view.h',
-      'browser/ui/views/frame/native_browser_frame_factory_aurawin.cc',
-      'browser/ui/views/network_profile_bubble_view.cc',
-      'browser/ui/views/uninstall_view.cc',
-      'browser/ui/views/uninstall_view.h',
-      'browser/ui/webui/cast/cast_ui.cc',
-      'browser/ui/webui/cast/cast_ui.h',
-      'browser/ui/webui/conflicts_ui.cc',
-      'browser/ui/webui/conflicts_ui.h',
-    ],
-    # Compiled for X11: desktop Linux and ChromeOS. We assume aura/views/ash.
-    'chrome_browser_ui_x11_sources': [
-      'browser/ui/views/javascript_app_modal_event_blocker_x11.cc',
-      'browser/ui/views/javascript_app_modal_event_blocker_x11.h',
-      'browser/ui/views/tabs/window_finder_x11.cc',
-    ],
-
-    ### Feature-based sources ###
-    # Variables should generally be alphabetical within this section.
-    'chrome_browser_ui_app_list_sources': [
-      'browser/ui/app_list/app_context_menu.cc',
-      'browser/ui/app_list/app_context_menu.h',
-      'browser/ui/app_list/app_context_menu_delegate.h',
-      'browser/ui/app_list/app_list_controller_delegate.cc',
-      'browser/ui/app_list/app_list_controller_delegate.h',
-      'browser/ui/app_list/app_list_controller_delegate_impl.cc',
-      'browser/ui/app_list/app_list_controller_delegate_impl.h',
-      'browser/ui/app_list/app_list_model_builder.cc',
-      'browser/ui/app_list/app_list_model_builder.h',
-      'browser/ui/app_list/app_list_positioner.cc',
-      'browser/ui/app_list/app_list_positioner.h',
-      'browser/ui/app_list/app_list_prefs.cc',
-      'browser/ui/app_list/app_list_prefs.h',
-      'browser/ui/app_list/app_list_prefs_factory.cc',
-      'browser/ui/app_list/app_list_prefs_factory.h',
-      'browser/ui/app_list/app_list_presenter_delegate.h',
-      'browser/ui/app_list/app_list_service.cc',
-      'browser/ui/app_list/app_list_service.h',
-      'browser/ui/app_list/app_list_service_impl.cc',
-      'browser/ui/app_list/app_list_service_impl.h',
-      'browser/ui/app_list/app_list_syncable_service.cc',
-      'browser/ui/app_list/app_list_syncable_service.h',
-      'browser/ui/app_list/app_list_syncable_service_factory.cc',
-      'browser/ui/app_list/app_list_syncable_service_factory.h',
-      'browser/ui/app_list/app_list_view_delegate.cc',
-      'browser/ui/app_list/app_list_view_delegate.h',
-      'browser/ui/app_list/chrome_app_list_item.cc',
-      'browser/ui/app_list/chrome_app_list_item.h',
-      'browser/ui/app_list/extension_app_context_menu.cc',
-      'browser/ui/app_list/extension_app_context_menu.h',
-      'browser/ui/app_list/extension_app_item.cc',
-      'browser/ui/app_list/extension_app_item.h',
-      'browser/ui/app_list/extension_app_model_builder.cc',
-      'browser/ui/app_list/extension_app_model_builder.h',
-      'browser/ui/app_list/extension_uninstaller.cc',
-      'browser/ui/app_list/extension_uninstaller.h',
-      'browser/ui/app_list/fast_show_pickler.cc',
-      'browser/ui/app_list/fast_show_pickler.h',
-      'browser/ui/app_list/google_now_extension.cc',
-      'browser/ui/app_list/google_now_extension.h',
-      'browser/ui/app_list/launcher_page_event_dispatcher.cc',
-      'browser/ui/app_list/launcher_page_event_dispatcher.h',
-      'browser/ui/app_list/model_pref_updater.cc',
-      'browser/ui/app_list/model_pref_updater.h',
-      'browser/ui/app_list/profile_loader.cc',
-      'browser/ui/app_list/profile_loader.h',
-      'browser/ui/app_list/profile_store.h',
-      'browser/ui/app_list/search/app_result.cc',
-      'browser/ui/app_list/search/app_result.h',
-      'browser/ui/app_list/search/app_search_provider.cc',
-      'browser/ui/app_list/search/app_search_provider.h',
-      'browser/ui/app_list/search/common/json_response_fetcher.cc',
-      'browser/ui/app_list/search/common/json_response_fetcher.h',
-      'browser/ui/app_list/search/common/url_icon_source.cc',
-      'browser/ui/app_list/search/common/url_icon_source.h',
-      'browser/ui/app_list/search/common/webservice_cache.cc',
-      'browser/ui/app_list/search/common/webservice_cache.h',
-      'browser/ui/app_list/search/common/webservice_cache_factory.cc',
-      'browser/ui/app_list/search/common/webservice_cache_factory.h',
-      'browser/ui/app_list/search/common/webservice_search_provider.cc',
-      'browser/ui/app_list/search/common/webservice_search_provider.h',
-      'browser/ui/app_list/search/extension_app_result.cc',
-      'browser/ui/app_list/search/extension_app_result.h',
-      'browser/ui/app_list/search/history_factory.cc',
-      'browser/ui/app_list/search/history_factory.h',
-      'browser/ui/app_list/search/omnibox_provider.cc',
-      'browser/ui/app_list/search/omnibox_provider.h',
-      'browser/ui/app_list/search/omnibox_result.cc',
-      'browser/ui/app_list/search/omnibox_result.h',
-      'browser/ui/app_list/search/search_controller_factory.cc',
-      'browser/ui/app_list/search/search_controller_factory.h',
-      'browser/ui/app_list/search/search_resource_manager.cc',
-      'browser/ui/app_list/search/search_resource_manager.h',
-      'browser/ui/app_list/search/search_util.cc',
-      'browser/ui/app_list/search/search_util.h',
-      'browser/ui/app_list/search/search_webstore_result.cc',
-      'browser/ui/app_list/search/search_webstore_result.h',
-      'browser/ui/app_list/search/suggestions/suggestions_search_provider.cc',
-      'browser/ui/app_list/search/suggestions/suggestions_search_provider.h',
-      'browser/ui/app_list/search/suggestions/url_suggestion_result.cc',
-      'browser/ui/app_list/search/suggestions/url_suggestion_result.h',
-      'browser/ui/app_list/search/webstore/webstore_installer.cc',
-      'browser/ui/app_list/search/webstore/webstore_installer.h',
-      'browser/ui/app_list/search/webstore/webstore_provider.cc',
-      'browser/ui/app_list/search/webstore/webstore_provider.h',
-      'browser/ui/app_list/search/webstore/webstore_result.cc',
-      'browser/ui/app_list/search/webstore/webstore_result.h',
-      'browser/ui/app_list/speech_auth_helper.cc',
-      'browser/ui/app_list/speech_auth_helper.h',
-      'browser/ui/app_list/speech_recognizer.cc',
-      'browser/ui/app_list/speech_recognizer.h',
-      'browser/ui/app_list/speech_recognizer_delegate.h',
-      'browser/ui/app_list/start_page_observer.h',
-      'browser/ui/app_list/start_page_service.cc',
-      'browser/ui/app_list/start_page_service.h',
-      'browser/ui/app_list/start_page_service_factory.cc',
-      'browser/ui/app_list/start_page_service_factory.h',
-      'browser/ui/webui/app_list/start_page_handler.cc',
-      'browser/ui/webui/app_list/start_page_handler.h',
-      'browser/ui/webui/app_list/start_page_ui.cc',
-      'browser/ui/webui/app_list/start_page_ui.h',
-    ],
-    'chrome_browser_ui_app_list_linux_sources': [
-      'browser/ui/views/app_list/linux/app_list_linux.cc',
-      'browser/ui/views/app_list/linux/app_list_linux.h',
-      'browser/ui/views/app_list/linux/app_list_service_linux.cc',
-      'browser/ui/views/app_list/linux/app_list_service_linux.h',
-    ],
-    'chrome_browser_ui_app_list_views_sources': [
-      'browser/ui/app_list/app_list_controller_delegate_views.cc',
-      'browser/ui/app_list/app_list_controller_delegate_views.h',
-      'browser/ui/app_list/app_list_service_views.cc',
-      'browser/ui/app_list/app_list_service_views.h',
-      'browser/ui/app_list/app_list_shower_views.cc',
-      'browser/ui/app_list/app_list_shower_views.h',
-    ],
-    # Used when the app list is disabled.
-    'chrome_browser_ui_non_app_list_sources': [
-      'browser/ui/app_list/app_list_service.h',
-      'browser/ui/app_list/app_list_service_disabled.cc',
-      'browser/ui/app_list/app_list_service_disabled_mac.h',
-      'browser/ui/app_list/app_list_service_disabled_mac.mm',
-    ],
-    'chrome_browser_ui_extensions_sources': [
-      'browser/ui/extensions/accelerator_priority.cc',
-      'browser/ui/extensions/accelerator_priority.h',
-      'browser/ui/extensions/app_launch_params.cc',
-      'browser/ui/extensions/app_launch_params.h',
-      'browser/ui/extensions/application_launch.cc',
-      'browser/ui/extensions/application_launch.h',
-      'browser/ui/extensions/blocked_action_bubble_delegate.cc',
-      'browser/ui/extensions/blocked_action_bubble_delegate.h',
-      'browser/ui/extensions/extension_action_platform_delegate.h',
-      'browser/ui/extensions/extension_action_view_controller.cc',
-      'browser/ui/extensions/extension_action_view_controller.h',
-      'browser/ui/extensions/extension_enable_flow.cc',
-      'browser/ui/extensions/extension_enable_flow.h',
-      'browser/ui/extensions/extension_enable_flow_delegate.h',
-      'browser/ui/extensions/extension_install_ui_default.cc',
-      'browser/ui/extensions/extension_install_ui_default.h',
-      'browser/ui/extensions/extension_install_ui_factory.cc',
-      'browser/ui/extensions/extension_install_ui_factory.h',
-      'browser/ui/extensions/extension_installed_bubble.cc',
-      'browser/ui/extensions/extension_installed_bubble.h',
-      'browser/ui/extensions/extension_message_bubble_bridge.cc',
-      'browser/ui/extensions/extension_message_bubble_bridge.h',
-      'browser/ui/extensions/extension_message_bubble_factory.cc',
-      'browser/ui/extensions/extension_message_bubble_factory.h',
-      'browser/ui/extensions/hosted_app_browser_controller.cc',
-      'browser/ui/extensions/hosted_app_browser_controller.h',
-      'browser/ui/extensions/icon_with_badge_image_source.cc',
-      'browser/ui/extensions/icon_with_badge_image_source.h',
-      'browser/ui/extensions/settings_api_bubble_helpers.cc',
-      'browser/ui/extensions/settings_api_bubble_helpers.h',
-      'browser/ui/webui/extensions/chromeos/kiosk_apps_handler.cc',
-      'browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h',
-      'browser/ui/webui/extensions/extension_basic_info.cc',
-      'browser/ui/webui/extensions/extension_basic_info.h',
-      'browser/ui/webui/extensions/extension_icon_source.cc',
-      'browser/ui/webui/extensions/extension_icon_source.h',
-    ],
-    'chrome_browser_ui_google_now_non_android_sources': [
-      # These are non-Android because Android excludes all of options.
-      'browser/ui/webui/options/geolocation_options_handler.cc',
-      'browser/ui/webui/options/geolocation_options_handler.h',
-    ],
-    'chrome_browser_ui_nacl_sources': [
-      'browser/ui/webui/nacl_ui.cc',
-      'browser/ui/webui/nacl_ui.h',
-    ],
-    'chrome_browser_ui_nss_sources': [
-      'browser/ui/crypto_module_delegate_nss.cc',
-      'browser/ui/crypto_module_delegate_nss.h',
-      'browser/ui/crypto_module_password_dialog_nss.cc',
-      'browser/ui/crypto_module_password_dialog_nss.h',
-      'browser/ui/webui/options/certificate_manager_handler.cc',
-      'browser/ui/webui/options/certificate_manager_handler.h',
-      'browser/ui/webui/settings/certificates_handler.cc',
-      'browser/ui/webui/settings/certificates_handler.h',
-    ],
-    'chrome_browser_ui_non_nss_sources': [
-      'browser/ui/webui/settings/native_certificates_handler.cc',
-      'browser/ui/webui/settings/native_certificates_handler.h',
-    ],
-    'chrome_browser_ui_omnibox_non_mobile_sources': [
-      'browser/ui/omnibox/alternate_nav_infobar_delegate.cc',
-      'browser/ui/omnibox/alternate_nav_infobar_delegate.h',
-      'browser/ui/omnibox/chrome_omnibox_client.cc',
-      'browser/ui/omnibox/chrome_omnibox_client.h',
-      'browser/ui/omnibox/chrome_omnibox_edit_controller.cc',
-      'browser/ui/omnibox/chrome_omnibox_edit_controller.h',
-      'browser/ui/omnibox/chrome_omnibox_navigation_observer.cc',
-      'browser/ui/omnibox/chrome_omnibox_navigation_observer.h',
-      'browser/ui/omnibox/clipboard_utils.cc',
-      'browser/ui/omnibox/clipboard_utils.h',
-    ],
-    'chrome_browser_ui_plugin_sources': [
-      'browser/ui/hung_plugin_tab_helper.cc',
-      'browser/ui/hung_plugin_tab_helper.h',
-      'browser/ui/webui/flash_ui.cc',
-      'browser/ui/webui/flash_ui.h',
-      'browser/ui/webui/plugins/plugins_handler.cc',
-      'browser/ui/webui/plugins/plugins_handler.h',
-      'browser/ui/webui/plugins/plugins_ui.cc',
-      'browser/ui/webui/plugins/plugins_ui.h',
-    ],
-    'chrome_browser_ui_print_preview_sources': [
-      'browser/ui/webui/print_preview/extension_printer_handler.cc',
-      'browser/ui/webui/print_preview/extension_printer_handler.h',
-      'browser/ui/webui/print_preview/print_preview_handler.cc',
-      'browser/ui/webui/print_preview/print_preview_handler.h',
-      'browser/ui/webui/print_preview/print_preview_ui.cc',
-      'browser/ui/webui/print_preview/print_preview_ui.h',
-      'browser/ui/webui/print_preview/printer_handler.cc',
-      'browser/ui/webui/print_preview/printer_handler.h',
-      'browser/ui/webui/print_preview/sticky_settings.cc',
-      'browser/ui/webui/print_preview/sticky_settings.h',
-    ],
-    # For when enable_service_discovery is set.
-    'chrome_browser_ui_service_discovery_sources': [
-      'browser/ui/webui/local_discovery/local_discovery_ui.cc',
-      'browser/ui/webui/local_discovery/local_discovery_ui.h',
-      'browser/ui/webui/local_discovery/local_discovery_ui_handler.cc',
-      'browser/ui/webui/local_discovery/local_discovery_ui_handler.h',
-    ],
-    'chrome_browser_ui_toolbar_model_sources': [
-      'browser/ui/toolbar/chrome_toolbar_model_delegate.cc',
-      'browser/ui/toolbar/chrome_toolbar_model_delegate.h',
-    ],
-    'chrome_browser_ui_webrtc_sources': [
-      'browser/ui/webui/media/webrtc_logs_ui.cc',
-      'browser/ui/webui/media/webrtc_logs_ui.h',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'browser_ui',
-      'type': 'static_library',
-      'variables': {
-        'enable_wexit_time_destructors': 1,
-        # TODO(thakis): Remove this once http://crbug.com/383820 is figured out
-        'clang_warning_flags': [ '-Wno-nonnull' ],
-      },
-      # Since browser and browser_ui actually depend on each other,
-      # we must omit the dependency from browser_ui to browser.
-      # However, this means browser_ui and browser should more or less
-      # have the same dependencies. Once browser_ui is untangled from
-      # browser, then we can clean up these dependencies.
-      'dependencies': [
-        # NOTE: New dependencies should generally be added in the OS!="ios"
-        # dependencies block below, rather than here.
-        'chrome_browser_ui_views.gyp:browser_ui_views',
-        'chrome_resources.gyp:chrome_extra_resources',
-        'chrome_resources.gyp:chrome_resources',
-        'chrome_resources.gyp:chrome_strings',
-        'chrome_resources.gyp:platform_locale_settings',
-        'chrome_resources.gyp:theme_resources',
-        'common',
-        '../base/base.gyp:base_debugging_flags',
-        '../components/components.gyp:certificate_reporting',
-        '../components/components.gyp:device_event_log_component',
-        '../components/components.gyp:dom_distiller_core',
-        '../components/components.gyp:dom_distiller_webui',
-        '../components/components.gyp:invalidation_impl',
-        '../components/components.gyp:omnibox_common',
-        '../components/components.gyp:onc_component',
-        '../components/components.gyp:password_manager_core_browser',
-        '../components/components.gyp:policy',
-        '../components/components.gyp:toolbar',
-        '../components/components.gyp:update_client',
-        '../components/components.gyp:version_ui',
-        '../components/components.gyp:zoom',
-        '../components/components_resources.gyp:components_resources',
-        '../components/components_strings.gyp:components_strings',
-        '../components/url_formatter/url_formatter.gyp:url_formatter',
-        '../content/content.gyp:content_browser',
-        '../content/content.gyp:content_common',
-        '../crypto/crypto.gyp:crypto',
-        '../skia/skia.gyp:skia',
-        '../components/sync.gyp:sync',
-        '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation',
-        '../third_party/cacheinvalidation/cacheinvalidation.gyp:cacheinvalidation_proto_cpp',
-        '../third_party/icu/icu.gyp:icui18n',
-        '../third_party/icu/icu.gyp:icuuc',
-        '../third_party/zlib/zlib.gyp:zlib',
-        '../ui/accessibility/accessibility.gyp:accessibility',
-        '../ui/base/ui_base.gyp:ui_base',
-        '../ui/content_accelerators/ui_content_accelerators.gyp:ui_content_accelerators',
-        '../ui/display/display.gyp:display',
-        '../ui/events/events.gyp:events',
-        '../ui/events/events.gyp:gesture_detection',
-        '../ui/gfx/gfx.gyp:gfx',
-        '../ui/gfx/gfx.gyp:gfx_geometry',
-        '../ui/message_center/message_center.gyp:message_center',
-        '../ui/resources/ui_resources.gyp:ui_resources',
-        '../ui/snapshot/snapshot.gyp:snapshot',
-        '../ui/strings/ui_strings.gyp:ui_strings',
-      ],
-      'include_dirs': [
-        '..',
-        '<(INTERMEDIATE_DIR)',
-        # Needed by pepper_flash_component_installer.cc.
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'export_dependent_settings': [
-        '../components/components.gyp:dom_distiller_core',
-        '../components/sync.gyp:sync',
-      ],
-      'includes': [
-        # Disable LTO due to undefined reference
-        # crbug.com/422252
-        '../build/android/disable_gcc_lto.gypi',
-      ],
-      'conditions': [
-        ['OS != "ios"', {
-          'sources': [
-            '<@(chrome_browser_ui_non_ios_sources)',
-            '<@(chrome_browser_ui_toolbar_model_sources)',
-            '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/engagement/site_engagement.mojom.cc',
-            '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/omnibox/omnibox.mojom.cc',
-            '<(SHARED_INTERMEDIATE_DIR)/chrome/browser/ui/webui/plugins/plugins.mojom.cc',
-          ],
-          'dependencies': [
-            'chrome_web_ui_mojo_bindings.gyp:web_ui_mojo_bindings',
-            'common_net',
-            'debugger',
-            'installer_util',
-            '../components/components.gyp:app_modal',
-            '../components/components.gyp:autofill_content_risk_proto',
-            '../components/components.gyp:browsing_data_ui',
-            '../components/components.gyp:crash_core_browser',
-            '../components/components.gyp:flags_ui',
-            '../components/components.gyp:net_log',
-            '../components/components.gyp:translate_content_common',
-            '../components/components_resources.gyp:components_resources',
-            '../content/app/resources/content_resources.gyp:content_resources',
-            '../media/media.gyp:media',
-            '../mojo/mojo_edk.gyp:mojo_system_impl',
-            '../net/net.gyp:net_with_v8',
-            '../net/net.gyp:stale_while_revalidate_experiment_domains',
-            '../storage/storage_browser.gyp:storage',
-            '../storage/storage_common.gyp:storage_common',
-            '../third_party/brotli/brotli.gyp:brotli',
-            '../third_party/leveldatabase/leveldatabase.gyp:leveldatabase',
-            '../third_party/re2/re2.gyp:re2',
-            '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
-            '../ui/compositor/compositor.gyp:compositor',
-            '../ui/native_theme/native_theme.gyp:native_theme',
-            '../ui/surface/surface.gyp:surface',
-            '../ui/web_dialogs/web_dialogs.gyp:web_dialogs',
-            '../v8/src/v8.gyp:v8',
-          ],
-        }, {  # OS == "ios"
-          'sources': [
-            '<@(chrome_browser_ui_ios_sources)'
-          ],
-          'sources!': [
-            'browser/ui/external_protocol_dialog_delegate.cc',
-          ],
-          'dependencies': [
-            '../net/net.gyp:net',
-          ],
-        }],
-        ['enable_basic_printing==1 or enable_print_preview==1', {
-          'dependencies': [
-            '../printing/printing.gyp:printing',
-          ],
-        }],
-        ['disable_nacl==0', {
-          'sources': [ '<@(chrome_browser_ui_nacl_sources)' ],
-          'dependencies': [
-            '../native_client/src/trusted/service_runtime/service_runtime.gyp:sel',
-          ],
-        }],
-        ['debug_devtools==1', {
-          'defines': [
-            'DEBUG_DEVTOOLS=1',
-          ],
-        }],
-        ['enable_plugins==1', {
-          'sources': [ '<@(chrome_browser_ui_plugin_sources)' ],
-          'dependencies': [
-            '../ppapi/ppapi_internal.gyp:ppapi_ipc',
-            '../third_party/adobe/flash/flash_player.gyp:flapper_version_h',
-          ],
-        }],
-        ['safe_browsing==1', {
-          'dependencies': [
-            'safe_browsing_chunk_proto',
-            'safe_browsing_proto',
-          ],
-        }],
-        ['buildtype!="Official" and chromeos==1', {
-          'sources': [ '<@(chrome_browser_ui_chromeos_non_official_sources)' ],
-        }],
-        ['chromeos==1', {
-          'sources': [ '<@(chrome_browser_ui_chromeos_sources)' ],
-          'dependencies': [
-            'browser_chromeos',
-            '../components/components.gyp:proximity_auth_webui',
-            '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
-            '../ui/chromeos/ui_chromeos.gyp:ui_chromeos',
-            '../ui/chromeos/ui_chromeos.gyp:ui_chromeos_resources',
-            '../ui/events/events.gyp:dom_keycode_converter',
-          ],
-        }],
-        ['enable_app_list==1 and chromeos==1', {
-          'sources': [ '<@(chrome_browser_ui_chromeos_arc_sources)' ],
-          'dependencies': [
-            '../components/components.gyp:arc_mojo_bindings',
-          ],
-        }],
-        ['use_cups==1', {
-          'dependencies': [
-            '../printing/printing.gyp:cups',
-          ],
-        }],
-        ['use_ash==1', {
-          'sources': [ '<@(chrome_browser_ui_ash_sources)' ],
-          'dependencies': [
-            '../ash/ash.gyp:ash',
-            '../ash/ash.gyp:ash_with_content',
-            '../ash/ash_strings.gyp:ash_strings',
-            '../components/components.gyp:user_manager',
-            '../ui/app_list/presenter/app_list_presenter.gyp:app_list_presenter',
-          ],
-        }, { # use_ash==0
-          'sources': [ '<@(chrome_browser_ui_non_ash_sources)' ],
-        }],
-        ['toolkit_views==1', {
-          'sources': [ '<@(chrome_browser_ui_views_sources)' ],
-          'dependencies': [
-            '<(DEPTH)/components/components.gyp:constrained_window',
-          ],
-          'conditions': [
-            ['chromeos == 0 and (OS!="mac" or mac_views_browser==1)', {
-              'sources': [ '<@(chrome_browser_ui_views_non_chromeos_sources)' ],
-            }],
-            ['chromeos == 1', {
-              'sources': [ '<@(chrome_browser_ui_views_chromeos_sources)' ],
-            }],
-            ['use_ash == 1', {
-              'sources': [ '<@(chrome_browser_ui_ash_views_sources)' ],
-            }],
-            ['OS!="mac"', {
-              'sources': [ '<@(chrome_browser_ui_views_non_mac_sources)' ],
-              'dependencies': [
-                '../ui/gfx/gfx.gyp:gfx_vector_icons',
-              ],
-              'conditions': [
-                ['enable_extensions==1', {
-                  'sources': [ '<@(chrome_browser_ui_views_extensions_non_mac_sources)' ],
-                }],
-              ],
-            }],
-            ['enable_extensions==1', {
-              'dependencies': [
-                '<(DEPTH)/extensions/components/extensions_components.gyp:native_app_window',
-              ],
-            }],
-          ],
-        }],
-        ['use_aura==1 and chromeos==0 and use_ozone==0 and OS=="linux"', {
-          'dependencies': [
-            # gtk2 is the only component that can interact with gtk2 in our new
-            # world.
-            'browser/ui/libgtk2ui/libgtk2ui.gyp:gtk2ui',
-            '../build/linux/system.gyp:gio',
-          ],
-        }],
-        ['OS=="win" or OS=="mac" or desktop_linux==1', {
-          'sources': [ '<@(chrome_browser_ui_desktop_sources)' ],
-        }],
-        ['use_aura==1', {
-          'sources': [ '<@(chrome_browser_ui_aura_sources)'] ,
-          'dependencies': [
-            # aura uses some of ash resources.
-            '../ash/ash_resources.gyp:ash_resources',
-            '../ui/aura/aura.gyp:aura',
-            '../ui/keyboard/keyboard.gyp:keyboard',
-            '../ui/keyboard/keyboard.gyp:keyboard_with_content',
-            '../ui/keyboard/keyboard.gyp:keyboard_resources',
-            '../ui/wm/wm.gyp:wm',
-          ],
-          'conditions': [
-            ['chromeos == 0', {
-              'sources': [ '<@(chrome_browser_ui_aura_non_chromeos)' ],
-            }],
-          ],
-        }],
-        ['ui_compositor_image_transport==1', {
-          'dependencies': [
-            '../ui/gl/gl.gyp:gl',
-          ],
-        }],
-        ['use_nss_certs==1', {
-          'sources': [ '<@(chrome_browser_ui_nss_sources)' ],
-        }],
-        ['OS=="win" or OS=="mac"', {
-          'sources': [ '<@(chrome_browser_ui_non_nss_sources)' ],
-        }],
-        ['enable_themes==0', {
-          'sources!': [
-            'browser/ui/webui/theme_source.cc',
-          ],
-        }],
-        ['enable_print_preview==1', {
-          'sources': [ '<@(chrome_browser_ui_print_preview_sources)' ],
-        }],
-        ['OS=="android"', {
-          'dependencies': [
-            '../third_party/boringssl/boringssl.gyp:boringssl',
-          ],
-          'conditions': [
-            ['android_java_ui == 1', {
-              'sources': [ '<@(chrome_browser_ui_android_java_ui_sources)' ],
-              'dependencies': [
-                '../components/components.gyp:web_contents_delegate_android',
-                'chrome_browser_jni_headers',
-              ],
-              'dependencies!': [
-                '../ui/events/events.gyp:events',
-                'chrome_browser_ui_views.gyp:browser_ui_views',
-              ],
-            }]
-          ],
-        }],
-        ['OS=="mac"', {
-          'sources': [ '<@(chrome_browser_ui_mac_sources)' ],
-          'dependencies': [
-            '../third_party/apple_sample_code/apple_sample_code.gyp:apple_sample_code',
-            '../third_party/google_toolbox_for_mac/google_toolbox_for_mac.gyp:google_toolbox_for_mac',
-            '../third_party/molokocacao/molokocacao.gyp:molokocacao',
-            '../third_party/mozilla/mozilla.gyp:mozilla',
-            '../ui/accelerated_widget_mac/accelerated_widget_mac.gyp:accelerated_widget_mac',
-          ],
-          'conditions': [
-            ['mac_views_browser==1', {
-              'sources': [
-                '<@(chrome_browser_ui_views_mac_experimental_sources)',
-                '<@(chrome_browser_ui_views_non_mac_sources)',
-                '<@(chrome_browser_ui_views_extensions_non_mac_sources)',
-              ],
-            }, {
-              'sources': [ '<@(chrome_browser_ui_cocoa_sources)' ],
-            }],
-          ],
-          'link_settings': {
-            'libraries': [
-              '$(SDKROOT)/System/Library/Frameworks/Quartz.framework',
-            ],
-          },
-          'actions': [
-            {
-              # This action is used to extract the localization data from xib
-              # files and generate table for the ui localizer from it.
-              'variables': {
-                'xib_localizer_tool_path':
-                    'tools/build/mac/generate_localizer',
-              },
-              'includes': [
-                'chrome_nibs.gypi',
-              ],
-              'action_name': 'Process xibs for localization',
-              'inputs': [
-                '<(xib_localizer_tool_path)',
-                '<@(mac_translated_xibs)',
-              ],
-              'outputs': [
-                '<(INTERMEDIATE_DIR)/ui_localizer_table.h',
-              ],
-              'action': ['<(xib_localizer_tool_path)',
-                          '<@(_outputs)',
-                          '<@(mac_translated_xibs)'],
-            },
-          ],
-        }, {  # non-Mac.
-          'sources': [ '<@(chrome_browser_ui_non_mac_sources)' ],
-          'sources/': [
-            ['exclude', '^browser/ui/cocoa/'],
-          ],
-        }],
-        ['OS=="win"', {
-          'include_dirs': [
-            '<(DEPTH)/third_party/wtl/include',
-          ],
-          'dependencies': [
-            'installer_util_strings',
-            '../components/components.gyp:browser_watcher',
-            '../components/components.gyp:search_engines',
-            '../google_update/google_update.gyp:google_update',
-            '../third_party/iaccessible2/iaccessible2.gyp:iaccessible2',
-            '../third_party/isimpledom/isimpledom.gyp:isimpledom',
-            '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
-            '../ui/events/events.gyp:dom_keycode_converter',
-            '../ui/views/controls/webview/webview.gyp:webview',
-            '../ui/views/views.gyp:views',
-          ],
-          'export_dependent_settings': [
-            '../ui/views/controls/webview/webview.gyp:webview',
-            '../ui/views/views.gyp:views',
-          ],
-          'sources': [ '<@(chrome_browser_ui_win_sources)' ],
-          'sources!': [
-            'browser/ui/views/apps/keyboard_hook_handler.cc',
-            'browser/ui/views/frame/taskbar_decorator.cc'
-          ],
-          'conditions': [
-            ['branding!="Chrome"', {
-              'dependencies!': [
-                '../google_update/google_update.gyp:google_update',
-              ],
-              'sources!': [
-                'browser/ui/webui/help/version_updater_win.cc',
-              ],
-              'sources': [
-                'browser/ui/webui/help/version_updater_basic.cc',
-                'browser/ui/webui/help/version_updater_basic.h',
-              ],
-            }],
-            ['enable_app_list==1', {
-              'dependencies!': [
-                '../ui/app_list/app_list.gyp:app_list',
-              ],
-            }],
-          ],
-        }, {  # 'OS!="win"
-          'conditions': [
-            ['toolkit_views==1', {
-              'dependencies': [
-                '../ui/views/controls/webview/webview.gyp:webview',
-                '../ui/views/views.gyp:views',
-              ],
-              'include_dirs': [
-                '<(INTERMEDIATE_DIR)',
-                '<(INTERMEDIATE_DIR)/chrome',
-              ],
-            }, { # else: toolkit_views==0
-              'sources/': [
-                # Exclude all of views.
-                ['exclude', '^browser/ui/views/'],
-              ]
-            }],
-          ],
-        }],
-        ['desktop_linux==1', {
-          'dependencies': [
-            '../ui/base/ime/ui_base_ime.gyp:ui_base_ime',
-            '../ui/events/events.gyp:dom_keycode_converter',
-          ],
-          'sources': [ '<@(chrome_browser_ui_desktop_linux_sources)' ],
-        }],
-        ['OS=="linux"', {  # Both desktop Linux and ChromeOS.
-          'sources': [ '<@(chrome_browser_ui_linux_sources)' ],
-          'conditions': [
-            ['use_aura==1', {
-              'dependencies': [
-                '../build/linux/system.gyp:dbus',
-                '../build/linux/system.gyp:fontconfig',
-                '../dbus/dbus.gyp:dbus',
-              ],
-            }],
-            # x11 build
-            ['use_x11==1', {
-              'sources': [ '<@(chrome_browser_ui_x11_sources)' ],
-              'dependencies': [
-                '../build/linux/system.gyp:x11',
-                '../build/linux/system.gyp:gio',
-                '../ui/events/devices/events_devices.gyp:events_devices',
-                '../ui/events/devices/x11/events_devices_x11.gyp:events_devices_x11',
-                '../ui/events/keycodes/events_keycodes.gyp:keycodes_x11',
-              ],
-            }],
-            ['use_udev==1', {
-              'dependencies': [
-                '../device/udev_linux/udev.gyp:udev_linux',
-              ],
-            }],
-          ],
-        }],
-        ['enable_app_list==1', {
-          'sources': [ '<@(chrome_browser_ui_app_list_sources)' ],
-          'dependencies': [
-            '../ui/app_list/app_list.gyp:app_list',
-          ],
-          'conditions': [
-            ['desktop_linux==1', {
-              'sources': [
-                '<@(chrome_browser_ui_app_list_linux_sources)',
-              ],
-            }],
-            ['OS!="mac"', {
-              'sources': [
-                '<@(chrome_browser_ui_app_list_views_sources)',
-              ],
-            }],
-          ],
-        }, {
-          'sources': [ '<@(chrome_browser_ui_non_app_list_sources)' ],
-        }],
-        ['enable_extensions==1', {
-          'dependencies': [
-            'browser_extensions',
-            'browser/extensions/api/api_registration.gyp:chrome_api_registration',
-            'common/extensions/api/api.gyp:chrome_api',
-          ],
-          'sources': [ '<@(chrome_browser_ui_extensions_sources)' ],
-        }],
-        ['enable_google_now==1 and OS!="android"', {
-          'sources': [ '<@(chrome_browser_ui_google_now_non_android_sources)' ],
-        }],
-        ['enable_media_router==1 and OS!="android" and OS!="ios"', {
-          'dependencies': [
-            'browser/media/router/media_router.gyp:media_router',
-          ],
-          'sources': [ '<@(chrome_browser_ui_media_router_sources)' ],
-        }],
-        ['enable_supervised_users==0', {
-          'sources!': [
-            'browser/ui/webui/options/supervised_user_create_confirm_handler.cc',
-            'browser/ui/webui/options/supervised_user_create_confirm_handler.h',
-            'browser/ui/webui/options/supervised_user_import_handler.cc',
-            'browser/ui/webui/options/supervised_user_import_handler.h',
-            'browser/ui/webui/options/supervised_user_learn_more_handler.cc',
-            'browser/ui/webui/options/supervised_user_learn_more_handler.h',
-            'browser/ui/webui/signin/signin_supervised_user_import_handler.cc',
-            'browser/ui/webui/signin/signin_supervised_user_import_handler.h',
-          ],
-        }],
-        ['enable_webrtc==1', {
-          'sources': [ '<@(chrome_browser_ui_webrtc_sources)' ],
-        }],
-        ['enable_service_discovery==1', {
-          'sources': [ '<@(chrome_browser_ui_service_discovery_sources)' ],
-        }],
-        ['enable_extensions==1', {
-          'dependencies': [
-            '<(DEPTH)/extensions/components/extensions_components.gyp:javascript_dialog_extensions_client',
-          ],
-        }],
-        ['OS=="win" and (chromium_win_pch==0 or syzyasan==1)', {
-          'msvs_shard': 4,
-        }],
-        ['OS!="android" and OS!="ios"', {
-          'dependencies': [
-            '../components/components.gyp:bubble',
-            '../components/components.gyp:feedback_proto',
-            '../device/bluetooth/bluetooth.gyp:device_bluetooth',
-            '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput',
-            '../third_party/libaddressinput/libaddressinput.gyp:libaddressinput_strings',
-            'chrome_features.gyp:chrome_common_features',
-            'profile_reset_report_proto',
-          ],
-          'sources': [
-            '<@(chrome_browser_ui_non_mobile_sources)',
-            '<@(chrome_browser_ui_omnibox_non_mobile_sources)',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/chrome/chrome_child.gypi b/chrome/chrome_child.gypi
deleted file mode 100644
index 645dd5a..0000000
--- a/chrome/chrome_child.gypi
+++ /dev/null
@@ -1,25 +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.
-
-{
-  'targets': [
-    {
-      'target_name': 'child',
-      'type': 'static_library',
-      'variables': { 'enable_wexit_time_destructors': 1, },
-      'dependencies': [
-        '../base/base.gyp:base',
-        '../content/content.gyp:content_child',
-        'chrome_features.gyp:chrome_common_features',
-      ],
-      'include_dirs': [
-        '..',
-      ],
-      'sources': [
-        'child/pdf_child_init.cc',
-        'child/pdf_child_init.h',
-      ],
-    },
-  ],
-}
diff --git a/chrome/chrome_renderer.gypi b/chrome/chrome_renderer.gypi
deleted file mode 100644
index 1b03a2b..0000000
--- a/chrome/chrome_renderer.gypi
+++ /dev/null
@@ -1,380 +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.
-
-{
-  'variables': {
-    'chrome_renderer_sources': [
-      'renderer/app_categorizer.h',
-      'renderer/app_categorizer.cc',
-      'renderer/banners/app_banner_client.cc',
-      'renderer/banners/app_banner_client.h',
-      'renderer/benchmarking_extension.cc',
-      'renderer/benchmarking_extension.h',
-      'renderer/chrome_content_renderer_client.cc',
-      'renderer/chrome_content_renderer_client.h',
-      'renderer/chrome_render_frame_observer.cc',
-      'renderer/chrome_render_frame_observer.h',
-      'renderer/chrome_render_thread_observer.cc',
-      'renderer/chrome_render_thread_observer.h',
-      'renderer/chrome_render_view_observer.cc',
-      'renderer/chrome_render_view_observer.h',
-      'renderer/content_settings_observer.cc',
-      'renderer/content_settings_observer.h',
-      'renderer/custom_menu_commands.h',
-      'renderer/instant_restricted_id_cache.h',
-      'renderer/loadtimes_extension_bindings.cc',
-      'renderer/loadtimes_extension_bindings.h',
-      'renderer/media/chrome_key_systems.cc',
-      'renderer/media/chrome_key_systems.h',
-      'renderer/net/net_error_helper.cc',
-      'renderer/net/net_error_helper.h',
-      'renderer/net/net_error_page_controller.cc',
-      'renderer/net/net_error_page_controller.h',
-      'renderer/net_benchmarking_extension.cc',
-      'renderer/net_benchmarking_extension.h',
-      'renderer/page_load_histograms.cc',
-      'renderer/page_load_histograms.h',
-      'renderer/page_load_metrics/metrics_render_frame_observer.cc',
-      'renderer/page_load_metrics/metrics_render_frame_observer.h',
-      'renderer/page_load_metrics/page_timing_metrics_sender.cc',
-      'renderer/page_load_metrics/page_timing_metrics_sender.h',
-      'renderer/plugins/non_loadable_plugin_placeholder.cc',
-      'renderer/plugins/non_loadable_plugin_placeholder.h',
-      'renderer/plugins/plugin_uma.cc',
-      'renderer/plugins/plugin_uma.h',
-      'renderer/prerender/prerender_dispatcher.cc',
-      'renderer/prerender/prerender_dispatcher.h',
-      'renderer/prerender/prerender_extra_data.cc',
-      'renderer/prerender/prerender_extra_data.h',
-      'renderer/prerender/prerender_helper.cc',
-      'renderer/prerender/prerender_helper.h',
-      'renderer/prerender/prerenderer_client.cc',
-      'renderer/prerender/prerenderer_client.h',
-      'renderer/searchbox/search_bouncer.cc',
-      'renderer/searchbox/search_bouncer.h',
-      'renderer/searchbox/searchbox.cc',
-      'renderer/searchbox/searchbox.h',
-      'renderer/searchbox/searchbox_extension.cc',
-      'renderer/searchbox/searchbox_extension.h',
-      'renderer/security_filter_peer.cc',
-      'renderer/security_filter_peer.h',
-      'renderer/tts_dispatcher.cc',
-      'renderer/tts_dispatcher.h',
-      'renderer/web_apps.cc',
-      'renderer/web_apps.h',
-      'renderer/worker_content_settings_client_proxy.cc',
-      'renderer/worker_content_settings_client_proxy.h',
-    ],
-    'chrome_renderer_webrtc_sources': [
-      'renderer/media/chrome_webrtc_log_message_delegate.cc',
-      'renderer/media/chrome_webrtc_log_message_delegate.h',
-      'renderer/media/webrtc_logging_message_filter.cc',
-      'renderer/media/webrtc_logging_message_filter.h',
-    ],
-    'chrome_renderer_webrtc_extensions_sources': [
-      'renderer/extensions/cast_streaming_native_handler.cc',
-      'renderer/extensions/cast_streaming_native_handler.h',
-    ],
-    'chrome_renderer_extensions_sources': [
-      'renderer/extensions/app_bindings.cc',
-      'renderer/extensions/app_bindings.h',
-      'renderer/extensions/automation_internal_custom_bindings.cc',
-      'renderer/extensions/automation_internal_custom_bindings.h',
-      'renderer/extensions/chrome_extensions_dispatcher_delegate.cc',
-      'renderer/extensions/chrome_extensions_dispatcher_delegate.h',
-      'renderer/extensions/chrome_extensions_renderer_client.cc',
-      'renderer/extensions/chrome_extensions_renderer_client.h',
-      'renderer/extensions/chrome_v8_extension_handler.cc',
-      'renderer/extensions/chrome_v8_extension_handler.h',
-      'renderer/extensions/extension_localization_peer.cc',
-      'renderer/extensions/extension_localization_peer.h',
-      'renderer/extensions/file_browser_handler_custom_bindings.cc',
-      'renderer/extensions/file_browser_handler_custom_bindings.h',
-      'renderer/extensions/file_manager_private_custom_bindings.cc',
-      'renderer/extensions/file_manager_private_custom_bindings.h',
-      'renderer/extensions/media_galleries_custom_bindings.cc',
-      'renderer/extensions/media_galleries_custom_bindings.h',
-      'renderer/extensions/notifications_native_handler.cc',
-      'renderer/extensions/notifications_native_handler.h',
-      'renderer/extensions/page_capture_custom_bindings.cc',
-      'renderer/extensions/page_capture_custom_bindings.h',
-      'renderer/extensions/platform_keys_natives.cc',
-      'renderer/extensions/platform_keys_natives.h',
-      'renderer/extensions/renderer_permissions_policy_delegate.cc',
-      'renderer/extensions/renderer_permissions_policy_delegate.h',
-      'renderer/extensions/resource_request_policy.cc',
-      'renderer/extensions/resource_request_policy.h',
-      'renderer/extensions/sync_file_system_custom_bindings.cc',
-      'renderer/extensions/sync_file_system_custom_bindings.h',
-      'renderer/extensions/tabs_custom_bindings.cc',
-      'renderer/extensions/tabs_custom_bindings.h',
-      'renderer/extensions/webstore_bindings.cc',
-      'renderer/extensions/webstore_bindings.h',
-      'renderer/media/cast_ipc_dispatcher.cc',
-      'renderer/media/cast_ipc_dispatcher.h',
-      'renderer/media/cast_receiver_audio_valve.cc',
-      'renderer/media/cast_receiver_audio_valve.h',
-      'renderer/media/cast_receiver_session.cc',
-      'renderer/media/cast_receiver_session.h',
-      'renderer/media/cast_receiver_session_delegate.cc',
-      'renderer/media/cast_receiver_session_delegate.h',
-      'renderer/media/cast_rtp_stream.cc',
-      'renderer/media/cast_rtp_stream.h',
-      'renderer/media/cast_session.cc',
-      'renderer/media/cast_session.h',
-      'renderer/media/cast_session_delegate.cc',
-      'renderer/media/cast_session_delegate.h',
-      'renderer/media/cast_threads.cc',
-      'renderer/media/cast_threads.h',
-      'renderer/media/cast_transport_ipc.cc',
-      'renderer/media/cast_transport_ipc.h',
-      'renderer/media/cast_udp_transport.cc',
-      'renderer/media/cast_udp_transport.h',
-      'renderer/resources/extensions/app_custom_bindings.js',
-      'renderer/resources/extensions/automation_custom_bindings.js',
-      'renderer/resources/extensions/browser_action_custom_bindings.js',
-      'renderer/resources/extensions/certificate_provider_custom_bindings.js',
-      'renderer/resources/extensions/chrome_direct_setting.js',
-      'renderer/resources/extensions/chrome_setting.js',
-      'renderer/resources/extensions/content_setting.js',
-      'renderer/resources/extensions/declarative_content_custom_bindings.js',
-      'renderer/resources/extensions/enterprise_platform_keys_custom_bindings.js',
-      'renderer/resources/extensions/feedback_private_custom_bindings.js',
-      'renderer/resources/extensions/file_browser_handler_custom_bindings.js',
-      'renderer/resources/extensions/file_entry_binding_util.js',
-      'renderer/resources/extensions/file_manager_private_custom_bindings.js',
-      'renderer/resources/extensions/file_system_custom_bindings.js',
-      'renderer/resources/extensions/file_system_provider_custom_bindings.js',
-      'renderer/resources/extensions/gcm_custom_bindings.js',
-      'renderer/resources/extensions/identity_custom_bindings.js',
-      'renderer/resources/extensions/image_writer_private_custom_bindings.js',
-      'renderer/resources/extensions/input.ime_custom_bindings.js',
-      'renderer/resources/extensions/log_private_custom_bindings.js',
-      'renderer/resources/extensions/notifications_custom_bindings.js',
-      'renderer/resources/extensions/omnibox_custom_bindings.js',
-      'renderer/resources/extensions/page_action_custom_bindings.js',
-      'renderer/resources/extensions/page_capture_custom_bindings.js',
-      'renderer/resources/extensions/system_indicator_custom_bindings.js',
-      'renderer/resources/extensions/tts_custom_bindings.js',
-      'renderer/resources/extensions/tts_engine_custom_bindings.js',
-    ],
-    'chrome_renderer_plugin_sources': [
-      'renderer/pepper/chrome_renderer_pepper_host_factory.cc',
-      'renderer/pepper/chrome_renderer_pepper_host_factory.h',
-      'renderer/pepper/pepper_flash_drm_renderer_host.cc',
-      'renderer/pepper/pepper_flash_drm_renderer_host.h',
-      'renderer/pepper/pepper_flash_font_file_host.cc',
-      'renderer/pepper/pepper_flash_font_file_host.h',
-      'renderer/pepper/pepper_flash_fullscreen_host.cc',
-      'renderer/pepper/pepper_flash_fullscreen_host.h',
-      'renderer/pepper/pepper_flash_menu_host.cc',
-      'renderer/pepper/pepper_flash_menu_host.h',
-      'renderer/pepper/pepper_flash_renderer_host.cc',
-      'renderer/pepper/pepper_flash_renderer_host.h',
-      'renderer/pepper/pepper_helper.cc',
-      'renderer/pepper/pepper_helper.h',
-      'renderer/pepper/pepper_shared_memory_message_filter.cc',
-      'renderer/pepper/pepper_shared_memory_message_filter.h',
-      'renderer/pepper/pepper_uma_host.cc',
-      'renderer/pepper/pepper_uma_host.h',
-      'renderer/plugins/chrome_plugin_placeholder.cc',
-      'renderer/plugins/chrome_plugin_placeholder.h',
-      'renderer/plugins/plugin_preroller.cc',
-      'renderer/plugins/plugin_preroller.h',
-      'renderer/plugins/power_saver_info.cc',
-      'renderer/plugins/power_saver_info.h',
-    ],
-    # For safe_browsing==1 or safe_browsing==2.
-    'chrome_renderer_basic_safe_browsing_sources': [
-      'renderer/safe_browsing/threat_dom_details.cc',
-      'renderer/safe_browsing/threat_dom_details.h',
-    ],
-    # For safe_browsing==1 only.
-    'chrome_renderer_full_safe_browsing_sources': [
-      'renderer/safe_browsing/feature_extractor_clock.cc',
-      'renderer/safe_browsing/feature_extractor_clock.h',
-      'renderer/safe_browsing/features.cc',
-      'renderer/safe_browsing/features.h',
-      'renderer/safe_browsing/murmurhash3_util.cc',
-      'renderer/safe_browsing/murmurhash3_util.h',
-      'renderer/safe_browsing/phishing_classifier.cc',
-      'renderer/safe_browsing/phishing_classifier.h',
-      'renderer/safe_browsing/phishing_classifier_delegate.cc',
-      'renderer/safe_browsing/phishing_classifier_delegate.h',
-      'renderer/safe_browsing/phishing_dom_feature_extractor.cc',
-      'renderer/safe_browsing/phishing_dom_feature_extractor.h',
-      'renderer/safe_browsing/phishing_term_feature_extractor.cc',
-      'renderer/safe_browsing/phishing_term_feature_extractor.h',
-      'renderer/safe_browsing/phishing_url_feature_extractor.cc',
-      'renderer/safe_browsing/phishing_url_feature_extractor.h',
-      'renderer/safe_browsing/scorer.cc',
-      'renderer/safe_browsing/scorer.h',
-    ],
-    'chrome_renderer_printing_sources': [
-      'renderer/printing/chrome_print_web_view_helper_delegate.cc',
-      'renderer/printing/chrome_print_web_view_helper_delegate.h',
-    ],
-    'chrome_renderer_full_printing_sources': [
-      'renderer/pepper/chrome_pdf_print_client.cc',
-      'renderer/pepper/chrome_pdf_print_client.h',
-    ],
-    'chrome_renderer_leak_detector_sources': [
-      'renderer/leak_detector/leak_detector_remote_client.cc',
-      'renderer/leak_detector/leak_detector_remote_client.h',
-    ],
-  },
-  'targets': [
-    {
-      'target_name': 'renderer',
-      'type': 'static_library',
-      'variables': { 'enable_wexit_time_destructors': 1, },
-      'dependencies': [
-        'common',
-        'common_mojo_bindings',
-        'chrome_features.gyp:chrome_common_features',
-        'chrome_resources.gyp:chrome_resources',
-        'chrome_resources.gyp:chrome_strings',
-        '../third_party/re2/re2.gyp:re2',
-        '../components/components.gyp:autofill_content_renderer',
-        '../components/components.gyp:content_settings_content_common',
-        '../components/components.gyp:cdm_renderer',
-        '../components/components.gyp:data_reduction_proxy_content_common',
-        '../components/components.gyp:data_reduction_proxy_core_common',
-        '../components/components.gyp:guest_view_renderer',
-        '../components/components.gyp:network_hints_renderer',
-        '../components/components.gyp:omnibox_common',
-        '../components/components.gyp:error_page_renderer',
-        '../components/components.gyp:password_manager_content_renderer',
-        '../components/components.gyp:plugins_renderer',
-        '../components/components.gyp:startup_metric_utils_interfaces',
-        '../components/components.gyp:subresource_filter_content_renderer',
-        '../components/components.gyp:translate_content_renderer',
-        '../components/components.gyp:visitedlink_renderer',
-        '../components/components.gyp:web_cache_renderer',
-        '../components/components_resources.gyp:components_resources',
-        '../content/app/resources/content_resources.gyp:content_resources',
-        '../content/app/strings/content_strings.gyp:content_strings',
-        '../content/content.gyp:content_renderer',
-        '../net/net.gyp:net',
-        '../skia/skia.gyp:skia',
-        '../third_party/WebKit/public/blink.gyp:blink',
-        '../third_party/icu/icu.gyp:icui18n',
-        '../third_party/icu/icu.gyp:icuuc',
-        '../third_party/widevine/cdm/widevine_cdm.gyp:widevine_cdm_version_h',
-      ],
-      'include_dirs': [
-        '..',
-        # Needed by chrome_content_renderer_client.cc.
-        '<(SHARED_INTERMEDIATE_DIR)',
-      ],
-      'sources': [
-        '<@(chrome_renderer_sources)',
-      ],
-      'conditions': [
-        ['OS != "ios"', {
-          'dependencies': [
-            'common_net',
-            '../components/components.gyp:contextual_search_renderer',
-            '../components/components.gyp:dom_distiller_content_renderer',
-            '../media/media.gyp:media',
-          ],
-        }],
-        ['disable_nacl!=1', {
-          'dependencies': [
-            '../components/nacl.gyp:nacl',
-            '../components/nacl.gyp:nacl_renderer',
-          ],
-        }],
-        ['enable_plugins==1', {
-          'sources': [
-            '<@(chrome_renderer_plugin_sources)',
-          ],
-          'dependencies': [
-            '../components/components.gyp:pdf_renderer',
-            '../components/components_strings.gyp:components_strings',
-            '../ppapi/ppapi_internal.gyp:ppapi_host',
-            '../ppapi/ppapi_internal.gyp:ppapi_proxy',
-            '../ppapi/ppapi_internal.gyp:ppapi_ipc',
-            '../ppapi/ppapi_internal.gyp:ppapi_shared',
-          ],
-        }],
-        ['safe_browsing==1 or safe_browsing==2', {
-          'sources': [
-            '<@(chrome_renderer_basic_safe_browsing_sources)',
-          ],
-        }],
-        ['safe_browsing==1', {
-          'sources': [
-            '<@(chrome_renderer_full_safe_browsing_sources)',
-          ],
-          'dependencies': [
-            'safe_browsing_proto',
-            '../third_party/smhasher/smhasher.gyp:murmurhash3',
-          ],
-        }],
-        ['enable_extensions==1', {
-          'dependencies': [
-            '../extensions/extensions.gyp:extensions_renderer',
-            '../extensions/extensions_resources.gyp:extensions_resources',
-            '../media/cast/cast.gyp:cast_logging_proto',
-            '../media/cast/cast.gyp:cast_net',
-            '../media/cast/cast.gyp:cast_receiver',
-            '../media/cast/cast.gyp:cast_sender',
-            # TODO(hclam): See crbug.com/298380 for details.
-            # We should isolate the APIs needed by the renderer.
-            '<(DEPTH)/chrome/common/extensions/api/api.gyp:chrome_api',
-          ],
-          'sources': [
-            '<@(chrome_renderer_extensions_sources)',
-          ],
-        }],
-        ['enable_webrtc==1', {
-          'sources': [
-            '<@(chrome_renderer_webrtc_sources)',
-          ],
-        }],
-        ['enable_extensions==1 and enable_webrtc==1', {
-          'sources': [
-            '<@(chrome_renderer_webrtc_extensions_sources)',
-          ],
-        }],
-        ['enable_spellcheck==1', {
-          'dependencies': [ '../components/components.gyp:spellcheck_renderer' ]
-        }],
-        ['enable_basic_printing==1 or enable_print_preview==1', {
-          'dependencies': [
-            '../components/components.gyp:printing_renderer',
-            '../printing/printing.gyp:printing',
-          ],
-          'sources': [
-            '<@(chrome_renderer_printing_sources)',
-          ],
-        }],
-        ['enable_print_preview==1', {
-          'sources': [
-            '<@(chrome_renderer_full_printing_sources)',
-          ],
-        }],
-        ['OS=="win"', {
-          'dependencies': [
-            '../components/components.gyp:dom_distiller_core',  # Needed by chrome_content_renderer_client.cc.
-            '../components/components.gyp:startup_metric_utils_win',
-          ],
-          'include_dirs': [
-            '<(DEPTH)/third_party/wtl/include',
-          ],
-        }],
-        ['chromeos==1', {
-          'sources': [
-            '<@(chrome_renderer_leak_detector_sources)',
-          ],
-          'dependencies': [
-            '../components/components.gyp:metrics_leak_detector',
-            '../components/components.gyp:metrics_mojo_bindings',
-          ],
-        }],
-      ],
-    },
-  ],
-}
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index 76df082..ab46bcb 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -4,23 +4,6 @@
 {
   'variables': {
     'build_angle_deqp_tests%': 0,
-    'chrome_browser_extensions_test_support_sources': [
-      # A list of sources which is shared between different browser tests.
-      'browser/apps/app_browsertest_util.cc',
-      'browser/apps/app_browsertest_util.h',
-      'browser/extensions/browsertest_util.cc',
-      'browser/extensions/browsertest_util.h',
-      'browser/extensions/extension_apitest.cc',
-      'browser/extensions/extension_apitest.h',
-      'browser/extensions/extension_browsertest.cc',
-      'browser/extensions/extension_browsertest.h',
-      'browser/extensions/extension_function_test_utils.cc',
-      'browser/extensions/extension_function_test_utils.h',
-      'browser/extensions/extension_test_notification_observer.cc',
-      'browser/extensions/extension_test_notification_observer.h',
-      'browser/extensions/updater/extension_cache_fake.cc',
-      'browser/extensions/updater/extension_cache_fake.h',
-    ],
     # TODO(rockot) bug 505926: These should be moved to extensions_browsertests
     # but have old dependencies on chrome files. The chrome dependencies should
     # be removed and these moved to the extensions_browsertests target.
@@ -39,915 +22,13 @@
       '../extensions/renderer/script_context_browsertest.cc'
     ],
     'chrome_browser_tests_display_source_apitest': [
-      '../extensions/browser/api/display_source/display_source_apitestbase.cc',
-      '../extensions/browser/api/display_source/display_source_apitestbase.h',
-      'browser/extensions/api/display_source/display_source_wifi_display_apitest.cc',
-    ],
-    # TODO(jbudorick): Move tests here from other lists as Android support is
-    # implemented. See crbug.com/611756
-    'chrome_browser_tests_sources': [
-      # The list of sources which is used by chrome browser tests on all
-      # platforms.
-    ],
-    'chrome_browser_tests_desktop_only_sources': [
-      # The list of sources which is only used by chrome browser tests on
-      # desktop platforms.
-      '../apps/app_restore_service_browsertest.cc',
-      '../apps/load_and_launch_browsertest.cc',
-      'app/chrome_dll.rc',
-      'app/chrome_dll_resource.h',
-      'app/chrome_version.rc.version',
-      'browser/accessibility/browser_accessibility_state_browsertest.cc',
-      'browser/app_controller_mac_browsertest.mm',
-      'browser/apps/app_browsertest.cc',
-      'browser/apps/app_shim/app_shim_host_manager_browsertest_mac.mm',
-      'browser/apps/app_shim/test/app_shim_host_manager_test_api_mac.cc',
-      'browser/apps/app_shim/test/app_shim_host_manager_test_api_mac.h',
-      'browser/apps/app_speech_recognition_browsertest.cc',
-      'browser/apps/app_url_redirector_browsertest.cc',
-      'browser/apps/app_window_browsertest.cc',
-      'browser/apps/event_page_browsertest.cc',
-      'browser/apps/guest_view/app_view_browsertest.cc',
-      'browser/apps/guest_view/extension_view/extension_view_browsertest.cc',
-      'browser/apps/guest_view/web_view_browsertest.cc',
-      'browser/apps/service_worker_browsertest.cc',
-      'browser/apps/window_controls_browsertest.cc',
-      'browser/autocomplete/autocomplete_browsertest.cc',
-      'browser/autofill/autofill_browsertest.cc',
-      'browser/autofill/autofill_server_browsertest.cc',
-      'browser/autofill/content_autofill_driver_browsertest.cc',
-      'browser/autofill/form_structure_browsertest.cc',
-      'browser/banners/app_banner_manager_browsertest.cc',
-      'browser/bitmap_fetcher/bitmap_fetcher_browsertest.cc',
-      'browser/browser_encoding_browsertest.cc',
-      'browser/browsing_data/autofill_counter_browsertest.cc',
-      'browser/browsing_data/browsing_data_cache_storage_helper_browsertest.cc',
-      'browser/browsing_data/browsing_data_database_helper_browsertest.cc',
-      'browser/browsing_data/browsing_data_helper_browsertest.h',
-      'browser/browsing_data/browsing_data_indexed_db_helper_browsertest.cc',
-      'browser/browsing_data/browsing_data_local_storage_helper_browsertest.cc',
-      'browser/browsing_data/browsing_data_remover_browsertest.cc',
-      'browser/browsing_data/browsing_data_remover_test_util.cc',
-      'browser/browsing_data/browsing_data_remover_test_util.h',
-      'browser/browsing_data/cache_counter_browsertest.cc',
-      'browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc',
-      'browser/browsing_data/downloads_counter_browsertest.cc',
-      'browser/browsing_data/history_counter_browsertest.cc',
-      'browser/browsing_data/media_licenses_counter_browsertest.cc',
-      'browser/browsing_data/passwords_counter_browsertest.cc',
-      'browser/chrome_content_browser_client_browsertest.cc',
-      'browser/chrome_main_browsertest.cc',
-      'browser/chrome_navigation_browsertest.cc',
-      'browser/chrome_plugin_browsertest.cc',
-      'browser/chrome_security_exploit_browsertest.cc',
-      'browser/chrome_site_per_process_browsertest.cc',
-      'browser/chrome_switches_browsertest.cc',
-      'browser/collected_cookies_browsertest.cc',
-      'browser/content_settings/content_settings_browsertest.cc',
-      'browser/crash_recovery_browsertest.cc',
-      'browser/custom_handlers/protocol_handler_registry_browsertest.cc',
-      'browser/data_saver/data_saver_browsertest.cc',
-      'browser/devtools/device/adb/adb_client_socket_browsertest.cc',
-      'browser/devtools/device/adb/mock_adb_server.cc',
-      'browser/devtools/device/adb/mock_adb_server.h',
-      'browser/devtools/device/devtools_android_bridge_browsertest.cc',
-      'browser/devtools/device/port_forwarding_browsertest.cc',
-      'browser/devtools/device/usb/android_usb_browsertest.cc',
-      'browser/devtools/devtools_sanity_browsertest.cc',
-      'browser/devtools/devtools_window_testing.cc',
-      'browser/devtools/devtools_window_testing.h',
-      'browser/do_not_track_browsertest.cc',
-      'browser/dom_distiller/distillable_page_utils_browsertest.cc',
-      'browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc',
-      'browser/dom_distiller/tab_utils_browsertest.cc',
-      'browser/download/download_browsertest.cc',
-      'browser/download/download_browsertest.h',
-      'browser/download/download_danger_prompt_browsertest.cc',
-      'browser/download/download_started_animation_browsertest.cc',
-      'browser/download/save_page_browsertest.cc',
-      'browser/extensions/active_tab_apitest.cc',
-      'browser/extensions/activity_log/activity_log_browsertest.cc',
-      'browser/extensions/alert_apitest.cc',
-      'browser/extensions/all_urls_apitest.cc',
-      'browser/extensions/api/activity_log_private/activity_log_private_apitest.cc',
-      'browser/extensions/api/autofill_private/autofill_private_apitest.cc',
-      'browser/extensions/api/automation/automation_apitest.cc',
-      'browser/extensions/api/autotest_private/autotest_private_apitest.cc',
-      'browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc',
-      'browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc',
-      'browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc',
-      'browser/extensions/api/bookmarks/bookmark_apitest.cc',
-      'browser/extensions/api/braille_display_private/braille_display_private_apitest.cc',
-      'browser/extensions/api/braille_display_private/mock_braille_controller.cc',
-      'browser/extensions/api/braille_display_private/mock_braille_controller.h',
-      'browser/extensions/api/browser/browser_apitest.cc',
-      'browser/extensions/api/browsing_data/browsing_data_test.cc',
-      'browser/extensions/api/cast_streaming/cast_streaming_apitest.cc',
-      'browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc',
-      'browser/extensions/api/command_line_private/command_line_private_apitest.cc',
-      'browser/extensions/api/commands/command_service_browsertest.cc',
-      'browser/extensions/api/content_settings/content_settings_apitest.cc',
-      'browser/extensions/api/context_menus/context_menu_apitest.cc',
-      'browser/extensions/api/cookies/cookies_apitest.cc',
-      'browser/extensions/api/debugger/debugger_apitest.cc',
-      'browser/extensions/api/debugger/debugger_extension_apitest.cc',
-      'browser/extensions/api/declarative/declarative_apitest.cc',
-      'browser/extensions/api/declarative_content/declarative_content_apitest.cc',
-      'browser/extensions/api/declarative_content/request_content_script_apitest.cc',
-      'browser/extensions/api/declarative_content/set_icon_apitest.cc',
-      'browser/extensions/api/desktop_capture/desktop_capture_apitest.cc',
-      'browser/extensions/api/developer_private/developer_private_apitest.cc',
-      'browser/extensions/api/dial/dial_apitest.cc',
-      'browser/extensions/api/downloads/downloads_api_browsertest.cc',
-      'browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc',
-      'browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc',
-      'browser/extensions/api/extension_action/browser_action_apitest.cc',
-      'browser/extensions/api/extension_action/browser_action_browsertest.cc',
-      'browser/extensions/api/extension_action/page_action_apitest.cc',
-      'browser/extensions/api/feedback_private/feedback_browsertest.cc',
-      'browser/extensions/api/feedback_private/feedback_private_apitest.cc',
-      'browser/extensions/api/file_system/file_system_apitest.cc',
-      'browser/extensions/api/file_system/file_system_apitest_chromeos.cc',
-      'browser/extensions/api/font_settings/font_settings_apitest.cc',
-      'browser/extensions/api/gcm/gcm_apitest.cc',
-      'browser/extensions/api/history/history_apitest.cc',
-      'browser/extensions/api/hotword_private/hotword_private_apitest.cc',
-      'browser/extensions/api/i18n/i18n_apitest.cc',
-      'browser/extensions/api/identity/identity_apitest.cc',
-      'browser/extensions/api/idltest/idltest_apitest.cc',
-      'browser/extensions/api/image_writer_private/image_writer_private_apitest.cc',
-      'browser/extensions/api/image_writer_private/test_utils.cc',
-      'browser/extensions/api/inline_install_private/inline_install_private_apitest.cc',
-      'browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc',
-      'browser/extensions/api/instance_id/instance_id_apitest.cc',
-      'browser/extensions/api/log_private/log_private_apitest_chromeos.cc',
-      'browser/extensions/api/management/management_api_browsertest.cc',
-      'browser/extensions/api/management/management_apitest.cc',
-      'browser/extensions/api/management/management_browsertest.cc',
-      'browser/extensions/api/media_galleries/media_galleries_apitest.cc',
-      'browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc',
-      'browser/extensions/api/messaging/native_messaging_apitest.cc',
-      'browser/extensions/api/metrics_private/metrics_apitest.cc',
-      'browser/extensions/api/module/module_apitest.cc',
-      'browser/extensions/api/music_manager_private/music_manager_private_browsertest.cc',
-      'browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc',
-      'browser/extensions/api/notification_provider/notification_provider_apitest.cc',
-      'browser/extensions/api/omnibox/omnibox_api_browsertest.cc',
-      'browser/extensions/api/page_capture/page_capture_apitest.cc',
-      'browser/extensions/api/passwords_private/passwords_private_apitest.cc',
-      'browser/extensions/api/permissions/permissions_apitest.cc',
-      'browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc',
-      'browser/extensions/api/preference/preference_apitest.cc',
-      'browser/extensions/api/processes/processes_apitest.cc',
-      'browser/extensions/api/proxy/proxy_apitest.cc',
-      'browser/extensions/api/resources_private/resources_private_apitest.cc',
-      'browser/extensions/api/screenlock_private/screenlock_private_apitest.cc',
-      'browser/extensions/api/sessions/sessions_apitest.cc',
-      'browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc',
-      'browser/extensions/api/settings_private/settings_private_apitest.cc',
-      'browser/extensions/api/socket/socket_apitest.cc',
-      'browser/extensions/api/storage/settings_apitest.cc',
-      'browser/extensions/api/streams_private/streams_private_apitest.cc',
-      'browser/extensions/api/sync_file_system/sync_file_system_apitest.cc',
-      'browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc',
-      'browser/extensions/api/system_indicator/system_indicator_apitest.cc',
-      'browser/extensions/api/system_private/system_private_apitest.cc',
-      'browser/extensions/api/tab_capture/tab_capture_apitest.cc',
-      'browser/extensions/api/tabs/tabs_test.cc',
-      'browser/extensions/api/terminal/terminal_private_apitest.cc',
-      'browser/extensions/api/test/apitest_apitest.cc',
-      'browser/extensions/api/top_sites/top_sites_apitest.cc',
-      'browser/extensions/api/web_navigation/web_navigation_apitest.cc',
-      'browser/extensions/api/web_request/web_request_apitest.cc',
-      'browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc',
-      'browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc',
-      'browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc',
-      'browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc',
-      'browser/extensions/api/webstore_private/webstore_private_apitest.cc',
-      'browser/extensions/app_background_page_apitest.cc',
-      'browser/extensions/app_process_apitest.cc',
-      'browser/extensions/app_window_overrides_browsertest.cc',
-      'browser/extensions/background_app_browsertest.cc',
-      'browser/extensions/background_page_apitest.cc',
-      'browser/extensions/background_scripts_apitest.cc',
-      'browser/extensions/background_xhr_browsertest.cc',
-      'browser/extensions/browsertest_util_browsertest.cc',
-      'browser/extensions/chrome_app_api_browsertest.cc',
-      'browser/extensions/chrome_theme_url_browsertest.cc',
-      'browser/extensions/chrome_ui_overrides_browsertest.cc',
-      'browser/extensions/content_capabilities_browsertest.cc',
-      'browser/extensions/content_script_apitest.cc',
-      'browser/extensions/content_security_policy_apitest.cc',
-      'browser/extensions/content_verifier_browsertest.cc',
-      'browser/extensions/crazy_extension_browsertest.cc',
-      'browser/extensions/cross_origin_xhr_apitest.cc',
-      'browser/extensions/crx_installer_browsertest.cc',
-      'browser/extensions/docs/examples/apps/calculator_browsertest.cc',
-      'browser/extensions/error_console/error_console_browsertest.cc',
-      'browser/extensions/events_apitest.cc',
-      'browser/extensions/execute_script_apitest.cc',
-      'browser/extensions/extension_action_runner_browsertest.cc',
-      'browser/extensions/extension_bindings_apitest.cc',
-      'browser/extensions/extension_context_menu_browsertest.cc',
-      'browser/extensions/extension_disabled_ui_browsertest.cc',
-      'browser/extensions/extension_dom_clipboard_apitest.cc',
-      'browser/extensions/extension_fileapi_apitest.cc',
-      'browser/extensions/extension_functional_browsertest.cc',
-      'browser/extensions/extension_geolocation_apitest.cc',
-      'browser/extensions/extension_get_views_apitest.cc',
-      'browser/extensions/extension_icon_source_apitest.cc',
-      'browser/extensions/extension_incognito_apitest.cc',
-      'browser/extensions/extension_install_prompt_browsertest.cc',
-      'browser/extensions/extension_install_prompt_test_helper.cc',
-      'browser/extensions/extension_install_prompt_test_helper.h',
-      'browser/extensions/extension_install_ui_browsertest.cc',
-      'browser/extensions/extension_javascript_url_apitest.cc',
-      'browser/extensions/extension_loading_browsertest.cc',
-      'browser/extensions/extension_management_test_util.cc',
-      'browser/extensions/extension_management_test_util.h',
-      'browser/extensions/extension_messages_apitest.cc',
-      'browser/extensions/extension_override_apitest.cc',
-      'browser/extensions/extension_request_limiting_throttle_browsertest.cc',
-      'browser/extensions/extension_resource_request_policy_apitest.cc',
-      'browser/extensions/extension_startup_browsertest.cc',
-      'browser/extensions/extension_storage_apitest.cc',
-      'browser/extensions/extension_storage_monitor_browsertest.cc',
-      'browser/extensions/extension_tab_util_browsertest.cc',
-      'browser/extensions/extension_tabs_apitest.cc',
-      'browser/extensions/extension_url_rewrite_browsertest.cc',
-      'browser/extensions/extension_view_host_factory_browsertest.cc',
-      'browser/extensions/extension_websocket_apitest.cc',
-      'browser/extensions/extension_webui_apitest.cc',
-      'browser/extensions/fetch_apitest.cc',
-      'browser/extensions/gpu_browsertest.cc',
-      'browser/extensions/hotword_browsertest.cc',
-      'browser/extensions/isolated_app_browsertest.cc',
-      'browser/extensions/lazy_background_page_apitest.cc',
-      'browser/extensions/lazy_background_page_test_util.h',
-      'browser/extensions/mutation_observers_apitest.cc',
-      'browser/extensions/options_page_apitest.cc',
-      'browser/extensions/page_action_browsertest.cc',
-      'browser/extensions/process_management_browsertest.cc',
-      'browser/extensions/process_manager_browsertest.cc',
-      'browser/extensions/requirements_checker_browsertest.cc',
-      'browser/extensions/renderer_initialization_browsertest.cc',
-      'browser/extensions/sandboxed_pages_apitest.cc',
-      'browser/extensions/service_worker_apitest.cc',
-      'browser/extensions/shared_module_apitest.cc',
-      'browser/extensions/startup_helper_browsertest.cc',
-      'browser/extensions/stubs_apitest.cc',
-      'browser/extensions/subscribe_page_action_browsertest.cc',
-      'browser/extensions/wake_event_page_apitest.cc',
-      'browser/extensions/web_contents_browsertest.cc',
-      'browser/extensions/webstore_inline_installer_browsertest.cc',
-      'browser/extensions/webstore_installer_browsertest.cc',
-      'browser/extensions/webstore_installer_test.cc',
-      'browser/extensions/webstore_installer_test.h',
-      'browser/extensions/webstore_reinstaller_browsertest.cc',
-      'browser/extensions/webstore_startup_installer_browsertest.cc',
-      'browser/extensions/window_open_apitest.cc',
-      'browser/fast_shutdown_browsertest.cc',
-      'browser/favicon/content_favicon_driver_browsertest.cc',
-      'browser/first_run/first_run_browsertest.cc',
-      'browser/first_run/try_chrome_dialog_view_browsertest.cc',
-      'browser/geolocation/access_token_store_browsertest.cc',
-      'browser/geolocation/geolocation_browsertest.cc',
-      'browser/global_keyboard_shortcuts_mac_browsertest.mm',
-      'browser/history/history_browsertest.cc',
-      'browser/history/redirect_browsertest.cc',
-      'browser/iframe_browsertest.cc',
-      'browser/image_decoder_browsertest.cc',
-      'browser/importer/edge_importer_browsertest_win.cc',
-      'browser/importer/firefox_importer_browsertest.cc',
-      'browser/importer/ie_importer_browsertest_win.cc',
-      'browser/importer/importer_unittest_utils.cc',
-      'browser/importer/importer_unittest_utils.h',
-      'browser/infobars/infobars_browsertest.cc',
-      'browser/installable/installable_manager_browsertest.cc',
-      'browser/interstitials/security_interstitial_page_test_utils.cc',
-      'browser/interstitials/security_interstitial_page_test_utils.h',
-      'browser/invalidation/profile_invalidation_provider_factory_browsertest.cc',
-      'browser/lifetime/browser_close_manager_browsertest.cc',
-      'browser/loadtimes_extension_bindings_browsertest.cc',
-      'browser/locale_tests_browsertest.cc',
-      'browser/media/defer_background_media_browsertest.cc',
-      'browser/media/encrypted_media_browsertest.cc',
-      'browser/media/encrypted_media_supported_types_browsertest.cc',
-      'browser/media/media_browsertest.cc',
-      'browser/media/media_browsertest.h',
-      'browser/media/media_stream_devices_controller_browsertest.cc',
-      'browser/media/media_stream_infobar_browsertest.cc',
-      'browser/media/test_license_server.cc',
-      'browser/media/test_license_server.h',
-      'browser/media/test_license_server_config.h',
-      'browser/media/webrtc_apprtc_browsertest.cc',
-      'browser/media/webrtc_audio_quality_browsertest.cc',
-      'browser/media/webrtc_browsertest.cc',
-      'browser/media/webrtc_browsertest_audio.cc',
-      'browser/media/webrtc_browsertest_audio.h',
-      'browser/media/webrtc_browsertest_base.cc',
-      'browser/media/webrtc_browsertest_base.h',
-      'browser/media/webrtc_browsertest_common.cc',
-      'browser/media/webrtc_browsertest_common.h',
-      'browser/media/webrtc_browsertest_perf.cc',
-      'browser/media/webrtc_browsertest_perf.h',
-      'browser/media/webrtc_disable_encryption_flag_browsertest.cc',
-      'browser/media/webrtc_getmediadevices_browsertest.cc',
-      'browser/media/webrtc_perf_browsertest.cc',
-      'browser/media/webrtc_simulcast_browsertest.cc',
-      'browser/media/webrtc_video_quality_browsertest.cc',
-      'browser/media/webrtc_webcam_browsertest.cc',
-      'browser/media/wv_test_license_server_config.cc',
-      'browser/media/wv_test_license_server_config.h',
-      'browser/media_galleries/fileapi/iapps_finder_impl_win_browsertest.cc',
-      'browser/media_galleries/fileapi/media_file_validator_browsertest.cc',
-      'browser/media_galleries/media_galleries_dialog_controller_mock.cc',
-      'browser/media_galleries/media_galleries_dialog_controller_mock.h',
-      'browser/memory/tab_manager_browsertest.cc',
-      'browser/memory/tab_manager_observer_browsertest.cc',
-      'browser/metrics/metrics_memory_details_browsertest.cc',
-      'browser/metrics/metrics_service_browsertest.cc',
-      'browser/net/cookie_policy_browsertest.cc',
-      'browser/net/dns_probe_browsertest.cc',
-      'browser/net/errorpage_browsertest.cc',
-      'browser/net/ftp_browsertest.cc',
-      'browser/net/load_timing_browsertest.cc',
-      'browser/net/nss_context_chromeos_browsertest.cc',
-      'browser/net/nqe/ui_network_quality_estimator_service_browsertest.cc',
-      'browser/net/nqe/ui_network_quality_estimator_service_test_util.cc',
-      'browser/net/nqe/ui_network_quality_estimator_service_test_util.h',
-      "browser/net/spdyproxy/chrome_data_use_group_browsertest.cc",
-      'browser/net/predictor_browsertest.cc',
-      'browser/net/proxy_browsertest.cc',
-      'browser/net/sdch_browsertest.cc',
-      'browser/net/websocket_browsertest.cc',
-      'browser/page_load_metrics/page_load_metrics_browsertest.cc',
-      'browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc',
-      'browser/password_manager/credential_manager_browsertest.cc',
-      'browser/password_manager/password_manager_browsertest.cc',
-      'browser/pdf/pdf_extension_test.cc',
-      'browser/pdf/pdf_extension_test_util.cc',
-      'browser/pdf/pdf_extension_test_util.h',
-      'browser/permissions/permission_request_manager_browsertest.cc',
-      'browser/plugins/plugin_power_saver_browsertest.cc',
-      'browser/policy/cloud/cloud_policy_browsertest.cc',
-      'browser/policy/cloud/cloud_policy_manager_browsertest.cc',
-      'browser/policy/cloud/component_cloud_policy_browsertest.cc',
-      'browser/policy/cloud/device_management_service_browsertest.cc',
-      'browser/policy/cloud/test_request_interceptor.cc',
-      'browser/policy/cloud/test_request_interceptor.h',
-      'browser/policy/policy_browsertest.cc',
-      'browser/policy/policy_network_browsertest.cc',
-      'browser/policy/policy_prefs_browsertest.cc',
-      'browser/policy/policy_startup_browsertest.cc',
-      'browser/prefetch/prefetch_browsertest.cc',
-      'browser/prefs/pref_functional_browsertest.cc',
-      'browser/prefs/pref_service_browsertest.cc',
-      'browser/prefs/synced_pref_change_registrar_browsertest.cc',
-      'browser/prefs/tracked/pref_hash_browsertest.cc',
-      'browser/prerender/prerender_browsertest.cc',
-      'browser/printing/cloud_print/test/cloud_print_policy_browsertest.cc',
-      'browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc',
-      'browser/printing/print_preview_dialog_controller_browsertest.cc',
-      'browser/printing/print_preview_pdf_generated_browsertest.cc',
-      'browser/process_singleton_browsertest.cc',
-      'browser/profile_resetter/profile_resetter_browsertest.cc',
-      'browser/profiles/host_zoom_map_browsertest.cc',
-      'browser/profiles/profile_browsertest.cc',
-      'browser/profiles/profile_list_desktop_browsertest.cc',
-      'browser/profiles/profile_manager_browsertest.cc',
-      'browser/profiles/profile_window_browsertest.cc',
-      'browser/push_messaging/push_messaging_browsertest.cc',
-      'browser/referrer_policy_browsertest.cc',
-      'browser/renderer_context_menu/mock_render_view_context_menu.cc',
-      'browser/renderer_context_menu/mock_render_view_context_menu.h',
-      'browser/renderer_context_menu/render_view_context_menu_browsertest.cc',
-      'browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc',
-      'browser/renderer_context_menu/render_view_context_menu_browsertest_util.h',
-      'browser/renderer_context_menu/render_view_context_menu_test_util.cc',
-      'browser/renderer_context_menu/render_view_context_menu_test_util.h',
-      'browser/renderer_context_menu/spelling_menu_observer_browsertest.cc',
-      'browser/renderer_host/chrome_resource_dispatcher_host_delegate_browsertest.cc',
-      'browser/renderer_host/render_process_host_chrome_browsertest.cc',
-      'browser/repost_form_warning_browsertest.cc',
-      'browser/safe_browsing/srt_fetcher_browsertest_win.cc',
-      'browser/safe_json_parser_browsertest.cc',
-      'browser/search/hotword_installer_browsertest.cc',
-      'browser/search/suggestions/image_fetcher_impl_browsertest.cc',
-      'browser/search_engines/template_url_scraper_browsertest.cc',
-      'browser/service_process/service_process_control_browsertest.cc',
-      'browser/services/gcm/fake_gcm_profile_service.cc',
-      'browser/services/gcm/fake_gcm_profile_service.h',
-      'browser/sessions/better_session_restore_browsertest.cc',
-      'browser/sessions/persistent_tab_restore_service_browsertest.cc',
-      'browser/sessions/session_restore_browsertest.cc',
-      'browser/sessions/session_restore_browsertest_chromeos.cc',
-      'browser/sessions/tab_restore_browsertest.cc',
-      'browser/site_details_browsertest.cc',
-      'browser/spellchecker/spellcheck_service_browsertest.cc',
-      'browser/ssl/captive_portal_blocking_page_browsertest.cc',
-      'browser/ssl/cert_verifier_browser_test.cc',
-      'browser/ssl/cert_verifier_browser_test.h',
-      'browser/ssl/certificate_reporting_test_utils.cc',
-      'browser/ssl/certificate_reporting_test_utils.h',
-      'browser/ssl/chrome_security_state_model_client_browser_tests.cc',
-      'browser/ssl/chrome_ssl_host_state_delegate_test.cc',
-      'browser/ssl/ssl_browser_tests.cc',
-      'browser/ssl/ssl_client_certificate_selector_test.cc',
-      'browser/ssl/ssl_client_certificate_selector_test.h',
-      'browser/storage/durable_storage_browsertest.cc',
-      'browser/subresource_filter/subresource_filter_browsertest.cc',
-      'browser/sync_file_system/mock_local_change_processor.cc',
-      'browser/sync_file_system/mock_local_change_processor.h',
-      'browser/sync_file_system/mock_remote_file_sync_service.cc',
-      'browser/sync_file_system/mock_remote_file_sync_service.h',
-      'browser/tab_contents/view_source_browsertest.cc',
-      'browser/task_manager/mock_web_contents_task_manager.cc',
-      'browser/task_manager/mock_web_contents_task_manager.h',
-      'browser/task_manager/providers/web_contents/background_contents_tag_browsertest.cc',
-      'browser/task_manager/providers/web_contents/devtools_tag_browsertest.cc',
-      'browser/task_manager/providers/web_contents/extension_tag_browsertest.cc',
-      'browser/task_manager/providers/web_contents/subframe_task_browsertest.cc',
-      'browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc',
-      'browser/task_manager/task_manager_browsertest.cc',
-      'browser/task_manager/task_manager_browsertest_util.cc',
-      'browser/task_manager/task_manager_browsertest_util.h',
-      'browser/task_manager/task_manager_tester.cc',
-      'browser/task_manager/task_manager_tester.h',
-      'browser/themes/theme_service_browsertest.cc',
-      'browser/tracing/chrome_tracing_delegate_browsertest.cc',
-      'browser/translate/translate_browsertest.cc',
-      'browser/translate/translate_manager_browsertest.cc',
-      'browser/ui/autofill/card_unmask_prompt_view_browsertest.cc',
-      'browser/ui/autofill/card_unmask_prompt_view_tester.h',
-      'browser/ui/autofill/password_generation_popup_view_browsertest.cc',
-      'browser/ui/autofill/password_generation_popup_view_tester.h',
-      'browser/ui/blocked_content/popup_blocker_browsertest.cc',
-      'browser/ui/bookmarks/bookmark_browsertest.cc',
-      'browser/ui/browser_browsertest.cc',
-      'browser/ui/browser_command_controller_browsertest.cc',
-      'browser/ui/browser_navigator_browsertest.cc',
-      'browser/ui/browser_navigator_browsertest.h',
-      'browser/ui/browser_navigator_browsertest_chromeos.cc',
-      'browser/ui/browser_tabrestore_browsertest.cc',
-      'browser/ui/content_settings/content_setting_bubble_model_browsertest.cc',
-      'browser/ui/content_settings/content_setting_image_model_browsertest.cc',
-      'browser/ui/exclusive_access/fullscreen_controller_browsertest.cc',
-      'browser/ui/extensions/extension_installed_bubble_browsertest.cc',
-      'browser/ui/extensions/extension_message_bubble_browsertest.cc',
-      'browser/ui/extensions/extension_message_bubble_browsertest.h',
-      'browser/ui/extensions/hosted_app_browsertest.cc',
-      'browser/ui/find_bar/find_bar_host_browsertest.cc',
-      'browser/ui/location_bar/location_bar_browsertest.cc',
-      'browser/ui/login/login_handler_browsertest.cc',
-      'browser/ui/native_window_tracker_browsertest.cc',
-      'browser/ui/passwords/manage_passwords_test.cc',
-      'browser/ui/prefs/prefs_tab_helper_browsertest.cc',
-      'browser/ui/profile_error_browsertest.cc',
-      'browser/ui/search/new_tab_page_interceptor_browsertest.cc',
-      'browser/ui/search_engines/search_engine_tab_helper_browsertest.cc',
-      'browser/ui/settings_window_manager_browsertest.cc',
-      'browser/ui/startup/startup_browser_creator_browsertest.cc',
-      'browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc',
-      'browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc',
-      'browser/ui/sync/one_click_signin_links_delegate_impl_browsertest.cc',
-      'browser/ui/sync/profile_signin_confirmation_helper_browsertest.cc',
-      'browser/ui/tab_modal_confirm_dialog_browsertest.cc',
-      'browser/ui/tab_modal_confirm_dialog_browsertest.h',
-      'browser/ui/toolbar/browser_actions_bar_browsertest.cc',
-      'browser/ui/toolbar/browser_actions_bar_browsertest.h',
-      'browser/ui/toolbar/component_toolbar_actions_browsertest.cc',
-      'browser/ui/toolbar/mock_component_toolbar_actions_factory.cc',
-      'browser/ui/toolbar/mock_component_toolbar_actions_factory.h',
-      'browser/ui/website_settings/mock_permission_prompt.cc',
-      'browser/ui/website_settings/mock_permission_prompt.h',
-      'browser/ui/website_settings/mock_permission_prompt_factory.cc',
-      'browser/ui/website_settings/mock_permission_prompt_factory.h',
-      'browser/ui/website_settings/permission_bubble_browser_test_util.cc',
-      'browser/ui/website_settings/permission_bubble_browser_test_util.h',
-      'browser/ui/webui/bidi_checker_web_ui_test.cc',
-      'browser/ui/webui/bidi_checker_web_ui_test.h',
-      'browser/ui/webui/bookmarks_ui_browsertest.cc',
-      'browser/ui/webui/chrome_url_data_manager_browsertest.cc',
-      'browser/ui/webui/chromeos/bluetooth_pairing_ui_browsertest-inl.h',
-      'browser/ui/webui/constrained_web_dialog_ui_browsertest.cc',
-      'browser/ui/webui/extensions/extension_settings_browsertest.cc',
-      'browser/ui/webui/extensions/extension_settings_browsertest.h',
-      'browser/ui/webui/identity_internals_ui_browsertest.cc',
-      'browser/ui/webui/identity_internals_ui_browsertest.h',
-      'browser/ui/webui/inspect_ui_browsertest.cc',
-      'browser/ui/webui/interstitials/interstitial_ui_browsertest.cc',
-      'browser/ui/webui/log_web_ui_url_browsertest.cc',
-      'browser/ui/webui/net_internals/net_internals_ui_browsertest.cc',
-      'browser/ui/webui/net_internals/net_internals_ui_browsertest.h',
-      'browser/ui/webui/ntp/new_tab_ui_browsertest.cc',
-      'browser/ui/webui/options/certificate_manager_browsertest.cc',
-      'browser/ui/webui/options/clear_browser_data_browsertest.cc',
-      'browser/ui/webui/options/content_settings_exception_area_browsertest.cc',
-      'browser/ui/webui/options/multilanguage_options_browsertest.cc',
-      'browser/ui/webui/options/multilanguage_options_browsertest.h',
-      'browser/ui/webui/options/options_browsertest.cc',
-      'browser/ui/webui/options/options_ui_browsertest.cc',
-      'browser/ui/webui/options/options_ui_browsertest.h',
-      'browser/ui/webui/options/preferences_browsertest.cc',
-      'browser/ui/webui/options/preferences_browsertest.h',
-      'browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc',
-      'browser/ui/webui/policy_ui_browsertest.cc',
-      'browser/ui/webui/print_preview/print_preview_ui_browsertest.cc',
-      'browser/ui/webui/set_as_default_browser_ui_browsertest_win.cc',
-      'browser/ui/webui/settings/md_settings_ui_browsertest.cc',
-      'browser/ui/webui/signin/inline_login_ui_browsertest.cc',
-      'browser/ui/webui/signin/user_manager_ui_browsertest.cc',
-      'browser/ui/webui/uber/uber_ui_browsertest.cc',
-      'browser/ui/webui/web_ui_test_handler.cc',
-      'browser/ui/webui/web_ui_test_handler.h',
-      'browser/ui/webui/webui_browsertest.cc',
-      'browser/ui/webui/webui_webview_browsertest.cc',
-      'browser/ui/zoom/zoom_controller_browsertest.cc',
-      'browser/unload_browsertest.cc',
-      'browser/web_bluetooth_browsertest.cc',
-      'common/mac/app_mode_chrome_locator_browsertest.mm',
-      'common/mac/mock_launchd.cc',
-      'common/mac/mock_launchd.h',
-      'common/time_format_browsertest.cc',
-      'renderer/autofill/autofill_renderer_browsertest.cc',
-      'renderer/autofill/form_autocomplete_browsertest.cc',
-      'renderer/autofill/form_autofill_browsertest.cc',
-      'renderer/autofill/form_classifier_browsertest.cc',
-      'renderer/autofill/page_click_tracker_browsertest.cc',
-      'renderer/autofill/password_autofill_agent_browsertest.cc',
-      'renderer/autofill/password_generation_agent_browsertest.cc',
-      'renderer/autofill/password_generation_test_utils.cc',
-      'renderer/autofill/password_generation_test_utils.h',
-      'renderer/chrome_content_renderer_client_browsertest.cc',
-      'renderer/chrome_render_frame_observer_browsertest.cc',
-      'renderer/content_settings_observer_browsertest.cc',
-      'renderer/media/cast_session_browsertest.cc',
-      'renderer/translate/translate_helper_browsertest.cc',
-      'renderer/translate/translate_script_browsertest.cc',
-      'test/base/chrome_render_view_test.cc',
-      'test/base/chrome_render_view_test.h',
-      'test/base/in_process_browser_test_browsertest.cc',
-      'test/base/javascript_browser_test.cc',
-      'test/base/javascript_browser_test.h',
-      'test/base/test_chrome_web_ui_controller_factory.cc',
-      'test/base/test_chrome_web_ui_controller_factory.h',
-      'test/base/test_chrome_web_ui_controller_factory_browsertest.cc',
-      'test/base/tracing_browsertest.cc',
-      'test/base/web_ui_browser_test.cc',
-      'test/base/web_ui_browser_test.h',
-      'test/base/web_ui_browser_test_browsertest.cc',
-      'test/data/webui/async_gen.cc',
-      'test/data/webui/async_gen.h',
-      'test/data/webui/certificate_viewer_ui_test-inl.h',
-      'test/data/webui/chrome_send_browsertest.cc',
-      'test/data/webui/chrome_send_browsertest.h',
-      'test/data/webui/history_ui_browsertest.cc',
-      'test/data/webui/history_ui_browsertest.h',
-      'test/data/webui/ntp4_browsertest.cc',
-      'test/data/webui/ntp4_browsertest.h',
-      'test/data/webui/print_preview.cc',
-      'test/data/webui/print_preview.h',
-      'test/data/webui/webui_resource_browsertest.cc',
-      'test/gpu/webgl_infobar_browsertest.cc',
-      'test/ppapi/ppapi_browsertest.cc',
-      'test/ppapi/ppapi_filechooser_browsertest.cc',
-    ],
-    # Tests for Mac only (Cocoa and mac_views_browser=1).
-    'chrome_browser_tests_mac_sources': [
-      'browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm',
-      'browser/spellchecker/spellcheck_message_filter_platform_mac_browsertest.cc',
-      'browser/ui/cocoa/certificate_viewer_mac_browsertest.mm',
     ],
     # Tests corresponding to the files in chrome_browser_ui_cocoa_sources.
     # Built on Mac, except when mac_views_browser==1.
     'chrome_browser_tests_cocoa_sources': [
-      'browser/ui/cocoa/accelerators_cocoa_browsertest.mm',
-      'browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm',
-      'browser/ui/cocoa/applescript/window_applescript_test.mm',
-      'browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm',
-      'browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm',
-      'browser/ui/cocoa/browser_window_controller_browsertest.mm',
-      'browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm',
-      'browser/ui/cocoa/content_settings/collected_cookies_mac_browsertest.mm',
-      'browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm',
-      'browser/ui/cocoa/dev_tools_controller_browsertest.mm',
-      'browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm',
-      'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h',
-      'browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm',
-      'browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm',
-      'browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_browsertest.mm',
-      'browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm',
-      'browser/ui/cocoa/find_bar/find_bar_browsertest.mm',
-      'browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm',
-      'browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm',
-      'browser/ui/cocoa/passwords/passwords_bubble_browsertest.mm',
-      'browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm',
-      'browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac_browsertest.mm',
-      'browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm',
-      'browser/ui/cocoa/task_manager_mac_browsertest.mm',
-      'browser/ui/cocoa/view_id_util_browsertest.mm',
-      'browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac_browsertest.mm',
-      'browser/ui/cocoa/website_settings/permission_bubble_cocoa_browser_test.mm',
-    ],
-    'chrome_browser_app_list_ash_test_support_sources': [
-      'browser/ui/ash/app_list/test/app_list_service_ash_test_api.cc',
-      'browser/ui/ash/app_list/test/app_list_service_ash_test_api.h',
-    ],
-    'chrome_browser_tests_ash_sources': [
-      'browser/ui/ash/accelerator_commands_browsertest.cc',
-      'browser/ui/ash/accelerator_controller_browsertest.cc',
-      'browser/ui/ash/chrome_new_window_delegate_browsertest.cc',
-      'browser/ui/ash/keyboard_controller_browsertest.cc',
-      'browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc',
-      'browser/ui/ash/launcher/launcher_favicon_loader_browsertest.cc',
-      'browser/ui/ash/multi_user/multi_user_window_manager_test.cc',
-      'browser/ui/ash/multi_user/multi_user_window_manager_test.h',
-      'browser/ui/ash/shelf_browsertest.cc',
-      'browser/ui/ash/system_tray_delegate_chromeos_browsertest_chromeos.cc',
-      'browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc',
-      'browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc',
-      'browser/ui/ash/volume_controller_browsertest_chromeos.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc',
-    ],
-    # Cross-platform views browser tests ready for toolkit-views on Mac.
-    'chrome_browser_tests_views_sources': [
-      'browser/ui/global_error/global_error_service_browsertest.cc',
-      'browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view_browsertest_win.cc',
-      'browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc',
-      'browser/ui/views/select_file_dialog_extension_browsertest.cc',
-    ],
-    # Cross-platform (except Mac/Cocoa) views browser tests. Excluded on Mac
-    # unless building with mac_views_browser=1.
-    'chrome_browser_tests_views_non_mac_sources': [
-      # TODO(tapted): Move these to chrome_browser_tests_views_sources when the
-      # the corresponding files are moved in chrome_browser_ui.gypi (i.e. out of
-      # chrome_browser_ui_views_non_mac_sources). http://crbug.com/404979.
-      'browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc',
-      'browser/ui/views/autofill/card_unmask_prompt_view_tester_views.cc',
-      'browser/ui/views/autofill/card_unmask_prompt_view_tester_views.h',
-      'browser/ui/views/autofill/password_generation_popup_view_tester_views.cc',
-      'browser/ui/views/autofill/password_generation_popup_view_tester_views.h',
-      'browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc',
-      'browser/ui/views/collected_cookies_views_browsertest.cc',
-      'browser/ui/views/extensions/bookmark_override_browsertest.cc',
-      'browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc',
-      'browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc',
-      'browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc',
-      'browser/ui/views/frame/browser_view_browsertest.cc',
-      'browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc',
-      'browser/ui/views/media_router/media_router_ui_browsertest.cc',
-      'browser/ui/views/passwords/password_dialog_view_browsertest.cc',
-      'browser/ui/views/task_manager_view_browsertest.cc',
-      'browser/ui/views/toolbar/browser_actions_container_browsertest.cc',
-      'browser/ui/views/toolbar/toolbar_view_browsertest.cc',
-      'browser/ui/views/translate/translate_bubble_view_browsertest.cc',
-      'browser/ui/views/web_dialog_view_browsertest.cc',
-    ],
-    'chrome_browser_tests_non_mac_desktop_sources': [
-      # This test is for the spelling options submenu that's only for Windows,
-      # ChromeOS, and Linux.
-      'browser/renderer_context_menu/spelling_options_submenu_observer_browsertest.cc',
-    ],
-    'chrome_browser_tests_chromeos_sources': [
-      '../ui/base/ime/chromeos/input_method_whitelist.cc',
-      '../ui/base/ime/chromeos/input_method_whitelist.h',
-      'browser/apps/custom_launcher_page_browsertest_views.cc',
-      'browser/chromeos/accessibility/accessibility_manager_browsertest.cc',
-      'browser/chromeos/accessibility/magnification_manager_browsertest.cc',
-      'browser/chromeos/accessibility/speech_monitor.cc',
-      'browser/chromeos/accessibility/speech_monitor.h',
-      'browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc',
-      'browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc',
-      'browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc',
-      'browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc',
-      'browser/chromeos/arc/arc_auth_service_browsertest.cc',
-      'browser/chromeos/attestation/attestation_policy_browsertest.cc',
-      'browser/chromeos/customization/customization_document_browsertest.cc',
-      'browser/chromeos/customization/customization_wallpaper_downloader_browsertest.cc',
-      'browser/chromeos/device/input_service_proxy_browsertest.cc',
-      'browser/chromeos/device/input_service_test_helper.cc',
-      'browser/chromeos/device/input_service_test_helper.h',
-      'browser/chromeos/display/quirks_browsertest.cc',
-      'browser/chromeos/drive/drive_integration_service_browsertest.cc',
-      'browser/chromeos/extensions/accessibility_features_apitest.cc',
-      'browser/chromeos/extensions/echo_private_apitest.cc',
-      'browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc',
-      'browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc',
-      'browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc',
-      'browser/chromeos/extensions/info_private_apitest.cc',
-      'browser/chromeos/extensions/input_method_apitest_chromeos.cc',
-      'browser/chromeos/extensions/users_private/users_private_apitest.cc',
-      'browser/chromeos/extensions/virtual_keyboard_browsertest.cc',
-      'browser/chromeos/extensions/virtual_keyboard_browsertest.h',
-      'browser/chromeos/extensions/wallpaper_apitest.cc',
-      'browser/chromeos/extensions/wallpaper_manager_browsertest.cc',
-      'browser/chromeos/extensions/wallpaper_private_apitest.cc',
-      'browser/chromeos/file_manager/audio_player_browsertest.cc',
-      'browser/chromeos/file_manager/external_filesystem_apitest.cc',
-      'browser/chromeos/file_manager/file_manager_browsertest.cc',
-      'browser/chromeos/file_manager/file_manager_browsertest_base.cc',
-      'browser/chromeos/file_manager/file_manager_browsertest_base.h',
-      'browser/chromeos/file_manager/file_manager_jstest.cc',
-      'browser/chromeos/file_manager/file_manager_jstest_base.cc',
-      'browser/chromeos/file_manager/file_manager_jstest_base.h',
-      'browser/chromeos/file_manager/gallery_browsertest.cc',
-      'browser/chromeos/file_manager/gallery_jstest.cc',
-      'browser/chromeos/file_manager/image_loader_jstest.cc',
-      'browser/chromeos/file_manager/mount_test_util.cc',
-      'browser/chromeos/file_manager/mount_test_util.h',
-      'browser/chromeos/file_manager/video_player_browsertest.cc',
-      'browser/chromeos/file_manager/zip_file_creator_browsertest.cc',
-      'browser/chromeos/first_run/chromeos_first_run_browsertest.cc',
-      'browser/chromeos/first_run/drive_first_run_browsertest.cc',
-      'browser/chromeos/first_run/goodies_displayer_browsertest.cc',
-      'browser/chromeos/input_method/input_method_engine_browsertests.cc',
-      'browser/chromeos/input_method/mode_indicator_browsertest.cc',
-      'browser/chromeos/login/bluetooth_host_pairing_browsertest.cc',
-      'browser/chromeos/login/crash_restore_browsertest.cc',
-      'browser/chromeos/login/demo_mode/demo_app_launcher_browsertest.cc',
-      'browser/chromeos/login/easy_unlock/bootstrap_browsertest.cc',
-      'browser/chromeos/login/enable_debugging_browsertest.cc',
-      'browser/chromeos/login/enrollment/enrollment_screen_browsertest.cc',
-      'browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.cc',
-      'browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h',
-      'browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.cc',
-      'browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h',
-      'browser/chromeos/login/enrollment/mock_enrollment_screen.cc',
-      'browser/chromeos/login/enrollment/mock_enrollment_screen.h',
-      'browser/chromeos/login/enterprise_enrollment_browsertest.cc',
-      'browser/chromeos/login/existing_user_controller_browsertest.cc',
-      'browser/chromeos/login/hid_detection_browsertest.cc',
-      'browser/chromeos/login/kiosk_browsertest.cc',
-      'browser/chromeos/login/lock/screen_locker_tester.cc',
-      'browser/chromeos/login/lock/screen_locker_tester.h',
-      'browser/chromeos/login/login_manager_test.cc',
-      'browser/chromeos/login/login_manager_test.h',
-      'browser/chromeos/login/login_screen_policy_browsertest.cc',
-      'browser/chromeos/login/login_ui_keyboard_browsertest.cc',
-      'browser/chromeos/login/login_utils_browsertest.cc',
-      'browser/chromeos/login/mixin_based_browser_test.cc',
-      'browser/chromeos/login/mixin_based_browser_test.h',
-      'browser/chromeos/login/oobe_localization_browsertest.cc',
-      # TODO(nkostylev) Re-enable ResourceLoaderBrowserTest.
-      #'browser/chromeos/login/resource_loader_browsertest.cc',
-      'browser/chromeos/login/proxy_auth_dialog_browsertest.cc',
-      'browser/chromeos/login/reset_browsertest.cc',
-      'browser/chromeos/login/saml/saml_browsertest.cc',
-      'browser/chromeos/login/screens/hid_detection_screen_browsertest.cc',
-      'browser/chromeos/login/screens/mock_base_screen_delegate.cc',
-      'browser/chromeos/login/screens/mock_base_screen_delegate.h',
-      'browser/chromeos/login/screens/mock_enable_debugging_screen.cc',
-      'browser/chromeos/login/screens/mock_enable_debugging_screen.h',
-      'browser/chromeos/login/screens/mock_error_screen.cc',
-      'browser/chromeos/login/screens/mock_error_screen.h',
-      'browser/chromeos/login/screens/mock_eula_screen.cc',
-      'browser/chromeos/login/screens/mock_eula_screen.h',
-      'browser/chromeos/login/screens/mock_network_screen.cc',
-      'browser/chromeos/login/screens/mock_network_screen.h',
-      'browser/chromeos/login/screens/mock_update_screen.cc',
-      'browser/chromeos/login/screens/mock_update_screen.h',
-      'browser/chromeos/login/screens/mock_wrong_hwid_screen.cc',
-      'browser/chromeos/login/screens/mock_wrong_hwid_screen.h',
-      'browser/chromeos/login/screens/network_screen_browsertest.cc',
-      'browser/chromeos/login/screens/update_screen_browsertest.cc',
-      'browser/chromeos/login/session_login_browsertest.cc',
-      'browser/chromeos/login/signin/device_id_browsertest.cc',
-      'browser/chromeos/login/signin/oauth2_browsertest.cc',
-      'browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc',
-      'browser/chromeos/login/supervised/supervised_user_password_browsertest.cc',
-      'browser/chromeos/login/supervised/supervised_user_test_base.cc',
-      'browser/chromeos/login/supervised/supervised_user_test_base.h',
-      'browser/chromeos/login/test/app_window_waiter.cc',
-      'browser/chromeos/login/test/app_window_waiter.h',
-      'browser/chromeos/login/test/https_forwarder.cc',
-      'browser/chromeos/login/test/https_forwarder.h',
-      'browser/chromeos/login/test/oobe_base_test.cc',
-      'browser/chromeos/login/test/oobe_base_test.h',
-      'browser/chromeos/login/test/wizard_in_process_browser_test.cc',
-      'browser/chromeos/login/test/wizard_in_process_browser_test.h',
-      'browser/chromeos/login/ui/captive_portal_window_browsertest.cc',
-      'browser/chromeos/login/ui/login_feedback_browsertest.cc',
-      'browser/chromeos/login/ui/login_web_dialog_browsertest.cc',
-      'browser/chromeos/login/ui/simple_web_view_dialog_browsertest.cc',
-      'browser/chromeos/login/ui/user_adding_screen_browsertest.cc',
-      'browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc',
-      'browser/chromeos/login/users/avatar/user_image_manager_test_util.cc',
-      'browser/chromeos/login/users/avatar/user_image_manager_test_util.h',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.cc',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h',
-      'browser/chromeos/login/webview_login_browsertest.cc',
-      'browser/chromeos/login/wizard_controller_browsertest.cc',
-      'browser/chromeos/net/network_portal_detector_impl_browsertest.cc',
-      'browser/chromeos/ownership/fake_owner_settings_service.cc',
-      'browser/chromeos/ownership/fake_owner_settings_service.h',
-      'browser/chromeos/policy/affiliation_test_helper.cc',
-      'browser/chromeos/policy/affiliation_test_helper.h',
-      'browser/chromeos/policy/blocking_login_browsertest.cc',
-      'browser/chromeos/policy/device_cloud_policy_browsertest.cc',
-      'browser/chromeos/policy/device_local_account_browsertest.cc',
-      'browser/chromeos/policy/device_policy_cros_browser_test.cc',
-      'browser/chromeos/policy/device_policy_cros_browser_test.h',
-      'browser/chromeos/policy/device_quirks_policy_browsertest.cc',
-      'browser/chromeos/policy/device_status_collector_browsertest.cc',
-      'browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc',
-      'browser/chromeos/policy/display_rotation_default_handler_browsertest.cc',
-      'browser/chromeos/policy/force_maximize_on_first_run_chromeos_browsertest.cc',
-      'browser/chromeos/policy/login_policy_test_base.cc',
-      'browser/chromeos/policy/login_policy_test_base.h',
-      'browser/chromeos/policy/login_screen_default_policy_browsertest.cc',
-      'browser/chromeos/policy/policy_cert_verifier_browsertest.cc',
-      'browser/chromeos/policy/power_policy_browsertest.cc',
-      'browser/chromeos/policy/restore_on_startup_browsertest_chromeos.cc',
-      'browser/chromeos/policy/user_affiliation_browsertest.cc',
-      'browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc',
-      'browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc',
-      'browser/chromeos/policy/user_policy_test_helper.cc',
-      'browser/chromeos/policy/user_policy_test_helper.h',
-      'browser/chromeos/policy/variations_service_policy_browsertest.cc',
-      'browser/chromeos/power/peripheral_battery_observer_browsertest.cc',
-      'browser/chromeos/preferences_chromeos_browsertest.cc',
-      'browser/chromeos/profiles/profile_helper_browsertest.cc',
-      'browser/chromeos/settings/scoped_cros_settings_test_helper.cc',
-      'browser/chromeos/settings/scoped_cros_settings_test_helper.h',
-      'browser/chromeos/shutdown_policy_browsertest.cc',
-      'browser/chromeos/system/device_disabling_browsertest.cc',
-      'browser/chromeos/system/tray_accessibility_browsertest.cc',
-      'browser/download/notification/download_notification_browsertest.cc',
-      'browser/drive/drive_notification_manager_factory_browsertest.cc',
-      'browser/extensions/api/certificate_provider/certificate_provider_apitest.cc',
-      'browser/extensions/api/vpn_provider/vpn_provider_apitest.cc',
-      'browser/ui/ash/launcher/arc_app_launcher_browsertest.cc',
-      'browser/ui/webui/options/chromeos/accounts_options_browsertest.cc',
-      'browser/ui/webui/options/chromeos/guest_mode_options_browsertest.cc',
-      'browser/ui/webui/options/chromeos/guest_mode_options_ui_browsertest.cc',
-      'browser/ui/webui/options/chromeos/shared_options_browsertest.cc',
-    ],
-    'chrome_browser_tests_non_mobile_non_cros_sources': [
-      # Tests for non mobile and non CrOS (includes Linux, Win, Mac).
-      'browser/metrics/desktop_engagement/audible_contents_tracker_browsertest.cc',
-      'browser/metrics/desktop_engagement/chrome_visibility_observer_browsertest.cc',
-      'browser/profiles/profile_statistics_browsertest.cc'
     ],
     'chrome_browser_tests_views_non_cros_sources': [
       # This should be brought up on OSX Views but not CrOS.
-      'browser/ui/views/profiles/profile_chooser_view_browsertest.cc',
-    ],
-    'chrome_browser_tests_speech_sources': [
-      'browser/speech/extension_api/tts_extension_apitest.cc',
-      'browser/speech/speech_recognition_browsertest.cc',
-    ],
-    'chrome_browser_tests_full_safe_browsing_sources': [
-      'browser/safe_browsing/permission_reporter_browsertest.cc',
-      'browser/safe_browsing/safe_browsing_blocking_page_test.cc',
-      'browser/safe_browsing/safe_browsing_service_browsertest.cc',
-      'renderer/safe_browsing/phishing_classifier_browsertest.cc',
-      'renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc',
-      'renderer/safe_browsing/phishing_dom_feature_extractor_browsertest.cc',
-      'renderer/safe_browsing/threat_dom_details_browsertest.cc',
-    ],
-    'chrome_browser_tests_remoting_sources': [
-      'test/remoting/auth_browsertest.cc',
-      'test/remoting/fullscreen_browsertest.cc',
-      'test/remoting/it2me_browsertest.cc',
-      'test/remoting/key_code_conv.cc',
-      'test/remoting/key_code_conv.h',
-      'test/remoting/key_code_map.h',
-      'test/remoting/key_code_test_map.h',
-      'test/remoting/launch_browsertest.cc',
-      'test/remoting/me2me_browsertest.cc',
-      'test/remoting/page_load_notification_observer.cc',
-      'test/remoting/page_load_notification_observer.h',
-      'test/remoting/pin_browsertest.cc',
-      'test/remoting/qunit_browser_test_runner.cc',
-      'test/remoting/remote_desktop_browsertest.cc',
-      'test/remoting/remote_desktop_browsertest.h',
-      'test/remoting/remote_test_helper.cc',
-      'test/remoting/remote_test_helper.h',
-      'test/remoting/scrollbar_browsertest.cc',
-      'test/remoting/unauthenticated_browsertest.cc',
-      'test/remoting/waiter.cc',
-      'test/remoting/waiter.h',
-      'test/remoting/webapp_javascript_browsertest.cc',
-    ],
-    'chrome_browser_tests_supervised_user_sources': [
-      'browser/supervised_user/supervised_user_browsertest.cc',
-      'browser/supervised_user/supervised_user_resource_throttle_browsertest.cc',
-      'browser/supervised_user/supervised_user_service_browsertest.cc',
-    ],
-    'chrome_browser_tests_app_list_sources': [
-      'browser/apps/drive/drive_app_converter_browsertest.cc',
-      'browser/apps/drive/drive_app_provider_browsertest.cc',
-      'browser/ui/app_list/app_list_controller_browsertest.cc',
-      'browser/ui/app_list/app_list_service_impl_browsertest.cc',
-      'browser/ui/app_list/app_list_service_views_browsertest.cc',
-      'browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc',
-      'browser/ui/app_list/speech_recognizer_browsertest.cc',
-    ],
-    'chrome_browser_tests_service_discovery_sources': [
-      'browser/extensions/api/mdns/mdns_apitest.cc',
     ],
     'chrome_browser_tests_media_router_sources': [
       'browser/ui/webui/media_router/media_router_dialog_controller_impl_browsertest.cc',
@@ -963,93 +44,6 @@
       'test/media_router/test_media_sinks_observer.cc',
       'test/media_router/test_media_sinks_observer.h',
     ],
-    # Javascript sources. These are combined with the .cc files in the GYP build
-    # and are handled by a rule, but in the GN build they're in a separate
-    # action so need to be separated out.
-    'chrome_browser_tests_webui_js_sources': [
-      'browser/ui/webui/app_list/start_page_browsertest.js',
-      'browser/ui/webui/chromeos/bluetooth_pairing_ui_browsertest.js',
-      'browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js',
-      'browser/ui/webui/chromeos/set_time_ui_browsertest.js',
-      'browser/ui/webui/extensions/chromeos/kiosk_apps_browsertest.js',
-      'browser/ui/webui/extensions/extension_settings_browsertest.js',
-      'browser/ui/webui/help/help_browsertest.js',
-      'browser/ui/webui/identity_internals_ui_browsertest.js',
-      'browser/ui/webui/options/autofill_options_browsertest.js',
-      'browser/ui/webui/options/browser_options_browsertest.js',
-      'browser/ui/webui/options/certificate_manager_browsertest.js',
-      'browser/ui/webui/options/chromeos/accounts_options_browsertest.js',
-      'browser/ui/webui/options/chromeos/bluetooth_options_browsertest.js',
-      'browser/ui/webui/options/chromeos/date_time_options_browsertest.js',
-      'browser/ui/webui/options/chromeos/guest_mode_options_browsertest.js',
-      'browser/ui/webui/options/chromeos/power_overlay_browsertest.js',
-      'browser/ui/webui/options/content_options_browsertest.js',
-      'browser/ui/webui/options/content_settings_exception_area_browsertest.js',
-      'browser/ui/webui/options/cookies_view_browsertest.js',
-      'browser/ui/webui/options/edit_dictionary_browsertest.js',
-      'browser/ui/webui/options/font_settings_browsertest.js',
-      'browser/ui/webui/options/language_options_browsertest.js',
-      'browser/ui/webui/options/language_options_dictionary_download_browsertest.js',
-      'browser/ui/webui/options/manage_profile_browsertest.js',
-      'browser/ui/webui/options/multilanguage_options_webui_browsertest.js',
-      'browser/ui/webui/options/options_browsertest.js',
-      'browser/ui/webui/options/options_browsertest_base.js',
-      'browser/ui/webui/options/password_manager_browsertest.js',
-      'browser/ui/webui/options/profile_settings_reset_browsertest.js',
-      'browser/ui/webui/options/search_engine_manager_browsertest.js',
-      'browser/ui/webui/options/settings_format_browsertest.js',
-      'browser/ui/webui/options/startup_page_list_browsertest.js',
-      'browser/ui/webui/sync_internals_browsertest.js',
-      'browser/ui/webui/sync_setup_browsertest.js',
-      'test/data/chromeos/oobe_webui_browsertest.js',
-      'test/data/webui/about_invalidations_browsertest.js',
-      'test/data/webui/accessibility_audit_browsertest.js',
-      'test/data/webui/assertions.js',
-      'test/data/webui/async_gen.js',
-      'test/data/webui/certificate_viewer_dialog_test.js',
-      'test/data/webui/chrome_send_browsertest.js',
-      'test/data/webui/cr_elements/cr_elements_browsertest.js',
-      'test/data/webui/extensions/cr_extensions_browsertest.js',
-      'test/data/webui/history_browsertest.js',
-      'test/data/webui/md_downloads/downloads_browsertest.js',
-      'test/data/webui/md_history/md_history_browsertest.js',
-      'test/data/webui/md_user_manager/user_manager_browsertest.js',
-      'test/data/webui/mock4js_browsertest.js',
-      'test/data/webui/net_internals/bandwidth_view.js',
-      'test/data/webui/net_internals/chromeos_view.js',
-      'test/data/webui/net_internals/dns_view.js',
-      'test/data/webui/net_internals/events_view.js',
-      'test/data/webui/net_internals/hsts_view.js',
-      'test/data/webui/net_internals/log_util.js',
-      'test/data/webui/net_internals/log_view_painter.js',
-      'test/data/webui/net_internals/main.js',
-      'test/data/webui/net_internals/net_internals_test.js',
-      'test/data/webui/net_internals/prerender_view.js',
-      'test/data/webui/net_internals/sdch_view.js',
-      'test/data/webui/net_internals/timeline_view.js',
-      'test/data/webui/ntp4.js',
-      'test/data/webui/plugins_browsertest.js',
-      'test/data/webui/polymer_browser_test_base.js',
-      'test/data/webui/print_preview.js',
-      'test/data/webui/sandboxstatus_browsertest.js',
-      'test/data/webui/settings/advanced_page_browsertest.js',
-      'test/data/webui/settings/animation_browsertest.js',
-      'test/data/webui/settings/basic_page_browsertest.js',
-      'test/data/webui/settings/bluetooth_page_browsertest_chromeos.js',
-      'test/data/webui/settings/cr_settings_browsertest.js',
-      'test/data/webui/settings/easy_unlock_browsertest_chromeos.js',
-      'test/data/webui/settings/help_page_browsertest.js',
-      'test/data/webui/settings/languages_page_browsertest.js',
-      'test/data/webui/settings/on_startup_browsertest.js',
-      'test/data/webui/settings/passwords_and_autofill_fake_data.js',
-      'test/data/webui/settings/passwords_and_forms_browsertest.js',
-      'test/data/webui/settings/settings_autofill_section_browsertest.js',
-      'test/data/webui/settings/settings_page_browsertest.js',
-      'test/data/webui/settings/settings_passwords_section_browsertest.js',
-      'test/data/webui/settings/settings_subpage_browsertest.js',
-      'test/data/webui/text_defaults_browsertest.js',
-      'test/data/webui/webui_resource_async_browsertest.js',
-    ],
     # TODO(rockot) bug 505926: These should be moved to a target in
     # //extensions but have old dependencies on chrome files. The chrome
     # dependencies should be removed and these moved to the
@@ -1057,203 +51,6 @@
     'chrome_interactive_ui_test_extensions_sources': [
       '../extensions/browser/app_window/app_window_interactive_uitest.cc',
     ],
-    'chrome_interactive_ui_test_sources': [
-      '../ui/base/clipboard/clipboard_android_unittest.cc',
-      '../ui/base/clipboard/clipboard_unittest.cc',
-      'browser/apps/app_browsertest_util.cc',
-      'browser/apps/app_browsertest_util.h',
-      'browser/apps/app_pointer_lock_interactive_uitest.cc',
-      'browser/apps/app_shim/app_shim_interactive_uitest_mac.mm',
-      'browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm',
-      'browser/apps/app_window_interactive_uitest.cc',
-      'browser/apps/guest_view/web_view_interactive_browsertest.cc',
-      'browser/autofill/autofill_interactive_uitest.cc',
-      'browser/autofill/autofill_uitest_util.cc',
-      'browser/browser_keyevents_browsertest.cc',
-      'browser/extensions/api/extension_action/browser_action_interactive_test.cc',
-      'browser/extensions/api/omnibox/omnibox_api_interactive_test.cc',
-      'browser/extensions/browsertest_util.cc',
-      'browser/extensions/clipboard_extension_apitest_chromeos.cc',
-      'browser/extensions/extension_apitest.cc',
-      'browser/extensions/extension_browsertest.cc',
-      'browser/extensions/extension_commands_global_registry_apitest.cc',
-      'browser/extensions/extension_crash_recovery_browsertest.cc',
-      'browser/extensions/extension_fullscreen_apitest.cc',
-      'browser/extensions/extension_function_test_utils.cc',
-      'browser/extensions/extension_keybinding_apitest.cc',
-      'browser/extensions/extension_test_notification_observer.cc',
-      'browser/extensions/updater/extension_cache_fake.cc',
-      'browser/extensions/updater/extension_cache_fake.h',
-      'browser/extensions/window_open_interactive_apitest.cc',
-      'browser/mouseleave_browsertest.cc',
-      'browser/password_manager/password_generation_interactive_uitest.cc',
-      'browser/password_manager/password_manager_interactive_uitest.cc',
-      'browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc',
-      'browser/renderer_context_menu/render_view_context_menu_browsertest_util.h',
-      'browser/site_per_process_interactive_browsertest.cc',
-      'browser/ui/autofill/autofill_popup_controller_interactive_uitest.cc',
-      'browser/ui/browser_focus_uitest.cc',
-      'browser/ui/cocoa/apps/app_shim_menu_controller_mac_interactive_uitest.mm',
-      'browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm',
-      'browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc',
-      'browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc',
-      'browser/ui/exclusive_access/fullscreen_controller_state_interactive_browsertest.cc',
-      'browser/ui/find_bar/find_bar_host_interactive_uitest.cc',
-      'browser/ui/omnibox/omnibox_view_browsertest.cc',
-      'browser/ui/passwords/manage_passwords_test.cc',
-      'browser/ui/passwords/manage_passwords_test.h',
-      'browser/ui/search/instant_extended_interactive_uitest.cc',
-      'browser/ui/search/instant_extended_manual_interactive_uitest.cc',
-      'browser/ui/search/instant_test_utils.cc',
-      'browser/ui/search/instant_test_utils.h',
-      'browser/ui/search/local_ntp_browsertest.cc',
-      'browser/ui/startup/startup_browser_creator_interactive_uitest.cc',
-      'browser/ui/translate/translate_bubble_test_utils.h',
-      'browser/ui/views/accessibility/navigation_accessibility_uitest_win.cc',
-      'browser/ui/webui/options/language_dictionary_interactive_uitest.cc',
-      'browser/ui/webui/options/language_options_interactive_uitest.cc',
-      'test/base/always_on_top_window_killer_win.cc',
-      'test/base/always_on_top_window_killer_win.h',
-      'test/base/interactive_test_utils.cc',
-      'test/base/interactive_test_utils.h',
-      'test/base/interactive_test_utils_aura.cc',
-      'test/base/interactive_test_utils_aura.h',
-      'test/base/interactive_test_utils_common_views.cc',
-      'test/base/interactive_test_utils_mac.mm',
-      'test/base/interactive_test_utils_win.cc',
-      'test/base/interactive_ui_tests_main.cc',
-      'test/base/view_event_test_platform_part.h',
-      'test/base/view_event_test_platform_part_chromeos.cc',
-      'test/base/view_event_test_platform_part_default.cc',
-      'test/ppapi/ppapi_interactive_browsertest.cc',
-    ],
-     # Cross-platform views interactive tests ready for toolkit-views on Mac.
-    'chrome_interactive_ui_test_views_sources': [
-      '../ui/views/corewm/desktop_capture_controller_unittest.cc',
-      '../ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc',
-      '../ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc',
-      '../ui/views/widget/widget_interactive_uitest.cc',
-      'browser/ui/views/menu_controller_interactive_uitest.cc',
-      'browser/ui/views/menu_item_view_interactive_uitest.cc',
-      'browser/ui/views/menu_model_adapter_test.cc',
-      'browser/ui/views/menu_test_base.cc',
-      'browser/ui/views/menu_test_base.h',
-      'browser/ui/views/menu_view_drag_and_drop_test.cc',
-      'browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc',
-      'test/base/view_event_test_base.cc',
-      'test/base/view_event_test_base.h',
-    ],
-    # Mac sources, except when mac_views_browser==1.
-    'chrome_interactive_ui_test_cocoa_sources': [
-      'browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm',
-      'browser/ui/cocoa/translate/translate_bubble_test_utils_cocoa.mm',
-      'test/base/interactive_test_utils_cocoa.mm',
-    ],
-    'chrome_interactive_ui_test_app_list_sources': [
-      'browser/ui/app_list/app_list_service_interactive_uitest.cc',
-    ],
-    'chrome_interactive_ui_test_win_sources': [
-      '../ui/resources/cursors/aliasb.cur',
-      '../ui/resources/cursors/cell.cur',
-      '../ui/resources/cursors/col_resize.cur',
-      '../ui/resources/cursors/copy.cur',
-      '../ui/resources/cursors/none.cur',
-      '../ui/resources/cursors/row_resize.cur',
-      '../ui/resources/cursors/vertical_text.cur',
-      '../ui/resources/cursors/zoom_in.cur',
-      '../ui/resources/cursors/zoom_out.cur',
-      'app/chrome_dll.rc',
-      'browser/downgrade/user_data_downgrade_browsertest.cc',
-      'test/data/resource.rc',
-    ],
-    # Cross-platform (except Mac) views interactive tests.
-    # TODO(tapted): Move these to chrome_interactive_ui_test_views_sources when
-    # the corresponding files are moved in chrome_browser_ui.gypi (i.e. out of
-    # chrome_browser_ui_views_non_mac_sources).
-    'chrome_interactive_ui_test_views_non_mac_sources': [
-      'browser/ui/views/bookmarks/bookmark_bar_view_test.cc',
-      'browser/ui/views/bookmarks/bookmark_bar_view_test_helper.h',
-      'browser/ui/views/certificate_selector_browsertest.cc',
-      'browser/ui/views/constrained_window_views_browsertest.cc',
-      'browser/ui/views/extensions/extension_dialog_interactive_uitest.cc',
-      'browser/ui/views/find_bar_views_interactive_uitest.cc',
-      'browser/ui/views/frame/browser_view_focus_uitest.cc',
-      'browser/ui/views/frame/browser_view_interactive_uitest.cc',
-      'browser/ui/views/keyboard_access_browsertest.cc',
-      'browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc',
-      'browser/ui/views/location_bar/page_action_image_view_interactive_uitest.cc',
-      'browser/ui/views/location_bar/star_view_browsertest.cc',
-      'browser/ui/views/omnibox/omnibox_view_views_browsertest.cc',
-      'browser/ui/views/passwords/manage_passwords_bubble_view_interactive_uitest.cc',
-      'browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc',
-      'browser/ui/views/ssl_client_certificate_selector_browsertest.cc',
-      'browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc',
-      'browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h',
-      'browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc',
-      'browser/ui/views/toolbar/toolbar_button_interactive_uitest.cc',
-      'browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc',
-      'browser/ui/views/translate/translate_bubble_test_utils_views.cc',
-      'test/base/interactive_test_utils_views.cc',
-    ],
-    'chrome_interactive_ui_test_notifications_sources': [
-      'browser/extensions/api/notifications/notifications_apitest.cc',
-      'browser/notifications/message_center_notifications_browsertest.cc',
-    ],
-    'chrome_interactive_ui_test_chromeos_sources': [
-      '../ash/accelerators/accelerator_interactive_uitest_chromeos.cc',
-      'browser/chromeos/accessibility/accessibility_highlight_manager_interactive_uitest.cc',
-      'browser/chromeos/accessibility/magnification_controller_browsertest.cc',
-      'browser/chromeos/accessibility/speech_monitor.cc',
-      'browser/chromeos/accessibility/speech_monitor.h',
-      'browser/chromeos/accessibility/spoken_feedback_browsertest.cc',
-      'browser/chromeos/accessibility/sticky_keys_browsertest.cc',
-      'browser/chromeos/input_method/textinput_browsertest.cc',
-      'browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc',
-      'browser/chromeos/input_method/textinput_test_helper.cc',
-      'browser/chromeos/input_method/textinput_test_helper.h',
-      'browser/chromeos/login/eula_browsertest.cc',
-      'browser/chromeos/login/lock/screen_locker_browsertest.cc',
-      'browser/chromeos/login/lock/screen_locker_tester.cc',
-      'browser/chromeos/login/lock/screen_locker_tester.h',
-      'browser/chromeos/login/login_browsertest.cc',
-      'browser/chromeos/login/login_manager_test.cc',
-      'browser/chromeos/login/login_manager_test.h',
-      'browser/chromeos/login/login_ui_browsertest.cc',
-      'browser/chromeos/login/mixin_based_browser_test.cc',
-      'browser/chromeos/login/mixin_based_browser_test.h',
-      'browser/chromeos/login/oobe_browsertest.cc',
-      'browser/chromeos/login/screenshot_testing/SkDiffPixelsMetric.h',
-      'browser/chromeos/login/screenshot_testing/SkDiffPixelsMetric_cpu.cpp',
-      'browser/chromeos/login/screenshot_testing/SkImageDiffer.cpp',
-      'browser/chromeos/login/screenshot_testing/SkImageDiffer.h',
-      'browser/chromeos/login/screenshot_testing/SkPMetric.cpp',
-      'browser/chromeos/login/screenshot_testing/SkPMetric.h',
-      'browser/chromeos/login/screenshot_testing/screenshot_tester.cc',
-      'browser/chromeos/login/screenshot_testing/screenshot_tester.h',
-      'browser/chromeos/login/screenshot_testing/screenshot_tester.h',
-      'browser/chromeos/login/screenshot_testing/screenshot_testing_mixin.cc',
-      'browser/chromeos/login/screenshot_testing/screenshot_testing_mixin.h',
-      'browser/chromeos/login/test/https_forwarder.cc',
-      'browser/chromeos/login/test/https_forwarder.h',
-      'browser/chromeos/login/test/oobe_base_test.cc',
-      'browser/chromeos/login/test/oobe_base_test.h',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_browsertest.cc',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.cc',
-      'browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h',
-      'test/data/chromeos/service_login.html',
-    ],
-    'chrome_interactive_ui_test_ash_sources': [
-      '../ash/drag_drop/drag_drop_interactive_uitest.cc',
-      '../ash/wm/ash_native_cursor_manager_interactive_uitest.cc',
-      'browser/ui/views/ash/tab_scrubber_browsertest.cc',
-      'browser/ui/window_sizer/window_sizer_ash_uitest.cc',
-    ],
-    'chrome_interactive_ui_test_non_desktop_linux_sources': [
-      # TODO(port): Everything here times out. Attempts have been made to fix
-      # the individual failures, but each time I disable a test from these
-      # suites, it seems like one or another starts timing out too.
-      'browser/extensions/api/tabs/tabs_interactive_test.cc',
-    ],
     'chrome_automation_client_lib_sources': [
       'test/chromedriver/chrome/adb.h',
       'test/chromedriver/chrome/adb_impl.cc',
@@ -1347,24 +144,6 @@
       'test/chromedriver/net/websocket.cc',
       'test/chromedriver/net/websocket.h',
     ],
-    'performance_browser_tests_sources': [
-      'app/chrome_dll.rc',
-      'app/chrome_dll_resource.h',
-      'app/chrome_version.rc.version',
-      'browser/extensions/api/cast_streaming/performance_test.cc',
-      'browser/extensions/api/tab_capture/tab_capture_performancetest.cc',
-      'browser/extensions/browsertest_util.cc',
-      'browser/extensions/extension_apitest.cc',
-      'browser/extensions/extension_browsertest.cc',
-      'browser/extensions/extension_test_notification_observer.cc',
-      'browser/extensions/updater/extension_cache_fake.cc',
-      'browser/extensions/updater/extension_cache_fake.h',
-      'test/base/browser_perf_tests_main.cc',
-      'test/base/chrome_render_view_test.cc',
-      'test/base/chrome_render_view_test.h',
-      'test/perf/mach_ports_performancetest.cc',
-      'test/perf/url_parse_perftest.cc',
-    ],
     'chrome_driver_lib_sources': [
       '../third_party/webdriver/atoms.cc',
       '../third_party/webdriver/atoms.h',
@@ -1462,144 +241,6 @@
       'test/chromedriver/test_util.cc',
       'test/chromedriver/test_util.h',
     ],
-    'sync_integration_tests_sources': [
-      'app/chrome_dll.rc',
-      'app/chrome_dll_resource.h',
-      'app/chrome_version.rc.version',
-      'browser/sync/test/integration/enable_disable_test.cc',
-      'browser/sync/test/integration/migration_test.cc',
-      'browser/sync/test/integration/single_client_app_list_sync_test.cc',
-      'browser/sync/test/integration/single_client_apps_sync_test.cc',
-      'browser/sync/test/integration/single_client_arc_package_sync_test.cc',
-      'browser/sync/test/integration/single_client_bookmarks_sync_test.cc',
-      'browser/sync/test/integration/single_client_dictionary_sync_test.cc',
-      'browser/sync/test/integration/single_client_directory_sync_test.cc',
-      'browser/sync/test/integration/single_client_extensions_sync_test.cc',
-      'browser/sync/test/integration/single_client_password_manager_setting_migrator_service_sync_test.cc',
-      'browser/sync/test/integration/single_client_passwords_sync_test.cc',
-      'browser/sync/test/integration/single_client_preferences_sync_test.cc',
-      'browser/sync/test/integration/single_client_search_engines_sync_test.cc',
-      'browser/sync/test/integration/single_client_sessions_sync_test.cc',
-      'browser/sync/test/integration/single_client_supervised_user_settings_sync_test.cc',
-      'browser/sync/test/integration/single_client_themes_sync_test.cc',
-      'browser/sync/test/integration/single_client_typed_urls_sync_test.cc',
-      'browser/sync/test/integration/single_client_wallet_sync_test.cc',
-      'browser/sync/test/integration/single_client_wifi_credentials_sync_test.cc',
-      'browser/sync/test/integration/sync_auth_test.cc',
-      'browser/sync/test/integration/sync_errors_test.cc',
-      'browser/sync/test/integration/sync_exponential_backoff_test.cc',
-      'browser/sync/test/integration/two_client_app_list_sync_test.cc',
-      'browser/sync/test/integration/two_client_apps_sync_test.cc',
-      'browser/sync/test/integration/two_client_arc_package_sync_test.cc',
-      'browser/sync/test/integration/two_client_autofill_sync_test.cc',
-      'browser/sync/test/integration/two_client_bookmarks_sync_test.cc',
-      'browser/sync/test/integration/two_client_dictionary_sync_test.cc',
-      'browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc',
-      'browser/sync/test/integration/two_client_extensions_sync_test.cc',
-      'browser/sync/test/integration/two_client_password_manager_setting_migrator_service_sync_test.cc',
-      'browser/sync/test/integration/two_client_passwords_sync_test.cc',
-      'browser/sync/test/integration/two_client_preferences_sync_test.cc',
-      'browser/sync/test/integration/two_client_search_engines_sync_test.cc',
-      'browser/sync/test/integration/two_client_sessions_sync_test.cc',
-      'browser/sync/test/integration/two_client_themes_sync_test.cc',
-      'browser/sync/test/integration/two_client_typed_urls_sync_test.cc',
-      'browser/sync/test/integration/two_client_wifi_credentials_sync_test.cc',
-      'test/data/resource.rc',
-    ],
-    'test_support_sync_integration_sources': [
-      'browser/sync/test/integration/apps_helper.cc',
-      'browser/sync/test/integration/apps_helper.h',
-      'browser/sync/test/integration/autofill_helper.cc',
-      'browser/sync/test/integration/autofill_helper.h',
-      'browser/sync/test/integration/await_match_status_change_checker.cc',
-      'browser/sync/test/integration/await_match_status_change_checker.h',
-      'browser/sync/test/integration/bookmarks_helper.cc',
-      'browser/sync/test/integration/bookmarks_helper.h',
-      'browser/sync/test/integration/dictionary_helper.cc',
-      'browser/sync/test/integration/dictionary_helper.h',
-      'browser/sync/test/integration/dictionary_load_observer.cc',
-      'browser/sync/test/integration/dictionary_load_observer.h',
-      'browser/sync/test/integration/extension_settings_helper.cc',
-      'browser/sync/test/integration/extension_settings_helper.h',
-      'browser/sync/test/integration/extensions_helper.cc',
-      'browser/sync/test/integration/extensions_helper.h',
-      'browser/sync/test/integration/fake_server_invalidation_service.cc',
-      'browser/sync/test/integration/fake_server_invalidation_service.h',
-      'browser/sync/test/integration/fake_server_match_status_checker.cc',
-      'browser/sync/test/integration/fake_server_match_status_checker.h',
-      'browser/sync/test/integration/migration_waiter.cc',
-      'browser/sync/test/integration/migration_waiter.h',
-      'browser/sync/test/integration/migration_watcher.cc',
-      'browser/sync/test/integration/migration_watcher.h',
-      'browser/sync/test/integration/multi_client_status_change_checker.cc',
-      'browser/sync/test/integration/multi_client_status_change_checker.h',
-      'browser/sync/test/integration/p2p_invalidation_forwarder.cc',
-      'browser/sync/test/integration/p2p_invalidation_forwarder.h',
-      'browser/sync/test/integration/p2p_sync_refresher.cc',
-      'browser/sync/test/integration/p2p_sync_refresher.h',
-      'browser/sync/test/integration/password_manager_setting_migrator_helper.cc',
-      'browser/sync/test/integration/password_manager_setting_migrator_helper.h',
-      'browser/sync/test/integration/passwords_helper.cc',
-      'browser/sync/test/integration/passwords_helper.h',
-      'browser/sync/test/integration/preferences_helper.cc',
-      'browser/sync/test/integration/preferences_helper.h',
-      'browser/sync/test/integration/profile_sync_service_harness.cc',
-      'browser/sync/test/integration/profile_sync_service_harness.h',
-      'browser/sync/test/integration/quiesce_status_change_checker.cc',
-      'browser/sync/test/integration/quiesce_status_change_checker.h',
-      'browser/sync/test/integration/retry_verifier.cc',
-      'browser/sync/test/integration/retry_verifier.h',
-      'browser/sync/test/integration/search_engines_helper.cc',
-      'browser/sync/test/integration/search_engines_helper.h',
-      'browser/sync/test/integration/sessions_helper.cc',
-      'browser/sync/test/integration/sessions_helper.h',
-      'browser/sync/test/integration/single_client_status_change_checker.cc',
-      'browser/sync/test/integration/single_client_status_change_checker.h',
-      'browser/sync/test/integration/status_change_checker.cc',
-      'browser/sync/test/integration/status_change_checker.h',
-      'browser/sync/test/integration/sync_app_helper.cc',
-      'browser/sync/test/integration/sync_app_helper.h',
-      'browser/sync/test/integration/sync_app_list_helper.cc',
-      'browser/sync/test/integration/sync_app_list_helper.h',
-      'browser/sync/test/integration/sync_arc_package_helper.cc',
-      'browser/sync/test/integration/sync_arc_package_helper.h',
-      'browser/sync/test/integration/sync_datatype_helper.cc',
-      'browser/sync/test/integration/sync_datatype_helper.h',
-      'browser/sync/test/integration/sync_extension_helper.cc',
-      'browser/sync/test/integration/sync_extension_helper.h',
-      'browser/sync/test/integration/sync_extension_installer.cc',
-      'browser/sync/test/integration/sync_extension_installer.h',
-      'browser/sync/test/integration/sync_integration_test_util.cc',
-      'browser/sync/test/integration/sync_integration_test_util.h',
-      'browser/sync/test/integration/sync_test.cc',
-      'browser/sync/test/integration/sync_test.h',
-      'browser/sync/test/integration/themes_helper.cc',
-      'browser/sync/test/integration/themes_helper.h',
-      'browser/sync/test/integration/typed_urls_helper.cc',
-      'browser/sync/test/integration/typed_urls_helper.h',
-      'browser/sync/test/integration/updated_progress_marker_checker.cc',
-      'browser/sync/test/integration/updated_progress_marker_checker.h',
-      'browser/sync/test/integration/wifi_credentials_helper.cc',
-      'browser/sync/test/integration/wifi_credentials_helper.h',
-      'browser/sync/test/integration/wifi_credentials_helper_chromeos.cc',
-      'browser/sync/test/integration/wifi_credentials_helper_chromeos.h',
-    ],
-    'sync_performance_tests_sources': [
-      'app/chrome_dll.rc',
-      'app/chrome_dll_resource.h',
-      'app/chrome_version.rc.version',
-      'browser/sync/test/integration/performance/autofill_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/dictionary_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/extensions_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/passwords_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/sessions_sync_perf_test.cc',
-      'browser/sync/test/integration/performance/sync_timing_helper.cc',
-      'browser/sync/test/integration/performance/sync_timing_helper.h',
-      'browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc',
-      'test/base/browser_perf_tests_main.cc',
-      'test/data/resource.rc',
-    ],
   },
   'includes': [
     'js_unittest_vars.gypi',
diff --git a/chrome/common/chrome_content_client.h b/chrome/common/chrome_content_client.h
index 5be22d86..1d09a6e4 100644
--- a/chrome/common/chrome_content_client.h
+++ b/chrome/common/chrome_content_client.h
@@ -28,6 +28,9 @@
 class ChromeContentClient : public content::ContentClient {
  public:
 #if defined(GOOGLE_CHROME_BUILD)
+  // kNotPresent is a placeholder plugin location for plugins that are not
+  // currently present in this installation of Chrome, but which can be fetched
+  // on-demand and therefore should still appear in navigator.plugins.
   static const char kNotPresent[];
 #endif
   static const char kPDFPluginName[];
diff --git a/chrome/common/extensions/api/automation.idl b/chrome/common/extensions/api/automation.idl
index 5679c360..09c1c13d 100644
--- a/chrome/common/extensions/api/automation.idl
+++ b/chrome/common/extensions/api/automation.idl
@@ -22,6 +22,7 @@
     childrenChanged,
     clicked,
     documentSelectionChanged,
+    expandedChanged,
     focus,
     hide,
     hover,
diff --git a/chrome/common/safe_browsing/csd.proto b/chrome/common/safe_browsing/csd.proto
index f2dadfd..1eb1eedd 100644
--- a/chrome/common/safe_browsing/csd.proto
+++ b/chrome/common/safe_browsing/csd.proto
@@ -400,7 +400,7 @@
     // Chrome should show the default warning if configured for this file type.
     UNKNOWN = 5;
   }
-  required Verdict verdict = 1;
+  optional Verdict verdict = 1 [default = SAFE];
 
   message MoreInfo {
     // A human-readable string describing the nature of the warning.
diff --git a/chrome/installer/linux/common/apt.include b/chrome/installer/linux/common/apt.include
index c1171067..cdc0c0e 100644
--- a/chrome/installer/linux/common/apt.include
+++ b/chrome/installer/linux/common/apt.include
@@ -1,3 +1,5 @@
+@@include@@variables.include
+
 APT_GET="`which apt-get 2> /dev/null`"
 APT_CONFIG="`which apt-config 2> /dev/null`"
 
diff --git a/chrome/installer/linux/common/chromium-browser/chromium-browser.info b/chrome/installer/linux/common/chromium-browser/chromium-browser.info
index fb409f1..3593c9e 100644
--- a/chrome/installer/linux/common/chromium-browser/chromium-browser.info
+++ b/chrome/installer/linux/common/chromium-browser/chromium-browser.info
@@ -11,11 +11,8 @@
 # Filename of the main executable (for generating launcher scripts, etc.)
 PROGNAME=chrome
 
-# Relocatable part of base directory for package installation.
-INSTALLDIRPREFIX=/opt
-
 # Base directory for package installation.
-INSTALLDIR="${INSTALLDIRPREFIX}"/chromium.org/chromium
+INSTALLDIR=/opt/chromium.org/chromium
 
 # Display string for desktop menu/icon.
 MENUNAME="Chromium Web Browser"
diff --git a/chrome/installer/linux/common/google-chrome/google-chrome.info b/chrome/installer/linux/common/google-chrome/google-chrome.info
index 2d99b99..28cd2e2 100644
--- a/chrome/installer/linux/common/google-chrome/google-chrome.info
+++ b/chrome/installer/linux/common/google-chrome/google-chrome.info
@@ -11,11 +11,8 @@
 # Filename of the main executable (for generating launcher scripts, etc.)
 PROGNAME=chrome
 
-# Relocatable part of base directory for package installation.
-INSTALLDIRPREFIX=/opt
-
 # Base directory for package installation.
-INSTALLDIR="${INSTALLDIRPREFIX}"/google/chrome
+INSTALLDIR=/opt/google/chrome
 
 # Display string for desktop menu/icon.
 MENUNAME="Google Chrome"
diff --git a/chrome/installer/linux/common/installer.include b/chrome/installer/linux/common/installer.include
index dfaaada..d606238 100644
--- a/chrome/installer/linux/common/installer.include
+++ b/chrome/installer/linux/common/installer.include
@@ -58,7 +58,6 @@
     -e "s#@@VERSION@@#${VERSION}#g" \
     -e "s#@@PACKAGE_RELEASE@@#${PACKAGE_RELEASE}#g" \
     -e "s#@@VERSIONFULL@@#${VERSIONFULL}#g" \
-    -e "s#@@INSTALLDIRPREFIX@@#${INSTALLDIRPREFIX}#g" \
     -e "s#@@INSTALLDIR@@#${INSTALLDIR}#g" \
     -e "s#@@BUILDDIR@@#${BUILDDIR}#g" \
     -e "s#@@STAGEDIR@@#${STAGEDIR}#g" \
@@ -217,6 +216,8 @@
     ln -sn "${INSTALLDIR}/${PACKAGE}" \
       "${STAGEDIR}/${INSTALLDIR}/google-chrome"
   fi
+  ln -snf "${INSTALLDIR}/${PACKAGE}" \
+    "${STAGEDIR}/usr/bin/${USR_BIN_SYMLINK_NAME}"
 
   # app icons
   install -m 644 \
diff --git a/chrome/installer/linux/common/postinst.include b/chrome/installer/linux/common/postinst.include
index 40e6909..c659d9a 100644
--- a/chrome/installer/linux/common/postinst.include
+++ b/chrome/installer/linux/common/postinst.include
@@ -4,7 +4,7 @@
   echo "Error: Could not find xdg-icon-resource" >&2
   exit 1
 fi
-for icon in "${INSTALLDIR}/product_logo_"*.png; do
+for icon in "@@INSTALLDIR@@/product_logo_"*.png; do
   size="${icon##*/product_logo_}"
   "$XDG_ICON_RESOURCE" install --size "${size%.png}" "$icon" "@@PACKAGE@@"
 done
@@ -74,5 +74,5 @@
   fgrep -q "@@MENUNAME@@" "$GNOME_DFL_APPS" || insert_after_first_match \
     "$GNOME_DFL_APPS" \
     "^[ 	]*<web-browsers>[ 	]*$" \
-    "${INSTALLDIR}/default-app-block"
+    "@@INSTALLDIR@@/default-app-block"
 fi
diff --git a/chrome/installer/linux/common/prerm.include b/chrome/installer/linux/common/prerm.include
index 2861bff9..5bb2c400 100644
--- a/chrome/installer/linux/common/prerm.include
+++ b/chrome/installer/linux/common/prerm.include
@@ -4,7 +4,7 @@
   echo "Error: Could not find xdg-icon-resource" >&2
   exit 1
 fi
-for icon in "${INSTALLDIR}/product_logo_"*.png; do
+for icon in "@@INSTALLDIR@@/product_logo_"*.png; do
   size="${icon##*/product_logo_}"
   "$XDG_ICON_RESOURCE" uninstall --size "${size%.png}" "@@PACKAGE@@"
 done
diff --git a/chrome/installer/linux/common/rpm.include b/chrome/installer/linux/common/rpm.include
index d5b8beace..8122767 100644
--- a/chrome/installer/linux/common/rpm.include
+++ b/chrome/installer/linux/common/rpm.include
@@ -1,3 +1,5 @@
+@@include@@variables.include
+
 # Install the repository signing key (see also:
 # https://www.google.com/linuxrepositories/)
 install_rpm_key() {
diff --git a/chrome/installer/linux/common/symlinks.include b/chrome/installer/linux/common/symlinks.include
index 61a3859..700215c 100644
--- a/chrome/installer/linux/common/symlinks.include
+++ b/chrome/installer/linux/common/symlinks.include
@@ -7,9 +7,9 @@
   do
     target=$(echo $f | sed 's/\.[01]d$//')
     if [ -f "/$LIBDIR/$target" ]; then
-      ln -snf "/$LIBDIR/$target" "${INSTALLDIR}/$f"
+      ln -snf "/$LIBDIR/$target" "@@INSTALLDIR@@/$f"
     elif [ -f "/usr/$LIBDIR/$target" ]; then
-      ln -snf "/usr/$LIBDIR/$target" "${INSTALLDIR}/$f"
+      ln -snf "/usr/$LIBDIR/$target" "@@INSTALLDIR@@/$f"
     else
       echo $f not found in "/$LIBDIR/$target" or "/usr/$LIBDIR/$target".
       exit 1
@@ -17,21 +17,13 @@
   done
 }
 
-add_chrome_symlinks() {
-  ln -snf "${INSTALLDIR}/@@PACKAGE@@" "/usr/bin/@@USR_BIN_SYMLINK_NAME@@"
-}
-
 remove_nss_symlinks() {
   for f in $NSS_FILES
   do
-    rm -rf "${INSTALLDIR}/$f"
+    rm -rf "@@INSTALLDIR@@/$f"
   done
 }
 
 remove_udev_symlinks() {
-  rm -rf "${INSTALLDIR}/libudev.so.0"
-}
-
-remove_chrome_symlinks() {
-  rm -rf "/usr/bin/@@USR_BIN_SYMLINK_NAME@@"
+  rm -rf "@@INSTALLDIR@@/libudev.so.0"
 }
diff --git a/chrome/installer/linux/common/variables.include b/chrome/installer/linux/common/variables.include
index e7d5351..be94314 100644
--- a/chrome/installer/linux/common/variables.include
+++ b/chrome/installer/linux/common/variables.include
@@ -1,10 +1,3 @@
-# Set the installation directory at install time.
-# Currently only does anything for RPM packages.
-INSTALLDIR="@@INSTALLDIR@@"
-if [ -n "${RPM_INSTALL_PREFIX-}" ]; then
-  INSTALLDIR="${RPM_INSTALL_PREFIX}"/${INSTALLDIR##"@@INSTALLDIRPREFIX@@/"}
-fi
-
 # System-wide package configuration.
 DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
 
diff --git a/chrome/installer/linux/debian/postinst b/chrome/installer/linux/debian/postinst
index 717e75d..7acf8b2 100755
--- a/chrome/installer/linux/debian/postinst
+++ b/chrome/installer/linux/debian/postinst
@@ -6,14 +6,8 @@
 
 set -e
 
-@@include@@../common/variables.include
-
 @@include@@../common/postinst.include
 
-@@include@@../common/apt.include
-
-@@include@@../common/symlinks.include
-
 # Add to the alternatives system
 #
 # On Ubuntu 12.04, we have the following priorities
@@ -50,11 +44,6 @@
     ;;
 esac
 
-remove_chrome_symlinks
-add_chrome_symlinks
-
-remove_udev_symlinks
-
 update-alternatives --install /usr/bin/x-www-browser x-www-browser \
   /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
 update-alternatives --install /usr/bin/gnome-www-browser gnome-www-browser \
@@ -63,6 +52,12 @@
 update-alternatives --install /usr/bin/google-chrome google-chrome \
   /usr/bin/@@USR_BIN_SYMLINK_NAME@@ $PRIORITY
 
+@@include@@../common/apt.include
+
+@@include@@../common/symlinks.include
+
+remove_udev_symlinks
+
 ## MAIN ##
 if [ ! -e "$DEFAULTS_FILE" ]; then
   echo 'repo_add_once="true"' > "$DEFAULTS_FILE"
diff --git a/chrome/installer/linux/debian/postrm b/chrome/installer/linux/debian/postrm
index c90b51e..85b99610 100755
--- a/chrome/installer/linux/debian/postrm
+++ b/chrome/installer/linux/debian/postrm
@@ -13,13 +13,10 @@
   exit 0
 fi
 
-@@include@@../common/variables.include
-
 @@include@@../common/apt.include
 
 @@include@@../common/symlinks.include
 
-remove_chrome_symlinks
 remove_udev_symlinks
 
 # Only remove the defaults file if it is not empty. An empty file was probably
diff --git a/chrome/installer/linux/debian/prerm b/chrome/installer/linux/debian/prerm
index 2e9df417..c2870d2 100755
--- a/chrome/installer/linux/debian/prerm
+++ b/chrome/installer/linux/debian/prerm
@@ -16,8 +16,6 @@
   exit 0
 fi
 
-@@include@@../common/variables.include
-
 @@include@@../common/prerm.include
 
 # Remove from the alternatives system
diff --git a/chrome/installer/linux/rpm/chrome.spec.template b/chrome/installer/linux/rpm/chrome.spec.template
index 00b13d0b..08c402c 100644
--- a/chrome/installer/linux/rpm/chrome.spec.template
+++ b/chrome/installer/linux/rpm/chrome.spec.template
@@ -88,6 +88,7 @@
 # accidentally "own" stuff that's not ours (crbug.com/123990).
 /etc/cron.daily/@@PACKAGE@@
 %ghost %attr(755,root,root) /usr/bin/google-chrome
+/usr/bin/@@USR_BIN_SYMLINK_NAME@@
 /usr/share/applications/@@PACKAGE@@.desktop
 /usr/share/gnome-control-center/default-apps/@@PACKAGE@@.xml
 %docdir /usr/share/man/man1
@@ -108,8 +109,6 @@
 #------------------------------------------------------------------------------
 %post
 
-@@include@@../common/variables.include
-
 @@include@@../common/postinst.include
 
 @@include@@../common/rpm.include
@@ -119,9 +118,6 @@
 remove_nss_symlinks
 add_nss_symlinks
 
-remove_chrome_symlinks
-add_chrome_symlinks
-
 remove_udev_symlinks
 
 DEFAULTS_FILE="/etc/default/@@PACKAGE@@"
@@ -192,8 +188,6 @@
   mode="upgrade"
 fi
 
-@@include@@../common/variables.include
-
 @@include@@../common/rpm.include
 
 @@include@@../common/symlinks.include
@@ -202,12 +196,11 @@
 # old_pkg's %preun runs after new_pkg's %post.
 if [ "$mode" = "uninstall" ]; then
 @@include@@../common/prerm.include
+  remove_nss_symlinks
+  remove_udev_symlinks
+
   %{_sbindir}/update-alternatives --remove google-chrome \
     /usr/bin/@@USR_BIN_SYMLINK_NAME@@
-
-  remove_nss_symlinks
-  remove_chrome_symlinks
-  remove_udev_symlinks
 fi
 
 # On Debian we only remove when we purge. However, RPM has no equivalent to
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index f91fa7f..fe0d57d 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -5,11 +5,6 @@
 import("//build/config/features.gni")
 import("//tools/grit/grit_rule.gni")
 
-gypi_values = exec_script("//build/gypi_to_gn.py",
-                          [ rebase_path("../chrome_renderer.gypi") ],
-                          "scope",
-                          [ "../chrome_renderer.gypi" ])
-
 # GYP version: chrome/chrome_resources.gyp:chrome_resources
 # (generate_renderer_resources action)
 grit("resources") {
@@ -26,7 +21,68 @@
 }
 
 static_library("renderer") {
-  sources = rebase_path(gypi_values.chrome_renderer_sources, ".", "..")
+  sources = [
+    "app_categorizer.cc",
+    "app_categorizer.h",
+    "banners/app_banner_client.cc",
+    "banners/app_banner_client.h",
+    "benchmarking_extension.cc",
+    "benchmarking_extension.h",
+    "chrome_content_renderer_client.cc",
+    "chrome_content_renderer_client.h",
+    "chrome_render_frame_observer.cc",
+    "chrome_render_frame_observer.h",
+    "chrome_render_thread_observer.cc",
+    "chrome_render_thread_observer.h",
+    "chrome_render_view_observer.cc",
+    "chrome_render_view_observer.h",
+    "content_settings_observer.cc",
+    "content_settings_observer.h",
+    "custom_menu_commands.h",
+    "instant_restricted_id_cache.h",
+    "loadtimes_extension_bindings.cc",
+    "loadtimes_extension_bindings.h",
+    "media/chrome_key_systems.cc",
+    "media/chrome_key_systems.h",
+    "net/net_error_helper.cc",
+    "net/net_error_helper.h",
+    "net/net_error_page_controller.cc",
+    "net/net_error_page_controller.h",
+    "net_benchmarking_extension.cc",
+    "net_benchmarking_extension.h",
+    "page_load_histograms.cc",
+    "page_load_histograms.h",
+    "page_load_metrics/metrics_render_frame_observer.cc",
+    "page_load_metrics/metrics_render_frame_observer.h",
+    "page_load_metrics/page_timing_metrics_sender.cc",
+    "page_load_metrics/page_timing_metrics_sender.h",
+    "plugins/non_loadable_plugin_placeholder.cc",
+    "plugins/non_loadable_plugin_placeholder.h",
+    "plugins/plugin_uma.cc",
+    "plugins/plugin_uma.h",
+    "prerender/prerender_dispatcher.cc",
+    "prerender/prerender_dispatcher.h",
+    "prerender/prerender_extra_data.cc",
+    "prerender/prerender_extra_data.h",
+    "prerender/prerender_helper.cc",
+    "prerender/prerender_helper.h",
+    "prerender/prerenderer_client.cc",
+    "prerender/prerenderer_client.h",
+    "searchbox/search_bouncer.cc",
+    "searchbox/search_bouncer.h",
+    "searchbox/searchbox.cc",
+    "searchbox/searchbox.h",
+    "searchbox/searchbox_extension.cc",
+    "searchbox/searchbox_extension.h",
+    "security_filter_peer.cc",
+    "security_filter_peer.h",
+    "tts_dispatcher.cc",
+    "tts_dispatcher.h",
+    "web_apps.cc",
+    "web_apps.h",
+    "worker_content_settings_client_proxy.cc",
+    "worker_content_settings_client_proxy.h",
+  ]
 
   defines = []
 
@@ -86,8 +142,32 @@
   }
 
   if (enable_plugins) {
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_plugin_sources, ".", "..")
+    sources += [
+      "pepper/chrome_renderer_pepper_host_factory.cc",
+      "pepper/chrome_renderer_pepper_host_factory.h",
+      "pepper/pepper_flash_drm_renderer_host.cc",
+      "pepper/pepper_flash_drm_renderer_host.h",
+      "pepper/pepper_flash_font_file_host.cc",
+      "pepper/pepper_flash_font_file_host.h",
+      "pepper/pepper_flash_fullscreen_host.cc",
+      "pepper/pepper_flash_fullscreen_host.h",
+      "pepper/pepper_flash_menu_host.cc",
+      "pepper/pepper_flash_menu_host.h",
+      "pepper/pepper_flash_renderer_host.cc",
+      "pepper/pepper_flash_renderer_host.h",
+      "pepper/pepper_helper.cc",
+      "pepper/pepper_helper.h",
+      "pepper/pepper_shared_memory_message_filter.cc",
+      "pepper/pepper_shared_memory_message_filter.h",
+      "pepper/pepper_uma_host.cc",
+      "pepper/pepper_uma_host.h",
+      "plugins/chrome_plugin_placeholder.cc",
+      "plugins/chrome_plugin_placeholder.h",
+      "plugins/plugin_preroller.cc",
+      "plugins/plugin_preroller.h",
+      "plugins/power_saver_info.cc",
+      "plugins/power_saver_info.h",
+    ]
     deps += [
       "//components/pdf/renderer",
       "//components/strings",
@@ -99,15 +179,31 @@
   }
 
   if (safe_browsing_mode != 0) {
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_basic_safe_browsing_sources,
-                    ".",
-                    "..")
+    sources += [
+      "safe_browsing/threat_dom_details.cc",
+      "safe_browsing/threat_dom_details.h",
+    ]
     if (safe_browsing_mode == 1) {
-      sources +=
-          rebase_path(gypi_values.chrome_renderer_full_safe_browsing_sources,
-                      ".",
-                      "..")
+      sources += [
+        "safe_browsing/feature_extractor_clock.cc",
+        "safe_browsing/feature_extractor_clock.h",
+        "safe_browsing/features.cc",
+        "safe_browsing/features.h",
+        "safe_browsing/murmurhash3_util.cc",
+        "safe_browsing/murmurhash3_util.h",
+        "safe_browsing/phishing_classifier.cc",
+        "safe_browsing/phishing_classifier.h",
+        "safe_browsing/phishing_classifier_delegate.cc",
+        "safe_browsing/phishing_classifier_delegate.h",
+        "safe_browsing/phishing_dom_feature_extractor.cc",
+        "safe_browsing/phishing_dom_feature_extractor.h",
+        "safe_browsing/phishing_term_feature_extractor.cc",
+        "safe_browsing/phishing_term_feature_extractor.h",
+        "safe_browsing/phishing_url_feature_extractor.cc",
+        "safe_browsing/phishing_url_feature_extractor.h",
+        "safe_browsing/scorer.cc",
+        "safe_browsing/scorer.h",
+      ]
       deps += [
         "//chrome/common/safe_browsing:proto",
         "//third_party/smhasher:murmurhash3",
@@ -116,8 +212,89 @@
   }
 
   if (enable_extensions) {
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_extensions_sources, ".", "..")
+    sources += [
+      "extensions/app_bindings.cc",
+      "extensions/app_bindings.h",
+      "extensions/automation_internal_custom_bindings.cc",
+      "extensions/automation_internal_custom_bindings.h",
+      "extensions/chrome_extensions_dispatcher_delegate.cc",
+      "extensions/chrome_extensions_dispatcher_delegate.h",
+      "extensions/chrome_extensions_renderer_client.cc",
+      "extensions/chrome_extensions_renderer_client.h",
+      "extensions/chrome_v8_extension_handler.cc",
+      "extensions/chrome_v8_extension_handler.h",
+      "extensions/extension_localization_peer.cc",
+      "extensions/extension_localization_peer.h",
+      "extensions/file_browser_handler_custom_bindings.cc",
+      "extensions/file_browser_handler_custom_bindings.h",
+      "extensions/file_manager_private_custom_bindings.cc",
+      "extensions/file_manager_private_custom_bindings.h",
+      "extensions/media_galleries_custom_bindings.cc",
+      "extensions/media_galleries_custom_bindings.h",
+      "extensions/notifications_native_handler.cc",
+      "extensions/notifications_native_handler.h",
+      "extensions/page_capture_custom_bindings.cc",
+      "extensions/page_capture_custom_bindings.h",
+      "extensions/platform_keys_natives.cc",
+      "extensions/platform_keys_natives.h",
+      "extensions/renderer_permissions_policy_delegate.cc",
+      "extensions/renderer_permissions_policy_delegate.h",
+      "extensions/resource_request_policy.cc",
+      "extensions/resource_request_policy.h",
+      "extensions/sync_file_system_custom_bindings.cc",
+      "extensions/sync_file_system_custom_bindings.h",
+      "extensions/tabs_custom_bindings.cc",
+      "extensions/tabs_custom_bindings.h",
+      "extensions/webstore_bindings.cc",
+      "extensions/webstore_bindings.h",
+      "media/cast_ipc_dispatcher.cc",
+      "media/cast_ipc_dispatcher.h",
+      "media/cast_receiver_audio_valve.cc",
+      "media/cast_receiver_audio_valve.h",
+      "media/cast_receiver_session.cc",
+      "media/cast_receiver_session.h",
+      "media/cast_receiver_session_delegate.cc",
+      "media/cast_receiver_session_delegate.h",
+      "media/cast_rtp_stream.cc",
+      "media/cast_rtp_stream.h",
+      "media/cast_session.cc",
+      "media/cast_session.h",
+      "media/cast_session_delegate.cc",
+      "media/cast_session_delegate.h",
+      "media/cast_threads.cc",
+      "media/cast_threads.h",
+      "media/cast_transport_ipc.cc",
+      "media/cast_transport_ipc.h",
+      "media/cast_udp_transport.cc",
+      "media/cast_udp_transport.h",
+      "resources/extensions/app_custom_bindings.js",
+      "resources/extensions/automation_custom_bindings.js",
+      "resources/extensions/browser_action_custom_bindings.js",
+      "resources/extensions/certificate_provider_custom_bindings.js",
+      "resources/extensions/chrome_direct_setting.js",
+      "resources/extensions/chrome_setting.js",
+      "resources/extensions/content_setting.js",
+      "resources/extensions/declarative_content_custom_bindings.js",
+      "resources/extensions/enterprise_platform_keys_custom_bindings.js",
+      "resources/extensions/feedback_private_custom_bindings.js",
+      "resources/extensions/file_browser_handler_custom_bindings.js",
+      "resources/extensions/file_entry_binding_util.js",
+      "resources/extensions/file_manager_private_custom_bindings.js",
+      "resources/extensions/file_system_custom_bindings.js",
+      "resources/extensions/file_system_provider_custom_bindings.js",
+      "resources/extensions/gcm_custom_bindings.js",
+      "resources/extensions/identity_custom_bindings.js",
+      "resources/extensions/image_writer_private_custom_bindings.js",
+      "resources/extensions/input.ime_custom_bindings.js",
+      "resources/extensions/log_private_custom_bindings.js",
+      "resources/extensions/notifications_custom_bindings.js",
+      "resources/extensions/omnibox_custom_bindings.js",
+      "resources/extensions/page_action_custom_bindings.js",
+      "resources/extensions/page_capture_custom_bindings.js",
+      "resources/extensions/system_indicator_custom_bindings.js",
+      "resources/extensions/tts_custom_bindings.js",
+      "resources/extensions/tts_engine_custom_bindings.js",
+    ]
     deps += [
       # TODO(hclam): See crbug.com/298380 for details.
       # We should isolate the APIs needed by the renderer.
@@ -138,26 +315,33 @@
     }
   }
   if (enable_webrtc) {
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_webrtc_sources, ".", "..")
+    sources += [
+      "media/chrome_webrtc_log_message_delegate.cc",
+      "media/chrome_webrtc_log_message_delegate.h",
+      "media/webrtc_logging_message_filter.cc",
+      "media/webrtc_logging_message_filter.h",
+    ]
   }
   if (enable_extensions && enable_webrtc) {
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_webrtc_extensions_sources,
-                    ".",
-                    "..")
+    sources += [
+      "extensions/cast_streaming_native_handler.cc",
+      "extensions/cast_streaming_native_handler.h",
+    ]
   }
   if (enable_spellcheck) {
     deps += [ "//components/spellcheck/renderer:renderer" ]
   }
   if (enable_basic_printing || enable_print_preview) {
     deps += [ "//printing" ]
-    sources +=
-        rebase_path(gypi_values.chrome_renderer_printing_sources, ".", "..")
+    sources += [
+      "printing/chrome_print_web_view_helper_delegate.cc",
+      "printing/chrome_print_web_view_helper_delegate.h",
+    ]
     if (enable_print_preview) {
-      sources += rebase_path(gypi_values.chrome_renderer_full_printing_sources,
-                             ".",
-                             "..")
+      sources += [
+        "pepper/chrome_pdf_print_client.cc",
+        "pepper/chrome_pdf_print_client.h",
+      ]
     }
   }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0a1bbcb4..1ffea635 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -355,10 +355,76 @@
   }
 
   test("interactive_ui_tests") {
-    sources =
-        rebase_path(chrome_tests_gypi_values.chrome_interactive_ui_test_sources,
-                    ".",
-                    "//chrome")
+    sources = [
+      "../browser/apps/app_browsertest_util.cc",
+      "../browser/apps/app_browsertest_util.h",
+      "../browser/apps/app_pointer_lock_interactive_uitest.cc",
+      "../browser/apps/app_shim/app_shim_interactive_uitest_mac.mm",
+      "../browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm",
+      "../browser/apps/app_window_interactive_uitest.cc",
+      "../browser/apps/guest_view/web_view_interactive_browsertest.cc",
+      "../browser/autofill/autofill_interactive_uitest.cc",
+      "../browser/autofill/autofill_uitest_util.cc",
+      "../browser/browser_keyevents_browsertest.cc",
+      "../browser/extensions/api/extension_action/browser_action_interactive_test.cc",
+      "../browser/extensions/api/omnibox/omnibox_api_interactive_test.cc",
+      "../browser/extensions/browsertest_util.cc",
+      "../browser/extensions/clipboard_extension_apitest_chromeos.cc",
+      "../browser/extensions/extension_apitest.cc",
+      "../browser/extensions/extension_browsertest.cc",
+      "../browser/extensions/extension_commands_global_registry_apitest.cc",
+      "../browser/extensions/extension_crash_recovery_browsertest.cc",
+      "../browser/extensions/extension_fullscreen_apitest.cc",
+      "../browser/extensions/extension_function_test_utils.cc",
+      "../browser/extensions/extension_keybinding_apitest.cc",
+      "../browser/extensions/extension_test_notification_observer.cc",
+      "../browser/extensions/updater/extension_cache_fake.cc",
+      "../browser/extensions/updater/extension_cache_fake.h",
+      "../browser/extensions/window_open_interactive_apitest.cc",
+      "../browser/mouseleave_browsertest.cc",
+      "../browser/password_manager/password_generation_interactive_uitest.cc",
+      "../browser/password_manager/password_manager_interactive_uitest.cc",
+      "../browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc",
+      "../browser/renderer_context_menu/render_view_context_menu_browsertest_util.h",
+      "../browser/site_per_process_interactive_browsertest.cc",
+      "../browser/ui/autofill/autofill_popup_controller_interactive_uitest.cc",
+      "../browser/ui/browser_focus_uitest.cc",
+      "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_interactive_uitest.mm",
+      "../browser/ui/cocoa/apps/quit_with_apps_controller_mac_interactive_uitest.mm",
+      "../browser/ui/exclusive_access/flash_fullscreen_interactive_browsertest.cc",
+      "../browser/ui/exclusive_access/fullscreen_controller_interactive_browsertest.cc",
+      "../browser/ui/exclusive_access/fullscreen_controller_state_interactive_browsertest.cc",
+      "../browser/ui/find_bar/find_bar_host_interactive_uitest.cc",
+      "../browser/ui/omnibox/omnibox_view_browsertest.cc",
+      "../browser/ui/passwords/manage_passwords_test.cc",
+      "../browser/ui/passwords/manage_passwords_test.h",
+      "../browser/ui/search/instant_extended_interactive_uitest.cc",
+      "../browser/ui/search/instant_extended_manual_interactive_uitest.cc",
+      "../browser/ui/search/instant_test_utils.cc",
+      "../browser/ui/search/instant_test_utils.h",
+      "../browser/ui/search/local_ntp_browsertest.cc",
+      "../browser/ui/startup/startup_browser_creator_interactive_uitest.cc",
+      "../browser/ui/translate/translate_bubble_test_utils.h",
+      "../browser/ui/views/accessibility/navigation_accessibility_uitest_win.cc",
+      "../browser/ui/webui/options/language_dictionary_interactive_uitest.cc",
+      "../browser/ui/webui/options/language_options_interactive_uitest.cc",
+      "//ui/base/clipboard/clipboard_android_unittest.cc",
+      "//ui/base/clipboard/clipboard_unittest.cc",
+      "base/always_on_top_window_killer_win.cc",
+      "base/always_on_top_window_killer_win.h",
+      "base/interactive_test_utils.cc",
+      "base/interactive_test_utils.h",
+      "base/interactive_test_utils_aura.cc",
+      "base/interactive_test_utils_aura.h",
+      "base/interactive_test_utils_common_views.cc",
+      "base/interactive_test_utils_mac.mm",
+      "base/interactive_test_utils_win.cc",
+      "base/interactive_ui_tests_main.cc",
+      "base/view_event_test_platform_part.h",
+      "base/view_event_test_platform_part_chromeos.cc",
+      "base/view_event_test_platform_part_default.cc",
+      "ppapi/ppapi_interactive_browsertest.cc",
+    ]
 
     configs += [ "//build/config:precompiled_headers" ]
 
@@ -448,20 +514,55 @@
     ]
 
     if (toolkit_views) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_views_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/ui/views/menu_controller_interactive_uitest.cc",
+        "../browser/ui/views/menu_item_view_interactive_uitest.cc",
+        "../browser/ui/views/menu_model_adapter_test.cc",
+        "../browser/ui/views/menu_test_base.cc",
+        "../browser/ui/views/menu_test_base.h",
+        "../browser/ui/views/menu_view_drag_and_drop_test.cc",
+        "../browser/ui/views/status_icons/status_tray_state_changer_interactive_uitest_win.cc",
+        "//ui/views/corewm/desktop_capture_controller_unittest.cc",
+        "//ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc",
+        "//ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc",
+        "//ui/views/widget/widget_interactive_uitest.cc",
+        "base/view_event_test_base.cc",
+        "base/view_event_test_base.h",
+      ]
       deps += [
         "//ui/views",
         "//ui/views:test_support",
         "//ui/views/controls/webview:test_support",
       ]
-      if (!is_mac) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_interactive_ui_test_views_non_mac_sources,
-                ".",
-                "//chrome")
+      if (!is_mac || mac_views_browser) {
+        # TODO(tapted): Move these to chrome_interactive_ui_test_views_sources when
+        # the corresponding files are moved in chrome_browser_ui.gypi (i.e. out of
+        # chrome_browser_ui_views_non_mac_sources).
+        sources += [
+          "../browser/ui/views/bookmarks/bookmark_bar_view_test.cc",
+          "../browser/ui/views/bookmarks/bookmark_bar_view_test_helper.h",
+          "../browser/ui/views/certificate_selector_browsertest.cc",
+          "../browser/ui/views/constrained_window_views_browsertest.cc",
+          "../browser/ui/views/extensions/extension_dialog_interactive_uitest.cc",
+          "../browser/ui/views/find_bar_views_interactive_uitest.cc",
+          "../browser/ui/views/frame/browser_view_focus_uitest.cc",
+          "../browser/ui/views/frame/browser_view_interactive_uitest.cc",
+          "../browser/ui/views/keyboard_access_browsertest.cc",
+          "../browser/ui/views/location_bar/location_icon_view_interactive_uitest.cc",
+          "../browser/ui/views/location_bar/page_action_image_view_interactive_uitest.cc",
+          "../browser/ui/views/location_bar/star_view_browsertest.cc",
+          "../browser/ui/views/omnibox/omnibox_view_views_browsertest.cc",
+          "../browser/ui/views/passwords/manage_passwords_bubble_view_interactive_uitest.cc",
+          "../browser/ui/views/passwords/manage_passwords_icon_view_interactive_uitest.cc",
+          "../browser/ui/views/ssl_client_certificate_selector_browsertest.cc",
+          "../browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc",
+          "../browser/ui/views/tabs/tab_drag_controller_interactive_uitest.h",
+          "../browser/ui/views/toolbar/toolbar_action_view_interactive_uitest.cc",
+          "../browser/ui/views/toolbar/toolbar_button_interactive_uitest.cc",
+          "../browser/ui/views/toolbar/toolbar_view_interactive_uitest.cc",
+          "../browser/ui/views/translate/translate_bubble_test_utils_views.cc",
+          "base/interactive_test_utils_views.cc",
+        ]
       }
       if (is_linux) {
         if (!is_chromeos) {
@@ -480,8 +581,8 @@
       }
       if (is_chromeos || !use_x11) {
         sources -= [
-          "../../ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc",
-          "../../ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc",
+          "//ui/views/widget/desktop_aura/desktop_window_tree_host_x11_interactive_uitest.cc",
+          "//ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc",
         ]
       }
       if (use_aura || is_mac) {
@@ -495,19 +596,59 @@
 
     if (!is_desktop_linux) {
       # Everything but desktop Linux.
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_non_desktop_linux_sources,
-              ".",
-              "//chrome")
+      sources += [
+        # TODO(port): Everything here times out. Attempts have been made to fix
+        # the individual failures, but each time I disable a test from these
+        # suites, it seems like one or another starts timing out too.
+        "../browser/extensions/api/tabs/tabs_interactive_test.cc",
+      ]
     }
 
     if (is_chromeos) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_chromeos_sources,
-              ".",
-              "//chrome")
-      sources += [ "../browser/notifications/login_state_notification_blocker_chromeos_browsertest.cc" ]
-
+      sources += [
+        "../../ash/accelerators/accelerator_interactive_uitest_chromeos.cc",
+        "../browser/chromeos/accessibility/accessibility_highlight_manager_interactive_uitest.cc",
+        "../browser/chromeos/accessibility/magnification_controller_browsertest.cc",
+        "../browser/chromeos/accessibility/speech_monitor.cc",
+        "../browser/chromeos/accessibility/speech_monitor.h",
+        "../browser/chromeos/accessibility/spoken_feedback_browsertest.cc",
+        "../browser/chromeos/accessibility/sticky_keys_browsertest.cc",
+        "../browser/chromeos/input_method/textinput_browsertest.cc",
+        "../browser/chromeos/input_method/textinput_surroundingtext_browsertest.cc",
+        "../browser/chromeos/input_method/textinput_test_helper.cc",
+        "../browser/chromeos/input_method/textinput_test_helper.h",
+        "../browser/chromeos/login/eula_browsertest.cc",
+        "../browser/chromeos/login/lock/screen_locker_browsertest.cc",
+        "../browser/chromeos/login/lock/screen_locker_tester.cc",
+        "../browser/chromeos/login/lock/screen_locker_tester.h",
+        "../browser/chromeos/login/login_browsertest.cc",
+        "../browser/chromeos/login/login_manager_test.cc",
+        "../browser/chromeos/login/login_manager_test.h",
+        "../browser/chromeos/login/login_ui_browsertest.cc",
+        "../browser/chromeos/login/mixin_based_browser_test.cc",
+        "../browser/chromeos/login/mixin_based_browser_test.h",
+        "../browser/chromeos/login/oobe_browsertest.cc",
+        "../browser/chromeos/login/screenshot_testing/SkDiffPixelsMetric.h",
+        "../browser/chromeos/login/screenshot_testing/SkDiffPixelsMetric_cpu.cpp",
+        "../browser/chromeos/login/screenshot_testing/SkImageDiffer.cpp",
+        "../browser/chromeos/login/screenshot_testing/SkImageDiffer.h",
+        "../browser/chromeos/login/screenshot_testing/SkPMetric.cpp",
+        "../browser/chromeos/login/screenshot_testing/SkPMetric.h",
+        "../browser/chromeos/login/screenshot_testing/screenshot_tester.cc",
+        "../browser/chromeos/login/screenshot_testing/screenshot_tester.h",
+        "../browser/chromeos/login/screenshot_testing/screenshot_tester.h",
+        "../browser/chromeos/login/screenshot_testing/screenshot_testing_mixin.cc",
+        "../browser/chromeos/login/screenshot_testing/screenshot_testing_mixin.h",
+        "../browser/chromeos/login/test/https_forwarder.cc",
+        "../browser/chromeos/login/test/https_forwarder.h",
+        "../browser/chromeos/login/test/oobe_base_test.cc",
+        "../browser/chromeos/login/test/oobe_base_test.h",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_browsertest.cc",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.cc",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h",
+        "../browser/notifications/login_state_notification_blocker_chromeos_browsertest.cc",
+        "data/chromeos/service_login.html",
+      ]
       deps += [
         "//ash/resources",
         "//chromeos",
@@ -541,10 +682,20 @@
     }
 
     if (is_win) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_win_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../app/chrome_dll.rc",
+        "../browser/downgrade/user_data_downgrade_browsertest.cc",
+        "//ui/resources/cursors/aliasb.cur",
+        "//ui/resources/cursors/cell.cur",
+        "//ui/resources/cursors/col_resize.cur",
+        "//ui/resources/cursors/copy.cur",
+        "//ui/resources/cursors/none.cur",
+        "//ui/resources/cursors/row_resize.cur",
+        "//ui/resources/cursors/vertical_text.cur",
+        "//ui/resources/cursors/zoom_in.cur",
+        "//ui/resources/cursors/zoom_out.cur",
+        "data/resource.rc",
+      ]
       deps += [
         "//chrome:other_version",
         "//chrome/install_static:install_static_util",
@@ -568,18 +719,14 @@
 
       # The browser window can be views or Cocoa on Mac. Test accordingly.
       if (mac_views_browser) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_interactive_ui_test_views_non_mac_sources,
-                ".",
-                "//chrome")
-
         # Aura depended tests.
         sources -= [ "../browser/ui/views/bookmarks/bookmark_bar_view_test.cc" ]
       } else {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_interactive_ui_test_cocoa_sources,
-                ".",
-                "//chrome")
+        sources += [
+          "../browser/ui/cocoa/extensions/browser_action_button_interactive_uitest.mm",
+          "../browser/ui/cocoa/translate/translate_bubble_test_utils_cocoa.mm",
+          "base/interactive_test_utils_cocoa.mm",
+        ]
       }
     }
 
@@ -589,10 +736,8 @@
     }
 
     if (enable_app_list) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_app_list_sources,
-              ".",
-              "//chrome")
+      sources +=
+          [ "../browser/ui/app_list/app_list_service_interactive_uitest.cc" ]
     }
 
     if (!use_aura) {
@@ -603,10 +748,12 @@
     }
 
     if (use_ash) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_ash_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/ui/views/ash/tab_scrubber_browsertest.cc",
+        "../browser/ui/window_sizer/window_sizer_ash_uitest.cc",
+        "//ash/drag_drop/drag_drop_interactive_uitest.cc",
+        "//ash/wm/ash_native_cursor_manager_interactive_uitest.cc",
+      ]
       if (is_chromeos) {
         sources -= [
           # Use only the _chromeos version on ChromeOS.
@@ -617,10 +764,10 @@
     }
 
     if (enable_notifications) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_interactive_ui_test_notifications_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/extensions/api/notifications/notifications_apitest.cc",
+        "../browser/notifications/message_center_notifications_browsertest.cc",
+      ]
 
       # Non-ChromeOS notifications tests (ChromeOS does not use cross-platform
       # panels).
@@ -644,8 +791,7 @@
     }  # enable_notifications
 
     if (!use_aura || is_chromeos) {
-      sources -=
-          [ "../../ui/views/corewm/desktop_capture_controller_unittest.cc" ]
+      sources -= [ "//ui/views/corewm/desktop_capture_controller_unittest.cc" ]
     }
   }
 
@@ -654,11 +800,10 @@
       defines = []
       testonly = true
 
-      sources = rebase_path(
-              chrome_tests_gypi_values.chrome_browser_app_list_ash_test_support_sources,
-              ".",
-              "//chrome")
-
+      sources = [
+        "../browser/ui/ash/app_list/test/app_list_service_ash_test_api.cc",
+        "../browser/ui/ash/app_list/test/app_list_service_ash_test_api.h",
+      ]
       deps = [
         "//chrome/browser/ui",
         "//ui/app_list/presenter:test_support",
@@ -668,10 +813,84 @@
 
   static_library("sync_integration_test_support") {
     testonly = true
-    sources = rebase_path(
-            chrome_tests_gypi_values.test_support_sync_integration_sources,
-            ".",
-            "//chrome")
+    sources = [
+      "../browser/sync/test/integration/apps_helper.cc",
+      "../browser/sync/test/integration/apps_helper.h",
+      "../browser/sync/test/integration/autofill_helper.cc",
+      "../browser/sync/test/integration/autofill_helper.h",
+      "../browser/sync/test/integration/await_match_status_change_checker.cc",
+      "../browser/sync/test/integration/await_match_status_change_checker.h",
+      "../browser/sync/test/integration/bookmarks_helper.cc",
+      "../browser/sync/test/integration/bookmarks_helper.h",
+      "../browser/sync/test/integration/dictionary_helper.cc",
+      "../browser/sync/test/integration/dictionary_helper.h",
+      "../browser/sync/test/integration/dictionary_load_observer.cc",
+      "../browser/sync/test/integration/dictionary_load_observer.h",
+      "../browser/sync/test/integration/extension_settings_helper.cc",
+      "../browser/sync/test/integration/extension_settings_helper.h",
+      "../browser/sync/test/integration/extensions_helper.cc",
+      "../browser/sync/test/integration/extensions_helper.h",
+      "../browser/sync/test/integration/fake_server_invalidation_service.cc",
+      "../browser/sync/test/integration/fake_server_invalidation_service.h",
+      "../browser/sync/test/integration/fake_server_match_status_checker.cc",
+      "../browser/sync/test/integration/fake_server_match_status_checker.h",
+      "../browser/sync/test/integration/migration_waiter.cc",
+      "../browser/sync/test/integration/migration_waiter.h",
+      "../browser/sync/test/integration/migration_watcher.cc",
+      "../browser/sync/test/integration/migration_watcher.h",
+      "../browser/sync/test/integration/multi_client_status_change_checker.cc",
+      "../browser/sync/test/integration/multi_client_status_change_checker.h",
+      "../browser/sync/test/integration/p2p_invalidation_forwarder.cc",
+      "../browser/sync/test/integration/p2p_invalidation_forwarder.h",
+      "../browser/sync/test/integration/p2p_sync_refresher.cc",
+      "../browser/sync/test/integration/p2p_sync_refresher.h",
+      "../browser/sync/test/integration/password_manager_setting_migrator_helper.cc",
+      "../browser/sync/test/integration/password_manager_setting_migrator_helper.h",
+      "../browser/sync/test/integration/passwords_helper.cc",
+      "../browser/sync/test/integration/passwords_helper.h",
+      "../browser/sync/test/integration/preferences_helper.cc",
+      "../browser/sync/test/integration/preferences_helper.h",
+      "../browser/sync/test/integration/profile_sync_service_harness.cc",
+      "../browser/sync/test/integration/profile_sync_service_harness.h",
+      "../browser/sync/test/integration/quiesce_status_change_checker.cc",
+      "../browser/sync/test/integration/quiesce_status_change_checker.h",
+      "../browser/sync/test/integration/retry_verifier.cc",
+      "../browser/sync/test/integration/retry_verifier.h",
+      "../browser/sync/test/integration/search_engines_helper.cc",
+      "../browser/sync/test/integration/search_engines_helper.h",
+      "../browser/sync/test/integration/sessions_helper.cc",
+      "../browser/sync/test/integration/sessions_helper.h",
+      "../browser/sync/test/integration/single_client_status_change_checker.cc",
+      "../browser/sync/test/integration/single_client_status_change_checker.h",
+      "../browser/sync/test/integration/status_change_checker.cc",
+      "../browser/sync/test/integration/status_change_checker.h",
+      "../browser/sync/test/integration/sync_app_helper.cc",
+      "../browser/sync/test/integration/sync_app_helper.h",
+      "../browser/sync/test/integration/sync_app_list_helper.cc",
+      "../browser/sync/test/integration/sync_app_list_helper.h",
+      "../browser/sync/test/integration/sync_arc_package_helper.cc",
+      "../browser/sync/test/integration/sync_arc_package_helper.h",
+      "../browser/sync/test/integration/sync_datatype_helper.cc",
+      "../browser/sync/test/integration/sync_datatype_helper.h",
+      "../browser/sync/test/integration/sync_extension_helper.cc",
+      "../browser/sync/test/integration/sync_extension_helper.h",
+      "../browser/sync/test/integration/sync_extension_installer.cc",
+      "../browser/sync/test/integration/sync_extension_installer.h",
+      "../browser/sync/test/integration/sync_integration_test_util.cc",
+      "../browser/sync/test/integration/sync_integration_test_util.h",
+      "../browser/sync/test/integration/sync_test.cc",
+      "../browser/sync/test/integration/sync_test.h",
+      "../browser/sync/test/integration/themes_helper.cc",
+      "../browser/sync/test/integration/themes_helper.h",
+      "../browser/sync/test/integration/typed_urls_helper.cc",
+      "../browser/sync/test/integration/typed_urls_helper.h",
+      "../browser/sync/test/integration/updated_progress_marker_checker.cc",
+      "../browser/sync/test/integration/updated_progress_marker_checker.h",
+      "../browser/sync/test/integration/wifi_credentials_helper.cc",
+      "../browser/sync/test/integration/wifi_credentials_helper.h",
+      "../browser/sync/test/integration/wifi_credentials_helper_chromeos.cc",
+      "../browser/sync/test/integration/wifi_credentials_helper_chromeos.h",
+    ]
     public_deps = [
       "//chrome/browser",
     ]
@@ -722,10 +941,94 @@
 
   js2gtest("browser_tests_js_webui") {
     test_type = "webui"
-    sources = rebase_path(
-            chrome_tests_gypi_values.chrome_browser_tests_webui_js_sources,
-            ".",
-            "//chrome")
+
+    # Javascript sources. These are combined with the .cc files in the GYP build
+    # and are handled by a rule, but in the GN build they're in a separate
+    # action so need to be separated out.
+    sources = [
+      "../browser/ui/webui/app_list/start_page_browsertest.js",
+      "../browser/ui/webui/chromeos/bluetooth_pairing_ui_browsertest.js",
+      "../browser/ui/webui/chromeos/certificate_manager_dialog_browsertest.js",
+      "../browser/ui/webui/chromeos/set_time_ui_browsertest.js",
+      "../browser/ui/webui/extensions/chromeos/kiosk_apps_browsertest.js",
+      "../browser/ui/webui/extensions/extension_settings_browsertest.js",
+      "../browser/ui/webui/help/help_browsertest.js",
+      "../browser/ui/webui/identity_internals_ui_browsertest.js",
+      "../browser/ui/webui/options/autofill_options_browsertest.js",
+      "../browser/ui/webui/options/browser_options_browsertest.js",
+      "../browser/ui/webui/options/certificate_manager_browsertest.js",
+      "../browser/ui/webui/options/chromeos/accounts_options_browsertest.js",
+      "../browser/ui/webui/options/chromeos/bluetooth_options_browsertest.js",
+      "../browser/ui/webui/options/chromeos/date_time_options_browsertest.js",
+      "../browser/ui/webui/options/chromeos/guest_mode_options_browsertest.js",
+      "../browser/ui/webui/options/chromeos/power_overlay_browsertest.js",
+      "../browser/ui/webui/options/content_options_browsertest.js",
+      "../browser/ui/webui/options/content_settings_exception_area_browsertest.js",
+      "../browser/ui/webui/options/cookies_view_browsertest.js",
+      "../browser/ui/webui/options/edit_dictionary_browsertest.js",
+      "../browser/ui/webui/options/font_settings_browsertest.js",
+      "../browser/ui/webui/options/language_options_browsertest.js",
+      "../browser/ui/webui/options/language_options_dictionary_download_browsertest.js",
+      "../browser/ui/webui/options/manage_profile_browsertest.js",
+      "../browser/ui/webui/options/multilanguage_options_webui_browsertest.js",
+      "../browser/ui/webui/options/options_browsertest.js",
+      "../browser/ui/webui/options/options_browsertest_base.js",
+      "../browser/ui/webui/options/password_manager_browsertest.js",
+      "../browser/ui/webui/options/profile_settings_reset_browsertest.js",
+      "../browser/ui/webui/options/search_engine_manager_browsertest.js",
+      "../browser/ui/webui/options/settings_format_browsertest.js",
+      "../browser/ui/webui/options/startup_page_list_browsertest.js",
+      "../browser/ui/webui/sync_internals_browsertest.js",
+      "../browser/ui/webui/sync_setup_browsertest.js",
+      "data/chromeos/oobe_webui_browsertest.js",
+      "data/webui/about_invalidations_browsertest.js",
+      "data/webui/accessibility_audit_browsertest.js",
+      "data/webui/assertions.js",
+      "data/webui/async_gen.js",
+      "data/webui/certificate_viewer_dialog_test.js",
+      "data/webui/chrome_send_browsertest.js",
+      "data/webui/cr_elements/cr_elements_browsertest.js",
+      "data/webui/extensions/cr_extensions_browsertest.js",
+      "data/webui/history_browsertest.js",
+      "data/webui/md_downloads/downloads_browsertest.js",
+      "data/webui/md_history/md_history_browsertest.js",
+      "data/webui/md_user_manager/user_manager_browsertest.js",
+      "data/webui/mock4js_browsertest.js",
+      "data/webui/net_internals/bandwidth_view.js",
+      "data/webui/net_internals/chromeos_view.js",
+      "data/webui/net_internals/dns_view.js",
+      "data/webui/net_internals/events_view.js",
+      "data/webui/net_internals/hsts_view.js",
+      "data/webui/net_internals/log_util.js",
+      "data/webui/net_internals/log_view_painter.js",
+      "data/webui/net_internals/main.js",
+      "data/webui/net_internals/net_internals_test.js",
+      "data/webui/net_internals/prerender_view.js",
+      "data/webui/net_internals/sdch_view.js",
+      "data/webui/net_internals/timeline_view.js",
+      "data/webui/ntp4.js",
+      "data/webui/plugins_browsertest.js",
+      "data/webui/polymer_browser_test_base.js",
+      "data/webui/print_preview.js",
+      "data/webui/sandboxstatus_browsertest.js",
+      "data/webui/settings/advanced_page_browsertest.js",
+      "data/webui/settings/animation_browsertest.js",
+      "data/webui/settings/basic_page_browsertest.js",
+      "data/webui/settings/bluetooth_page_browsertest_chromeos.js",
+      "data/webui/settings/cr_settings_browsertest.js",
+      "data/webui/settings/easy_unlock_browsertest_chromeos.js",
+      "data/webui/settings/help_page_browsertest.js",
+      "data/webui/settings/languages_page_browsertest.js",
+      "data/webui/settings/on_startup_browsertest.js",
+      "data/webui/settings/passwords_and_autofill_fake_data.js",
+      "data/webui/settings/passwords_and_forms_browsertest.js",
+      "data/webui/settings/settings_autofill_section_browsertest.js",
+      "data/webui/settings/settings_page_browsertest.js",
+      "data/webui/settings/settings_passwords_section_browsertest.js",
+      "data/webui/settings/settings_subpage_browsertest.js",
+      "data/webui/text_defaults_browsertest.js",
+      "data/webui/webui_resource_async_browsertest.js",
+    ]
     if (is_chrome_branded) {
       # crbug.com/230471
       sources -= [ "data/webui/accessibility_audit_browsertest.js" ]
@@ -890,9 +1193,10 @@
 }
 
 test("browser_tests") {
-  sources = rebase_path(chrome_tests_gypi_values.chrome_browser_tests_sources,
-                        ".",
-                        "//chrome")
+  sources = [
+    # TODO(jbudorick): Move tests here from other lists as Android support is
+    # implemented. See crbug.com/611756
+  ]
 
   configs += [
     "//build/config:precompiled_headers",
@@ -936,7 +1240,11 @@
       "$root_out_dir/resources/chromeos/",
     ]
 
-    data_deps += [ "//ui/keyboard:resources" ]
+    data_deps += [
+      # Needed for --run-in-mash, which triggers launching chrome.
+      "//chrome",
+      "//ui/keyboard:resources",
+    ]
 
     if (enable_nacl) {
       data_deps += [
@@ -955,10 +1263,570 @@
 
     enable_multidex = true
   } else {
-    sources += rebase_path(
-            chrome_tests_gypi_values.chrome_browser_tests_desktop_only_sources,
-            ".",
-            "//chrome")
+    sources += [
+      # The list of sources which is only used by chrome browser tests on
+      # desktop platforms.
+      "../../apps/app_restore_service_browsertest.cc",
+      "../../apps/load_and_launch_browsertest.cc",
+      "../app/chrome_dll.rc",
+      "../app/chrome_dll_resource.h",
+      "../app/chrome_version.rc.version",
+      "../browser/accessibility/browser_accessibility_state_browsertest.cc",
+      "../browser/app_controller_mac_browsertest.mm",
+      "../browser/apps/app_browsertest.cc",
+      "../browser/apps/app_shim/app_shim_host_manager_browsertest_mac.mm",
+      "../browser/apps/app_shim/test/app_shim_host_manager_test_api_mac.cc",
+      "../browser/apps/app_shim/test/app_shim_host_manager_test_api_mac.h",
+      "../browser/apps/app_speech_recognition_browsertest.cc",
+      "../browser/apps/app_url_redirector_browsertest.cc",
+      "../browser/apps/app_window_browsertest.cc",
+      "../browser/apps/event_page_browsertest.cc",
+      "../browser/apps/guest_view/app_view_browsertest.cc",
+      "../browser/apps/guest_view/extension_view/extension_view_browsertest.cc",
+      "../browser/apps/guest_view/web_view_browsertest.cc",
+      "../browser/apps/service_worker_browsertest.cc",
+      "../browser/apps/window_controls_browsertest.cc",
+      "../browser/autocomplete/autocomplete_browsertest.cc",
+      "../browser/autofill/autofill_browsertest.cc",
+      "../browser/autofill/autofill_server_browsertest.cc",
+      "../browser/autofill/content_autofill_driver_browsertest.cc",
+      "../browser/autofill/form_structure_browsertest.cc",
+      "../browser/banners/app_banner_manager_browsertest.cc",
+      "../browser/bitmap_fetcher/bitmap_fetcher_browsertest.cc",
+      "../browser/browser_encoding_browsertest.cc",
+      "../browser/browsing_data/autofill_counter_browsertest.cc",
+      "../browser/browsing_data/browsing_data_cache_storage_helper_browsertest.cc",
+      "../browser/browsing_data/browsing_data_database_helper_browsertest.cc",
+      "../browser/browsing_data/browsing_data_helper_browsertest.h",
+      "../browser/browsing_data/browsing_data_indexed_db_helper_browsertest.cc",
+      "../browser/browsing_data/browsing_data_local_storage_helper_browsertest.cc",
+      "../browser/browsing_data/browsing_data_remover_browsertest.cc",
+      "../browser/browsing_data/browsing_data_remover_test_util.cc",
+      "../browser/browsing_data/browsing_data_remover_test_util.h",
+      "../browser/browsing_data/cache_counter_browsertest.cc",
+      "../browser/browsing_data/conditional_cache_deletion_helper_browsertest.cc",
+      "../browser/browsing_data/downloads_counter_browsertest.cc",
+      "../browser/browsing_data/history_counter_browsertest.cc",
+      "../browser/browsing_data/media_licenses_counter_browsertest.cc",
+      "../browser/browsing_data/passwords_counter_browsertest.cc",
+      "../browser/chrome_content_browser_client_browsertest.cc",
+      "../browser/chrome_main_browsertest.cc",
+      "../browser/chrome_navigation_browsertest.cc",
+      "../browser/chrome_plugin_browsertest.cc",
+      "../browser/chrome_security_exploit_browsertest.cc",
+      "../browser/chrome_site_per_process_browsertest.cc",
+      "../browser/chrome_switches_browsertest.cc",
+      "../browser/collected_cookies_browsertest.cc",
+      "../browser/content_settings/content_settings_browsertest.cc",
+      "../browser/crash_recovery_browsertest.cc",
+      "../browser/custom_handlers/protocol_handler_registry_browsertest.cc",
+      "../browser/data_saver/data_saver_browsertest.cc",
+      "../browser/devtools/device/adb/adb_client_socket_browsertest.cc",
+      "../browser/devtools/device/adb/mock_adb_server.cc",
+      "../browser/devtools/device/adb/mock_adb_server.h",
+      "../browser/devtools/device/devtools_android_bridge_browsertest.cc",
+      "../browser/devtools/device/port_forwarding_browsertest.cc",
+      "../browser/devtools/device/usb/android_usb_browsertest.cc",
+      "../browser/devtools/devtools_sanity_browsertest.cc",
+      "../browser/devtools/devtools_window_testing.cc",
+      "../browser/devtools/devtools_window_testing.h",
+      "../browser/do_not_track_browsertest.cc",
+      "../browser/dom_distiller/distillable_page_utils_browsertest.cc",
+      "../browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc",
+      "../browser/dom_distiller/tab_utils_browsertest.cc",
+      "../browser/download/download_browsertest.cc",
+      "../browser/download/download_browsertest.h",
+      "../browser/download/download_danger_prompt_browsertest.cc",
+      "../browser/download/download_started_animation_browsertest.cc",
+      "../browser/download/save_page_browsertest.cc",
+      "../browser/extensions/active_tab_apitest.cc",
+      "../browser/extensions/activity_log/activity_log_browsertest.cc",
+      "../browser/extensions/alert_apitest.cc",
+      "../browser/extensions/all_urls_apitest.cc",
+      "../browser/extensions/api/activity_log_private/activity_log_private_apitest.cc",
+      "../browser/extensions/api/autofill_private/autofill_private_apitest.cc",
+      "../browser/extensions/api/automation/automation_apitest.cc",
+      "../browser/extensions/api/autotest_private/autotest_private_apitest.cc",
+      "../browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest.cc",
+      "../browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_apitest_chromeos.cc",
+      "../browser/extensions/api/bookmark_manager_private/bookmark_manager_private_apitest.cc",
+      "../browser/extensions/api/bookmarks/bookmark_apitest.cc",
+      "../browser/extensions/api/braille_display_private/braille_display_private_apitest.cc",
+      "../browser/extensions/api/braille_display_private/mock_braille_controller.cc",
+      "../browser/extensions/api/braille_display_private/mock_braille_controller.h",
+      "../browser/extensions/api/browser/browser_apitest.cc",
+      "../browser/extensions/api/browsing_data/browsing_data_test.cc",
+      "../browser/extensions/api/cast_streaming/cast_streaming_apitest.cc",
+      "../browser/extensions/api/cloud_print_private/cloud_print_private_apitest.cc",
+      "../browser/extensions/api/command_line_private/command_line_private_apitest.cc",
+      "../browser/extensions/api/commands/command_service_browsertest.cc",
+      "../browser/extensions/api/content_settings/content_settings_apitest.cc",
+      "../browser/extensions/api/context_menus/context_menu_apitest.cc",
+      "../browser/extensions/api/cookies/cookies_apitest.cc",
+      "../browser/extensions/api/debugger/debugger_apitest.cc",
+      "../browser/extensions/api/debugger/debugger_extension_apitest.cc",
+      "../browser/extensions/api/declarative/declarative_apitest.cc",
+      "../browser/extensions/api/declarative_content/declarative_content_apitest.cc",
+      "../browser/extensions/api/declarative_content/request_content_script_apitest.cc",
+      "../browser/extensions/api/declarative_content/set_icon_apitest.cc",
+      "../browser/extensions/api/desktop_capture/desktop_capture_apitest.cc",
+      "../browser/extensions/api/developer_private/developer_private_apitest.cc",
+      "../browser/extensions/api/dial/dial_apitest.cc",
+      "../browser/extensions/api/downloads/downloads_api_browsertest.cc",
+      "../browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_apitest.cc",
+      "../browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_apitest_nss.cc",
+      "../browser/extensions/api/extension_action/browser_action_apitest.cc",
+      "../browser/extensions/api/extension_action/browser_action_browsertest.cc",
+      "../browser/extensions/api/extension_action/page_action_apitest.cc",
+      "../browser/extensions/api/feedback_private/feedback_browsertest.cc",
+      "../browser/extensions/api/feedback_private/feedback_private_apitest.cc",
+      "../browser/extensions/api/file_system/file_system_apitest.cc",
+      "../browser/extensions/api/file_system/file_system_apitest_chromeos.cc",
+      "../browser/extensions/api/font_settings/font_settings_apitest.cc",
+      "../browser/extensions/api/gcm/gcm_apitest.cc",
+      "../browser/extensions/api/history/history_apitest.cc",
+      "../browser/extensions/api/hotword_private/hotword_private_apitest.cc",
+      "../browser/extensions/api/i18n/i18n_apitest.cc",
+      "../browser/extensions/api/identity/identity_apitest.cc",
+      "../browser/extensions/api/idltest/idltest_apitest.cc",
+      "../browser/extensions/api/image_writer_private/image_writer_private_apitest.cc",
+      "../browser/extensions/api/image_writer_private/test_utils.cc",
+      "../browser/extensions/api/inline_install_private/inline_install_private_apitest.cc",
+      "../browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc",
+      "../browser/extensions/api/instance_id/instance_id_apitest.cc",
+      "../browser/extensions/api/log_private/log_private_apitest_chromeos.cc",
+      "../browser/extensions/api/management/management_api_browsertest.cc",
+      "../browser/extensions/api/management/management_apitest.cc",
+      "../browser/extensions/api/management/management_browsertest.cc",
+      "../browser/extensions/api/media_galleries/media_galleries_apitest.cc",
+      "../browser/extensions/api/media_galleries/media_galleries_watch_apitest.cc",
+      "../browser/extensions/api/messaging/native_messaging_apitest.cc",
+      "../browser/extensions/api/metrics_private/metrics_apitest.cc",
+      "../browser/extensions/api/module/module_apitest.cc",
+      "../browser/extensions/api/music_manager_private/music_manager_private_browsertest.cc",
+      "../browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc",
+      "../browser/extensions/api/notification_provider/notification_provider_apitest.cc",
+      "../browser/extensions/api/omnibox/omnibox_api_browsertest.cc",
+      "../browser/extensions/api/page_capture/page_capture_apitest.cc",
+      "../browser/extensions/api/passwords_private/passwords_private_apitest.cc",
+      "../browser/extensions/api/permissions/permissions_apitest.cc",
+      "../browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc",
+      "../browser/extensions/api/preference/preference_apitest.cc",
+      "../browser/extensions/api/processes/processes_apitest.cc",
+      "../browser/extensions/api/proxy/proxy_apitest.cc",
+      "../browser/extensions/api/resources_private/resources_private_apitest.cc",
+      "../browser/extensions/api/screenlock_private/screenlock_private_apitest.cc",
+      "../browser/extensions/api/sessions/sessions_apitest.cc",
+      "../browser/extensions/api/settings_overrides/settings_overrides_browsertest.cc",
+      "../browser/extensions/api/settings_private/settings_private_apitest.cc",
+      "../browser/extensions/api/socket/socket_apitest.cc",
+      "../browser/extensions/api/storage/settings_apitest.cc",
+      "../browser/extensions/api/streams_private/streams_private_apitest.cc",
+      "../browser/extensions/api/sync_file_system/sync_file_system_apitest.cc",
+      "../browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc",
+      "../browser/extensions/api/system_indicator/system_indicator_apitest.cc",
+      "../browser/extensions/api/system_private/system_private_apitest.cc",
+      "../browser/extensions/api/tab_capture/tab_capture_apitest.cc",
+      "../browser/extensions/api/tabs/tabs_test.cc",
+      "../browser/extensions/api/terminal/terminal_private_apitest.cc",
+      "../browser/extensions/api/test/apitest_apitest.cc",
+      "../browser/extensions/api/top_sites/top_sites_apitest.cc",
+      "../browser/extensions/api/web_navigation/web_navigation_apitest.cc",
+      "../browser/extensions/api/web_request/web_request_apitest.cc",
+      "../browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc",
+      "../browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc",
+      "../browser/extensions/api/webrtc_logging_private/webrtc_event_log_apitest.cc",
+      "../browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc",
+      "../browser/extensions/api/webstore_private/webstore_private_apitest.cc",
+      "../browser/extensions/app_background_page_apitest.cc",
+      "../browser/extensions/app_process_apitest.cc",
+      "../browser/extensions/app_window_overrides_browsertest.cc",
+      "../browser/extensions/background_app_browsertest.cc",
+      "../browser/extensions/background_page_apitest.cc",
+      "../browser/extensions/background_scripts_apitest.cc",
+      "../browser/extensions/background_xhr_browsertest.cc",
+      "../browser/extensions/browsertest_util_browsertest.cc",
+      "../browser/extensions/chrome_app_api_browsertest.cc",
+      "../browser/extensions/chrome_theme_url_browsertest.cc",
+      "../browser/extensions/chrome_ui_overrides_browsertest.cc",
+      "../browser/extensions/content_capabilities_browsertest.cc",
+      "../browser/extensions/content_script_apitest.cc",
+      "../browser/extensions/content_security_policy_apitest.cc",
+      "../browser/extensions/content_verifier_browsertest.cc",
+      "../browser/extensions/crazy_extension_browsertest.cc",
+      "../browser/extensions/cross_origin_xhr_apitest.cc",
+      "../browser/extensions/crx_installer_browsertest.cc",
+      "../browser/extensions/docs/examples/apps/calculator_browsertest.cc",
+      "../browser/extensions/error_console/error_console_browsertest.cc",
+      "../browser/extensions/events_apitest.cc",
+      "../browser/extensions/execute_script_apitest.cc",
+      "../browser/extensions/extension_action_runner_browsertest.cc",
+      "../browser/extensions/extension_bindings_apitest.cc",
+      "../browser/extensions/extension_context_menu_browsertest.cc",
+      "../browser/extensions/extension_disabled_ui_browsertest.cc",
+      "../browser/extensions/extension_dom_clipboard_apitest.cc",
+      "../browser/extensions/extension_fileapi_apitest.cc",
+      "../browser/extensions/extension_functional_browsertest.cc",
+      "../browser/extensions/extension_geolocation_apitest.cc",
+      "../browser/extensions/extension_get_views_apitest.cc",
+      "../browser/extensions/extension_icon_source_apitest.cc",
+      "../browser/extensions/extension_incognito_apitest.cc",
+      "../browser/extensions/extension_install_prompt_browsertest.cc",
+      "../browser/extensions/extension_install_prompt_test_helper.cc",
+      "../browser/extensions/extension_install_prompt_test_helper.h",
+      "../browser/extensions/extension_install_ui_browsertest.cc",
+      "../browser/extensions/extension_javascript_url_apitest.cc",
+      "../browser/extensions/extension_loading_browsertest.cc",
+      "../browser/extensions/extension_management_test_util.cc",
+      "../browser/extensions/extension_management_test_util.h",
+      "../browser/extensions/extension_messages_apitest.cc",
+      "../browser/extensions/extension_override_apitest.cc",
+      "../browser/extensions/extension_request_limiting_throttle_browsertest.cc",
+      "../browser/extensions/extension_resource_request_policy_apitest.cc",
+      "../browser/extensions/extension_startup_browsertest.cc",
+      "../browser/extensions/extension_storage_apitest.cc",
+      "../browser/extensions/extension_storage_monitor_browsertest.cc",
+      "../browser/extensions/extension_tab_util_browsertest.cc",
+      "../browser/extensions/extension_tabs_apitest.cc",
+      "../browser/extensions/extension_url_rewrite_browsertest.cc",
+      "../browser/extensions/extension_view_host_factory_browsertest.cc",
+      "../browser/extensions/extension_websocket_apitest.cc",
+      "../browser/extensions/extension_webui_apitest.cc",
+      "../browser/extensions/fetch_apitest.cc",
+      "../browser/extensions/gpu_browsertest.cc",
+      "../browser/extensions/hotword_browsertest.cc",
+      "../browser/extensions/isolated_app_browsertest.cc",
+      "../browser/extensions/lazy_background_page_apitest.cc",
+      "../browser/extensions/lazy_background_page_test_util.h",
+      "../browser/extensions/mutation_observers_apitest.cc",
+      "../browser/extensions/options_page_apitest.cc",
+      "../browser/extensions/page_action_browsertest.cc",
+      "../browser/extensions/process_management_browsertest.cc",
+      "../browser/extensions/process_manager_browsertest.cc",
+      "../browser/extensions/renderer_initialization_browsertest.cc",
+      "../browser/extensions/requirements_checker_browsertest.cc",
+      "../browser/extensions/sandboxed_pages_apitest.cc",
+      "../browser/extensions/service_worker_apitest.cc",
+      "../browser/extensions/shared_module_apitest.cc",
+      "../browser/extensions/startup_helper_browsertest.cc",
+      "../browser/extensions/stubs_apitest.cc",
+      "../browser/extensions/subscribe_page_action_browsertest.cc",
+      "../browser/extensions/wake_event_page_apitest.cc",
+      "../browser/extensions/web_contents_browsertest.cc",
+      "../browser/extensions/webstore_inline_installer_browsertest.cc",
+      "../browser/extensions/webstore_installer_browsertest.cc",
+      "../browser/extensions/webstore_installer_test.cc",
+      "../browser/extensions/webstore_installer_test.h",
+      "../browser/extensions/webstore_reinstaller_browsertest.cc",
+      "../browser/extensions/webstore_startup_installer_browsertest.cc",
+      "../browser/extensions/window_open_apitest.cc",
+      "../browser/fast_shutdown_browsertest.cc",
+      "../browser/favicon/content_favicon_driver_browsertest.cc",
+      "../browser/first_run/first_run_browsertest.cc",
+      "../browser/first_run/try_chrome_dialog_view_browsertest.cc",
+      "../browser/geolocation/access_token_store_browsertest.cc",
+      "../browser/geolocation/geolocation_browsertest.cc",
+      "../browser/global_keyboard_shortcuts_mac_browsertest.mm",
+      "../browser/history/history_browsertest.cc",
+      "../browser/history/redirect_browsertest.cc",
+      "../browser/iframe_browsertest.cc",
+      "../browser/image_decoder_browsertest.cc",
+      "../browser/importer/edge_importer_browsertest_win.cc",
+      "../browser/importer/firefox_importer_browsertest.cc",
+      "../browser/importer/ie_importer_browsertest_win.cc",
+      "../browser/importer/importer_unittest_utils.cc",
+      "../browser/importer/importer_unittest_utils.h",
+      "../browser/infobars/infobars_browsertest.cc",
+      "../browser/installable/installable_manager_browsertest.cc",
+      "../browser/interstitials/security_interstitial_page_test_utils.cc",
+      "../browser/interstitials/security_interstitial_page_test_utils.h",
+      "../browser/invalidation/profile_invalidation_provider_factory_browsertest.cc",
+      "../browser/lifetime/browser_close_manager_browsertest.cc",
+      "../browser/loadtimes_extension_bindings_browsertest.cc",
+      "../browser/locale_tests_browsertest.cc",
+      "../browser/media/defer_background_media_browsertest.cc",
+      "../browser/media/encrypted_media_browsertest.cc",
+      "../browser/media/encrypted_media_supported_types_browsertest.cc",
+      "../browser/media/media_browsertest.cc",
+      "../browser/media/media_browsertest.h",
+      "../browser/media/media_stream_devices_controller_browsertest.cc",
+      "../browser/media/media_stream_infobar_browsertest.cc",
+      "../browser/media/test_license_server.cc",
+      "../browser/media/test_license_server.h",
+      "../browser/media/test_license_server_config.h",
+      "../browser/media/webrtc_apprtc_browsertest.cc",
+      "../browser/media/webrtc_audio_quality_browsertest.cc",
+      "../browser/media/webrtc_browsertest.cc",
+      "../browser/media/webrtc_browsertest_audio.cc",
+      "../browser/media/webrtc_browsertest_audio.h",
+      "../browser/media/webrtc_browsertest_base.cc",
+      "../browser/media/webrtc_browsertest_base.h",
+      "../browser/media/webrtc_browsertest_common.cc",
+      "../browser/media/webrtc_browsertest_common.h",
+      "../browser/media/webrtc_browsertest_perf.cc",
+      "../browser/media/webrtc_browsertest_perf.h",
+      "../browser/media/webrtc_disable_encryption_flag_browsertest.cc",
+      "../browser/media/webrtc_getmediadevices_browsertest.cc",
+      "../browser/media/webrtc_perf_browsertest.cc",
+      "../browser/media/webrtc_simulcast_browsertest.cc",
+      "../browser/media/webrtc_video_quality_browsertest.cc",
+      "../browser/media/webrtc_webcam_browsertest.cc",
+      "../browser/media/wv_test_license_server_config.cc",
+      "../browser/media/wv_test_license_server_config.h",
+      "../browser/media_galleries/fileapi/iapps_finder_impl_win_browsertest.cc",
+      "../browser/media_galleries/fileapi/media_file_validator_browsertest.cc",
+      "../browser/media_galleries/media_galleries_dialog_controller_mock.cc",
+      "../browser/media_galleries/media_galleries_dialog_controller_mock.h",
+      "../browser/memory/tab_manager_browsertest.cc",
+      "../browser/memory/tab_manager_observer_browsertest.cc",
+      "../browser/metrics/metrics_memory_details_browsertest.cc",
+      "../browser/metrics/metrics_service_browsertest.cc",
+      "../browser/net/cookie_policy_browsertest.cc",
+      "../browser/net/dns_probe_browsertest.cc",
+      "../browser/net/errorpage_browsertest.cc",
+      "../browser/net/ftp_browsertest.cc",
+      "../browser/net/load_timing_browsertest.cc",
+      "../browser/net/nqe/ui_network_quality_estimator_service_browsertest.cc",
+      "../browser/net/nqe/ui_network_quality_estimator_service_test_util.cc",
+      "../browser/net/nqe/ui_network_quality_estimator_service_test_util.h",
+      "../browser/net/nss_context_chromeos_browsertest.cc",
+      "../browser/net/predictor_browsertest.cc",
+      "../browser/net/proxy_browsertest.cc",
+      "../browser/net/sdch_browsertest.cc",
+      "../browser/net/spdyproxy/chrome_data_use_group_browsertest.cc",
+      "../browser/net/websocket_browsertest.cc",
+      "../browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_page_load_metrics_observer_browsertest.cc",
+      "../browser/page_load_metrics/page_load_metrics_browsertest.cc",
+      "../browser/password_manager/credential_manager_browsertest.cc",
+      "../browser/password_manager/password_manager_browsertest.cc",
+      "../browser/pdf/pdf_extension_test.cc",
+      "../browser/pdf/pdf_extension_test_util.cc",
+      "../browser/pdf/pdf_extension_test_util.h",
+      "../browser/permissions/permission_request_manager_browsertest.cc",
+      "../browser/plugins/plugin_power_saver_browsertest.cc",
+      "../browser/policy/cloud/cloud_policy_browsertest.cc",
+      "../browser/policy/cloud/cloud_policy_manager_browsertest.cc",
+      "../browser/policy/cloud/component_cloud_policy_browsertest.cc",
+      "../browser/policy/cloud/device_management_service_browsertest.cc",
+      "../browser/policy/cloud/test_request_interceptor.cc",
+      "../browser/policy/cloud/test_request_interceptor.h",
+      "../browser/policy/policy_browsertest.cc",
+      "../browser/policy/policy_network_browsertest.cc",
+      "../browser/policy/policy_prefs_browsertest.cc",
+      "../browser/policy/policy_startup_browsertest.cc",
+      "../browser/prefetch/prefetch_browsertest.cc",
+      "../browser/prefs/pref_functional_browsertest.cc",
+      "../browser/prefs/pref_service_browsertest.cc",
+      "../browser/prefs/synced_pref_change_registrar_browsertest.cc",
+      "../browser/prefs/tracked/pref_hash_browsertest.cc",
+      "../browser/prerender/prerender_browsertest.cc",
+      "../browser/printing/cloud_print/test/cloud_print_policy_browsertest.cc",
+      "../browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc",
+      "../browser/printing/print_preview_dialog_controller_browsertest.cc",
+      "../browser/printing/print_preview_pdf_generated_browsertest.cc",
+      "../browser/process_singleton_browsertest.cc",
+      "../browser/profile_resetter/profile_resetter_browsertest.cc",
+      "../browser/profiles/host_zoom_map_browsertest.cc",
+      "../browser/profiles/profile_browsertest.cc",
+      "../browser/profiles/profile_list_desktop_browsertest.cc",
+      "../browser/profiles/profile_manager_browsertest.cc",
+      "../browser/profiles/profile_window_browsertest.cc",
+      "../browser/push_messaging/push_messaging_browsertest.cc",
+      "../browser/referrer_policy_browsertest.cc",
+      "../browser/renderer_context_menu/mock_render_view_context_menu.cc",
+      "../browser/renderer_context_menu/mock_render_view_context_menu.h",
+      "../browser/renderer_context_menu/render_view_context_menu_browsertest.cc",
+      "../browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc",
+      "../browser/renderer_context_menu/render_view_context_menu_browsertest_util.h",
+      "../browser/renderer_context_menu/render_view_context_menu_test_util.cc",
+      "../browser/renderer_context_menu/render_view_context_menu_test_util.h",
+      "../browser/renderer_context_menu/spelling_menu_observer_browsertest.cc",
+      "../browser/renderer_host/chrome_resource_dispatcher_host_delegate_browsertest.cc",
+      "../browser/renderer_host/render_process_host_chrome_browsertest.cc",
+      "../browser/repost_form_warning_browsertest.cc",
+      "../browser/safe_browsing/srt_fetcher_browsertest_win.cc",
+      "../browser/safe_json_parser_browsertest.cc",
+      "../browser/search/hotword_installer_browsertest.cc",
+      "../browser/search/suggestions/image_fetcher_impl_browsertest.cc",
+      "../browser/search_engines/template_url_scraper_browsertest.cc",
+      "../browser/service_process/service_process_control_browsertest.cc",
+      "../browser/services/gcm/fake_gcm_profile_service.cc",
+      "../browser/services/gcm/fake_gcm_profile_service.h",
+      "../browser/sessions/better_session_restore_browsertest.cc",
+      "../browser/sessions/persistent_tab_restore_service_browsertest.cc",
+      "../browser/sessions/session_restore_browsertest.cc",
+      "../browser/sessions/session_restore_browsertest_chromeos.cc",
+      "../browser/sessions/tab_restore_browsertest.cc",
+      "../browser/site_details_browsertest.cc",
+      "../browser/spellchecker/spellcheck_service_browsertest.cc",
+      "../browser/ssl/captive_portal_blocking_page_browsertest.cc",
+      "../browser/ssl/cert_verifier_browser_test.cc",
+      "../browser/ssl/cert_verifier_browser_test.h",
+      "../browser/ssl/certificate_reporting_test_utils.cc",
+      "../browser/ssl/certificate_reporting_test_utils.h",
+      "../browser/ssl/chrome_security_state_model_client_browser_tests.cc",
+      "../browser/ssl/chrome_ssl_host_state_delegate_test.cc",
+      "../browser/ssl/ssl_browser_tests.cc",
+      "../browser/ssl/ssl_client_certificate_selector_test.cc",
+      "../browser/ssl/ssl_client_certificate_selector_test.h",
+      "../browser/storage/durable_storage_browsertest.cc",
+      "../browser/subresource_filter/subresource_filter_browsertest.cc",
+      "../browser/sync_file_system/mock_local_change_processor.cc",
+      "../browser/sync_file_system/mock_local_change_processor.h",
+      "../browser/sync_file_system/mock_remote_file_sync_service.cc",
+      "../browser/sync_file_system/mock_remote_file_sync_service.h",
+      "../browser/tab_contents/view_source_browsertest.cc",
+      "../browser/task_manager/mock_web_contents_task_manager.cc",
+      "../browser/task_manager/mock_web_contents_task_manager.h",
+      "../browser/task_manager/providers/web_contents/background_contents_tag_browsertest.cc",
+      "../browser/task_manager/providers/web_contents/devtools_tag_browsertest.cc",
+      "../browser/task_manager/providers/web_contents/extension_tag_browsertest.cc",
+      "../browser/task_manager/providers/web_contents/subframe_task_browsertest.cc",
+      "../browser/task_manager/providers/web_contents/tab_contents_tag_browsertest.cc",
+      "../browser/task_manager/task_manager_browsertest.cc",
+      "../browser/task_manager/task_manager_browsertest_util.cc",
+      "../browser/task_manager/task_manager_browsertest_util.h",
+      "../browser/task_manager/task_manager_tester.cc",
+      "../browser/task_manager/task_manager_tester.h",
+      "../browser/themes/theme_service_browsertest.cc",
+      "../browser/tracing/chrome_tracing_delegate_browsertest.cc",
+      "../browser/translate/translate_browsertest.cc",
+      "../browser/translate/translate_manager_browsertest.cc",
+      "../browser/ui/autofill/card_unmask_prompt_view_browsertest.cc",
+      "../browser/ui/autofill/card_unmask_prompt_view_tester.h",
+      "../browser/ui/autofill/password_generation_popup_view_browsertest.cc",
+      "../browser/ui/autofill/password_generation_popup_view_tester.h",
+      "../browser/ui/blocked_content/popup_blocker_browsertest.cc",
+      "../browser/ui/bookmarks/bookmark_browsertest.cc",
+      "../browser/ui/browser_browsertest.cc",
+      "../browser/ui/browser_command_controller_browsertest.cc",
+      "../browser/ui/browser_navigator_browsertest.cc",
+      "../browser/ui/browser_navigator_browsertest.h",
+      "../browser/ui/browser_navigator_browsertest_chromeos.cc",
+      "../browser/ui/browser_tabrestore_browsertest.cc",
+      "../browser/ui/content_settings/content_setting_bubble_model_browsertest.cc",
+      "../browser/ui/content_settings/content_setting_image_model_browsertest.cc",
+      "../browser/ui/exclusive_access/fullscreen_controller_browsertest.cc",
+      "../browser/ui/extensions/extension_installed_bubble_browsertest.cc",
+      "../browser/ui/extensions/extension_message_bubble_browsertest.cc",
+      "../browser/ui/extensions/extension_message_bubble_browsertest.h",
+      "../browser/ui/extensions/hosted_app_browsertest.cc",
+      "../browser/ui/find_bar/find_bar_host_browsertest.cc",
+      "../browser/ui/location_bar/location_bar_browsertest.cc",
+      "../browser/ui/login/login_handler_browsertest.cc",
+      "../browser/ui/native_window_tracker_browsertest.cc",
+      "../browser/ui/passwords/manage_passwords_test.cc",
+      "../browser/ui/prefs/prefs_tab_helper_browsertest.cc",
+      "../browser/ui/profile_error_browsertest.cc",
+      "../browser/ui/search/new_tab_page_interceptor_browsertest.cc",
+      "../browser/ui/search_engines/search_engine_tab_helper_browsertest.cc",
+      "../browser/ui/settings_window_manager_browsertest.cc",
+      "../browser/ui/startup/startup_browser_creator_browsertest.cc",
+      "../browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc",
+      "../browser/ui/startup/startup_browser_creator_triggered_reset_browsertest_win.cc",
+      "../browser/ui/sync/one_click_signin_links_delegate_impl_browsertest.cc",
+      "../browser/ui/sync/profile_signin_confirmation_helper_browsertest.cc",
+      "../browser/ui/tab_modal_confirm_dialog_browsertest.cc",
+      "../browser/ui/tab_modal_confirm_dialog_browsertest.h",
+      "../browser/ui/toolbar/browser_actions_bar_browsertest.cc",
+      "../browser/ui/toolbar/browser_actions_bar_browsertest.h",
+      "../browser/ui/toolbar/component_toolbar_actions_browsertest.cc",
+      "../browser/ui/toolbar/mock_component_toolbar_actions_factory.cc",
+      "../browser/ui/toolbar/mock_component_toolbar_actions_factory.h",
+      "../browser/ui/website_settings/mock_permission_prompt.cc",
+      "../browser/ui/website_settings/mock_permission_prompt.h",
+      "../browser/ui/website_settings/mock_permission_prompt_factory.cc",
+      "../browser/ui/website_settings/mock_permission_prompt_factory.h",
+      "../browser/ui/website_settings/permission_bubble_browser_test_util.cc",
+      "../browser/ui/website_settings/permission_bubble_browser_test_util.h",
+      "../browser/ui/webui/bidi_checker_web_ui_test.cc",
+      "../browser/ui/webui/bidi_checker_web_ui_test.h",
+      "../browser/ui/webui/bookmarks_ui_browsertest.cc",
+      "../browser/ui/webui/chrome_url_data_manager_browsertest.cc",
+      "../browser/ui/webui/chromeos/bluetooth_pairing_ui_browsertest-inl.h",
+      "../browser/ui/webui/constrained_web_dialog_ui_browsertest.cc",
+      "../browser/ui/webui/extensions/extension_settings_browsertest.cc",
+      "../browser/ui/webui/extensions/extension_settings_browsertest.h",
+      "../browser/ui/webui/identity_internals_ui_browsertest.cc",
+      "../browser/ui/webui/identity_internals_ui_browsertest.h",
+      "../browser/ui/webui/inspect_ui_browsertest.cc",
+      "../browser/ui/webui/interstitials/interstitial_ui_browsertest.cc",
+      "../browser/ui/webui/log_web_ui_url_browsertest.cc",
+      "../browser/ui/webui/net_internals/net_internals_ui_browsertest.cc",
+      "../browser/ui/webui/net_internals/net_internals_ui_browsertest.h",
+      "../browser/ui/webui/ntp/new_tab_ui_browsertest.cc",
+      "../browser/ui/webui/options/certificate_manager_browsertest.cc",
+      "../browser/ui/webui/options/clear_browser_data_browsertest.cc",
+      "../browser/ui/webui/options/content_settings_exception_area_browsertest.cc",
+      "../browser/ui/webui/options/multilanguage_options_browsertest.cc",
+      "../browser/ui/webui/options/multilanguage_options_browsertest.h",
+      "../browser/ui/webui/options/options_browsertest.cc",
+      "../browser/ui/webui/options/options_ui_browsertest.cc",
+      "../browser/ui/webui/options/options_ui_browsertest.h",
+      "../browser/ui/webui/options/preferences_browsertest.cc",
+      "../browser/ui/webui/options/preferences_browsertest.h",
+      "../browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc",
+      "../browser/ui/webui/policy_ui_browsertest.cc",
+      "../browser/ui/webui/print_preview/print_preview_ui_browsertest.cc",
+      "../browser/ui/webui/set_as_default_browser_ui_browsertest_win.cc",
+      "../browser/ui/webui/settings/md_settings_ui_browsertest.cc",
+      "../browser/ui/webui/signin/inline_login_ui_browsertest.cc",
+      "../browser/ui/webui/signin/user_manager_ui_browsertest.cc",
+      "../browser/ui/webui/uber/uber_ui_browsertest.cc",
+      "../browser/ui/webui/web_ui_test_handler.cc",
+      "../browser/ui/webui/web_ui_test_handler.h",
+      "../browser/ui/webui/webui_browsertest.cc",
+      "../browser/ui/webui/webui_webview_browsertest.cc",
+      "../browser/ui/zoom/zoom_controller_browsertest.cc",
+      "../browser/unload_browsertest.cc",
+      "../browser/web_bluetooth_browsertest.cc",
+      "../common/mac/app_mode_chrome_locator_browsertest.mm",
+      "../common/mac/mock_launchd.cc",
+      "../common/mac/mock_launchd.h",
+      "../common/time_format_browsertest.cc",
+      "../renderer/autofill/autofill_renderer_browsertest.cc",
+      "../renderer/autofill/form_autocomplete_browsertest.cc",
+      "../renderer/autofill/form_autofill_browsertest.cc",
+      "../renderer/autofill/form_classifier_browsertest.cc",
+      "../renderer/autofill/page_click_tracker_browsertest.cc",
+      "../renderer/autofill/password_autofill_agent_browsertest.cc",
+      "../renderer/autofill/password_generation_agent_browsertest.cc",
+      "../renderer/autofill/password_generation_test_utils.cc",
+      "../renderer/autofill/password_generation_test_utils.h",
+      "../renderer/chrome_content_renderer_client_browsertest.cc",
+      "../renderer/chrome_render_frame_observer_browsertest.cc",
+      "../renderer/content_settings_observer_browsertest.cc",
+      "../renderer/media/cast_session_browsertest.cc",
+      "../renderer/translate/translate_helper_browsertest.cc",
+      "../renderer/translate/translate_script_browsertest.cc",
+      "base/chrome_render_view_test.cc",
+      "base/chrome_render_view_test.h",
+      "base/in_process_browser_test_browsertest.cc",
+      "base/javascript_browser_test.cc",
+      "base/javascript_browser_test.h",
+      "base/test_chrome_web_ui_controller_factory.cc",
+      "base/test_chrome_web_ui_controller_factory.h",
+      "base/test_chrome_web_ui_controller_factory_browsertest.cc",
+      "base/tracing_browsertest.cc",
+      "base/web_ui_browser_test.cc",
+      "base/web_ui_browser_test.h",
+      "base/web_ui_browser_test_browsertest.cc",
+      "data/webui/async_gen.cc",
+      "data/webui/async_gen.h",
+      "data/webui/certificate_viewer_ui_test-inl.h",
+      "data/webui/chrome_send_browsertest.cc",
+      "data/webui/chrome_send_browsertest.h",
+      "data/webui/history_ui_browsertest.cc",
+      "data/webui/history_ui_browsertest.h",
+      "data/webui/ntp4_browsertest.cc",
+      "data/webui/ntp4_browsertest.h",
+      "data/webui/print_preview.cc",
+      "data/webui/print_preview.h",
+      "data/webui/webui_resource_browsertest.cc",
+      "gpu/webgl_infobar_browsertest.cc",
+      "ppapi/ppapi_browsertest.cc",
+      "ppapi/ppapi_filechooser_browsertest.cc",
+    ]
 
     deps += [
       ":browser_tests_js_webui",
@@ -1023,7 +1891,6 @@
 
     # Runtime dependencies
     data_deps += [
-      "//chrome",
       "//ppapi:ppapi_tests",
       "//ppapi:power_saver_test_plugin",
       "//remoting/webapp:browser_test_resources",
@@ -1130,10 +1997,22 @@
     }
 
     if (enable_extensions) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_extensions_test_support_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/apps/app_browsertest_util.cc",
+        "../browser/apps/app_browsertest_util.h",
+        "../browser/extensions/browsertest_util.cc",
+        "../browser/extensions/browsertest_util.h",
+        "../browser/extensions/extension_apitest.cc",
+        "../browser/extensions/extension_apitest.h",
+        "../browser/extensions/extension_browsertest.cc",
+        "../browser/extensions/extension_browsertest.h",
+        "../browser/extensions/extension_function_test_utils.cc",
+        "../browser/extensions/extension_function_test_utils.h",
+        "../browser/extensions/extension_test_notification_observer.cc",
+        "../browser/extensions/extension_test_notification_observer.h",
+        "../browser/extensions/updater/extension_cache_fake.cc",
+        "../browser/extensions/updater/extension_cache_fake.h",
+      ]
 
       deps += [
         "//chrome/common/extensions/api",
@@ -1147,10 +2026,22 @@
     }
 
     if (use_ash) {
-      sources +=
-          rebase_path(chrome_tests_gypi_values.chrome_browser_tests_ash_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "../browser/ui/ash/accelerator_commands_browsertest.cc",
+        "../browser/ui/ash/accelerator_controller_browsertest.cc",
+        "../browser/ui/ash/chrome_new_window_delegate_browsertest.cc",
+        "../browser/ui/ash/keyboard_controller_browsertest.cc",
+        "../browser/ui/ash/launcher/chrome_launcher_controller_impl_browsertest.cc",
+        "../browser/ui/ash/launcher/launcher_favicon_loader_browsertest.cc",
+        "../browser/ui/ash/multi_user/multi_user_window_manager_test.cc",
+        "../browser/ui/ash/multi_user/multi_user_window_manager_test.h",
+        "../browser/ui/ash/shelf_browsertest.cc",
+        "../browser/ui/ash/system_tray_delegate_chromeos_browsertest_chromeos.cc",
+        "../browser/ui/ash/system_tray_tray_cast_browsertest_chromeos.cc",
+        "../browser/ui/ash/system_tray_tray_cast_browsertest_media_router_chromeos.cc",
+        "../browser/ui/ash/volume_controller_browsertest_chromeos.cc",
+        "../browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc",
+      ]
       deps += [ "//ash:test_support" ]
 
       if (enable_app_list) {
@@ -1161,22 +2052,43 @@
       deps += [ "//ui/events:test_support" ]
     }
     if (toolkit_views) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_views_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/ui/global_error/global_error_service_browsertest.cc",
+        "../browser/ui/views/extensions/extension_uninstall_dialog_view_browsertest.cc",
+        "../browser/ui/views/frame/browser_non_client_frame_view_browsertest_win.cc",
+        "../browser/ui/views/frame/browser_window_property_manager_browsertest_win.cc",
+        "../browser/ui/views/select_file_dialog_extension_browsertest.cc",
+      ]
       deps += [ "//ui/views" ]
       if (!is_chromeos && (!is_mac || mac_views_browser)) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_browser_tests_views_non_cros_sources,
-                ".",
-                "//chrome")
+        sources += [ "../browser/ui/views/profiles/profile_chooser_view_browsertest.cc" ]
       }
-      if (!is_mac) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_browser_tests_views_non_mac_sources,
-                ".",
-                "//chrome")
+      if (!is_mac || mac_views_browser) {
+        sources += [
+          # TODO(tapted): Move these to chrome_browser_tests_views_sources when the
+          # the corresponding files are moved in chrome_browser_ui.gypi (i.e. out of
+          # chrome_browser_ui_views_non_mac_sources). http://crbug.com/404979.
+          "../browser/ui/views/autofill/autofill_popup_base_view_browsertest.cc",
+          "../browser/ui/views/autofill/card_unmask_prompt_view_tester_views.cc",
+          "../browser/ui/views/autofill/card_unmask_prompt_view_tester_views.h",
+          "../browser/ui/views/autofill/password_generation_popup_view_tester_views.cc",
+          "../browser/ui/views/autofill/password_generation_popup_view_tester_views.h",
+          "../browser/ui/views/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc",
+          "../browser/ui/views/collected_cookies_views_browsertest.cc",
+          "../browser/ui/views/extensions/bookmark_override_browsertest.cc",
+          "../browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc",
+          "../browser/ui/views/extensions/extension_message_bubble_view_browsertest.cc",
+          "../browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc",
+          "../browser/ui/views/frame/browser_view_browsertest.cc",
+          "../browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc",
+          "../browser/ui/views/media_router/media_router_ui_browsertest.cc",
+          "../browser/ui/views/passwords/password_dialog_view_browsertest.cc",
+          "../browser/ui/views/task_manager_view_browsertest.cc",
+          "../browser/ui/views/toolbar/browser_actions_container_browsertest.cc",
+          "../browser/ui/views/toolbar/toolbar_view_browsertest.cc",
+          "../browser/ui/views/translate/translate_bubble_view_browsertest.cc",
+          "../browser/ui/views/web_dialog_view_browsertest.cc",
+        ]
       }
     }
 
@@ -1186,10 +2098,182 @@
     }
 
     if (is_chromeos) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_chromeos_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/apps/custom_launcher_page_browsertest_views.cc",
+        "../browser/chromeos/accessibility/accessibility_manager_browsertest.cc",
+        "../browser/chromeos/accessibility/magnification_manager_browsertest.cc",
+        "../browser/chromeos/accessibility/speech_monitor.cc",
+        "../browser/chromeos/accessibility/speech_monitor.h",
+        "../browser/chromeos/accessibility/touch_exploration_controller_browsertest.cc",
+        "../browser/chromeos/app_mode/kiosk_app_manager_browsertest.cc",
+        "../browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc",
+        "../browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc",
+        "../browser/chromeos/arc/arc_auth_service_browsertest.cc",
+        "../browser/chromeos/attestation/attestation_policy_browsertest.cc",
+        "../browser/chromeos/customization/customization_document_browsertest.cc",
+        "../browser/chromeos/customization/customization_wallpaper_downloader_browsertest.cc",
+        "../browser/chromeos/device/input_service_proxy_browsertest.cc",
+        "../browser/chromeos/device/input_service_test_helper.cc",
+        "../browser/chromeos/device/input_service_test_helper.h",
+        "../browser/chromeos/display/quirks_browsertest.cc",
+        "../browser/chromeos/drive/drive_integration_service_browsertest.cc",
+        "../browser/chromeos/extensions/accessibility_features_apitest.cc",
+        "../browser/chromeos/extensions/echo_private_apitest.cc",
+        "../browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc",
+        "../browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc",
+        "../browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc",
+        "../browser/chromeos/extensions/info_private_apitest.cc",
+        "../browser/chromeos/extensions/input_method_apitest_chromeos.cc",
+        "../browser/chromeos/extensions/users_private/users_private_apitest.cc",
+        "../browser/chromeos/extensions/virtual_keyboard_browsertest.cc",
+        "../browser/chromeos/extensions/virtual_keyboard_browsertest.h",
+        "../browser/chromeos/extensions/wallpaper_apitest.cc",
+        "../browser/chromeos/extensions/wallpaper_manager_browsertest.cc",
+        "../browser/chromeos/extensions/wallpaper_private_apitest.cc",
+        "../browser/chromeos/file_manager/audio_player_browsertest.cc",
+        "../browser/chromeos/file_manager/external_filesystem_apitest.cc",
+        "../browser/chromeos/file_manager/file_manager_browsertest.cc",
+        "../browser/chromeos/file_manager/file_manager_browsertest_base.cc",
+        "../browser/chromeos/file_manager/file_manager_browsertest_base.h",
+        "../browser/chromeos/file_manager/file_manager_jstest.cc",
+        "../browser/chromeos/file_manager/file_manager_jstest_base.cc",
+        "../browser/chromeos/file_manager/file_manager_jstest_base.h",
+        "../browser/chromeos/file_manager/gallery_browsertest.cc",
+        "../browser/chromeos/file_manager/gallery_jstest.cc",
+        "../browser/chromeos/file_manager/image_loader_jstest.cc",
+        "../browser/chromeos/file_manager/mount_test_util.cc",
+        "../browser/chromeos/file_manager/mount_test_util.h",
+        "../browser/chromeos/file_manager/video_player_browsertest.cc",
+        "../browser/chromeos/file_manager/zip_file_creator_browsertest.cc",
+        "../browser/chromeos/first_run/chromeos_first_run_browsertest.cc",
+        "../browser/chromeos/first_run/drive_first_run_browsertest.cc",
+        "../browser/chromeos/first_run/goodies_displayer_browsertest.cc",
+        "../browser/chromeos/input_method/input_method_engine_browsertests.cc",
+        "../browser/chromeos/input_method/mode_indicator_browsertest.cc",
+        "../browser/chromeos/login/bluetooth_host_pairing_browsertest.cc",
+        "../browser/chromeos/login/crash_restore_browsertest.cc",
+        "../browser/chromeos/login/demo_mode/demo_app_launcher_browsertest.cc",
+        "../browser/chromeos/login/easy_unlock/bootstrap_browsertest.cc",
+        "../browser/chromeos/login/enable_debugging_browsertest.cc",
+        "../browser/chromeos/login/enrollment/enrollment_screen_browsertest.cc",
+        "../browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.cc",
+        "../browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h",
+        "../browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.cc",
+        "../browser/chromeos/login/enrollment/mock_auto_enrollment_check_screen.h",
+        "../browser/chromeos/login/enrollment/mock_enrollment_screen.cc",
+        "../browser/chromeos/login/enrollment/mock_enrollment_screen.h",
+        "../browser/chromeos/login/enterprise_enrollment_browsertest.cc",
+        "../browser/chromeos/login/existing_user_controller_browsertest.cc",
+        "../browser/chromeos/login/hid_detection_browsertest.cc",
+        "../browser/chromeos/login/kiosk_browsertest.cc",
+        "../browser/chromeos/login/lock/screen_locker_tester.cc",
+        "../browser/chromeos/login/lock/screen_locker_tester.h",
+        "../browser/chromeos/login/login_manager_test.cc",
+        "../browser/chromeos/login/login_manager_test.h",
+        "../browser/chromeos/login/login_screen_policy_browsertest.cc",
+        "../browser/chromeos/login/login_ui_keyboard_browsertest.cc",
+        "../browser/chromeos/login/login_utils_browsertest.cc",
+        "../browser/chromeos/login/mixin_based_browser_test.cc",
+        "../browser/chromeos/login/mixin_based_browser_test.h",
+        "../browser/chromeos/login/oobe_localization_browsertest.cc",
+
+        # TODO(nkostylev) Re-enable ResourceLoaderBrowserTest.
+        #"browser/chromeos/login/resource_loader_browsertest.cc",
+        "../browser/chromeos/login/proxy_auth_dialog_browsertest.cc",
+        "../browser/chromeos/login/reset_browsertest.cc",
+        "../browser/chromeos/login/saml/saml_browsertest.cc",
+        "../browser/chromeos/login/screens/hid_detection_screen_browsertest.cc",
+        "../browser/chromeos/login/screens/mock_base_screen_delegate.cc",
+        "../browser/chromeos/login/screens/mock_base_screen_delegate.h",
+        "../browser/chromeos/login/screens/mock_enable_debugging_screen.cc",
+        "../browser/chromeos/login/screens/mock_enable_debugging_screen.h",
+        "../browser/chromeos/login/screens/mock_error_screen.cc",
+        "../browser/chromeos/login/screens/mock_error_screen.h",
+        "../browser/chromeos/login/screens/mock_eula_screen.cc",
+        "../browser/chromeos/login/screens/mock_eula_screen.h",
+        "../browser/chromeos/login/screens/mock_network_screen.cc",
+        "../browser/chromeos/login/screens/mock_network_screen.h",
+        "../browser/chromeos/login/screens/mock_update_screen.cc",
+        "../browser/chromeos/login/screens/mock_update_screen.h",
+        "../browser/chromeos/login/screens/mock_wrong_hwid_screen.cc",
+        "../browser/chromeos/login/screens/mock_wrong_hwid_screen.h",
+        "../browser/chromeos/login/screens/network_screen_browsertest.cc",
+        "../browser/chromeos/login/screens/update_screen_browsertest.cc",
+        "../browser/chromeos/login/session_login_browsertest.cc",
+        "../browser/chromeos/login/signin/device_id_browsertest.cc",
+        "../browser/chromeos/login/signin/oauth2_browsertest.cc",
+        "../browser/chromeos/login/supervised/supervised_user_creation_browsertest.cc",
+        "../browser/chromeos/login/supervised/supervised_user_password_browsertest.cc",
+        "../browser/chromeos/login/supervised/supervised_user_test_base.cc",
+        "../browser/chromeos/login/supervised/supervised_user_test_base.h",
+        "../browser/chromeos/login/test/app_window_waiter.cc",
+        "../browser/chromeos/login/test/app_window_waiter.h",
+        "../browser/chromeos/login/test/https_forwarder.cc",
+        "../browser/chromeos/login/test/https_forwarder.h",
+        "../browser/chromeos/login/test/oobe_base_test.cc",
+        "../browser/chromeos/login/test/oobe_base_test.h",
+        "../browser/chromeos/login/test/wizard_in_process_browser_test.cc",
+        "../browser/chromeos/login/test/wizard_in_process_browser_test.h",
+        "../browser/chromeos/login/ui/captive_portal_window_browsertest.cc",
+        "../browser/chromeos/login/ui/login_feedback_browsertest.cc",
+        "../browser/chromeos/login/ui/login_web_dialog_browsertest.cc",
+        "../browser/chromeos/login/ui/simple_web_view_dialog_browsertest.cc",
+        "../browser/chromeos/login/ui/user_adding_screen_browsertest.cc",
+        "../browser/chromeos/login/users/avatar/user_image_manager_browsertest.cc",
+        "../browser/chromeos/login/users/avatar/user_image_manager_test_util.cc",
+        "../browser/chromeos/login/users/avatar/user_image_manager_test_util.h",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_policy_browsertest.cc",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.cc",
+        "../browser/chromeos/login/users/wallpaper/wallpaper_manager_test_utils.h",
+        "../browser/chromeos/login/webview_login_browsertest.cc",
+        "../browser/chromeos/login/wizard_controller_browsertest.cc",
+        "../browser/chromeos/net/network_portal_detector_impl_browsertest.cc",
+        "../browser/chromeos/ownership/fake_owner_settings_service.cc",
+        "../browser/chromeos/ownership/fake_owner_settings_service.h",
+        "../browser/chromeos/policy/affiliation_test_helper.cc",
+        "../browser/chromeos/policy/affiliation_test_helper.h",
+        "../browser/chromeos/policy/blocking_login_browsertest.cc",
+        "../browser/chromeos/policy/device_cloud_policy_browsertest.cc",
+        "../browser/chromeos/policy/device_local_account_browsertest.cc",
+        "../browser/chromeos/policy/device_policy_cros_browser_test.cc",
+        "../browser/chromeos/policy/device_policy_cros_browser_test.h",
+        "../browser/chromeos/policy/device_quirks_policy_browsertest.cc",
+        "../browser/chromeos/policy/device_status_collector_browsertest.cc",
+        "../browser/chromeos/policy/device_system_use_24hour_clock_browsertest.cc",
+        "../browser/chromeos/policy/display_rotation_default_handler_browsertest.cc",
+        "../browser/chromeos/policy/force_maximize_on_first_run_chromeos_browsertest.cc",
+        "../browser/chromeos/policy/login_policy_test_base.cc",
+        "../browser/chromeos/policy/login_policy_test_base.h",
+        "../browser/chromeos/policy/login_screen_default_policy_browsertest.cc",
+        "../browser/chromeos/policy/policy_cert_verifier_browsertest.cc",
+        "../browser/chromeos/policy/power_policy_browsertest.cc",
+        "../browser/chromeos/policy/restore_on_startup_browsertest_chromeos.cc",
+        "../browser/chromeos/policy/user_affiliation_browsertest.cc",
+        "../browser/chromeos/policy/user_cloud_external_data_manager_browsertest.cc",
+        "../browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc",
+        "../browser/chromeos/policy/user_policy_test_helper.cc",
+        "../browser/chromeos/policy/user_policy_test_helper.h",
+        "../browser/chromeos/policy/variations_service_policy_browsertest.cc",
+        "../browser/chromeos/power/peripheral_battery_observer_browsertest.cc",
+        "../browser/chromeos/preferences_chromeos_browsertest.cc",
+        "../browser/chromeos/profiles/profile_helper_browsertest.cc",
+        "../browser/chromeos/settings/scoped_cros_settings_test_helper.cc",
+        "../browser/chromeos/settings/scoped_cros_settings_test_helper.h",
+        "../browser/chromeos/shutdown_policy_browsertest.cc",
+        "../browser/chromeos/system/device_disabling_browsertest.cc",
+        "../browser/chromeos/system/tray_accessibility_browsertest.cc",
+        "../browser/download/notification/download_notification_browsertest.cc",
+        "../browser/drive/drive_notification_manager_factory_browsertest.cc",
+        "../browser/extensions/api/certificate_provider/certificate_provider_apitest.cc",
+        "../browser/extensions/api/vpn_provider/vpn_provider_apitest.cc",
+        "../browser/ui/ash/launcher/arc_app_launcher_browsertest.cc",
+        "../browser/ui/webui/options/chromeos/accounts_options_browsertest.cc",
+        "../browser/ui/webui/options/chromeos/guest_mode_options_browsertest.cc",
+        "../browser/ui/webui/options/chromeos/guest_mode_options_ui_browsertest.cc",
+        "../browser/ui/webui/options/chromeos/shared_options_browsertest.cc",
+        "//ui/base/ime/chromeos/input_method_whitelist.cc",
+        "//ui/base/ime/chromeos/input_method_whitelist.h",
+      ]
       sources -= [
         "../../apps/load_and_launch_browsertest.cc",
         "../browser/policy/policy_startup_browsertest.cc",
@@ -1236,16 +2320,21 @@
       }
     }
     if (enable_web_speech) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_speech_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/speech/extension_api/tts_extension_apitest.cc",
+        "../browser/speech/speech_recognition_browsertest.cc",
+      ]
     }
     if (safe_browsing_mode == 1) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_full_safe_browsing_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/safe_browsing/permission_reporter_browsertest.cc",
+        "../browser/safe_browsing/safe_browsing_blocking_page_test.cc",
+        "../browser/safe_browsing/safe_browsing_service_browsertest.cc",
+        "../renderer/safe_browsing/phishing_classifier_browsertest.cc",
+        "../renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc",
+        "../renderer/safe_browsing/phishing_dom_feature_extractor_browsertest.cc",
+        "../renderer/safe_browsing/threat_dom_details_browsertest.cc",
+      ]
     }
     if (enable_captive_portal_detection) {
       sources += [ "../browser/captive_portal/captive_portal_browsertest.cc" ]
@@ -1332,10 +2421,11 @@
         # "//components/crash/content/app:breakpad_stubs",
         "//third_party/ocmock",
       ]
-      sources +=
-          rebase_path(chrome_tests_gypi_values.chrome_browser_tests_mac_sources,
-                      ".",
-                      "//chrome")
+      sources += [
+        "../browser/renderer_host/chrome_render_widget_host_view_mac_history_swiper_browsertest.mm",
+        "../browser/spellchecker/spellcheck_message_filter_platform_mac_browsertest.cc",
+        "../browser/ui/cocoa/certificate_viewer_mac_browsertest.mm",
+      ]
       sources -= [
         # TODO(groby): This test depends on hunspell and we cannot run it on
         # Mac, which does not use hunspell by default.
@@ -1368,16 +2458,36 @@
       ]
 
       # The browser window can be views or Cocoa on Mac. Test accordingly.
-      if (mac_views_browser) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_browser_tests_views_non_mac_sources,
-                ".",
-                "//chrome")
-      } else {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_browser_tests_cocoa_sources,
-                ".",
-                "//chrome")
+      if (!mac_views_browser) {
+        sources += [
+          "../browser/ui/cocoa/accelerators_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/applescript/browsercrapplication+applescript_test.mm",
+          "../browser/ui/cocoa/applescript/window_applescript_test.mm",
+          "../browser/ui/cocoa/apps/app_shim_menu_controller_mac_browsertest.mm",
+          "../browser/ui/cocoa/apps/native_app_window_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/browser_window_controller_browsertest.mm",
+          "../browser/ui/cocoa/constrained_window/constrained_window_mac_browsertest.mm",
+          "../browser/ui/cocoa/content_settings/collected_cookies_mac_browsertest.mm",
+          "../browser/ui/cocoa/content_settings/content_setting_bubble_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/dev_tools_controller_browsertest.mm",
+          "../browser/ui/cocoa/extensions/extension_install_dialog_controller_browsertest.mm",
+          "../browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h",
+          "../browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm",
+          "../browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm",
+          "../browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/extensions/windowed_install_dialog_controller_browsertest.mm",
+          "../browser/ui/cocoa/find_bar/find_bar_browsertest.mm",
+          "../browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm",
+          "../browser/ui/cocoa/omnibox/omnibox_view_mac_browsertest.mm",
+          "../browser/ui/cocoa/passwords/passwords_bubble_browsertest.mm",
+          "../browser/ui/cocoa/profiles/profile_signin_confirmation_view_controller_browsertest.mm",
+          "../browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac_browsertest.mm",
+          "../browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm",
+          "../browser/ui/cocoa/task_manager_mac_browsertest.mm",
+          "../browser/ui/cocoa/view_id_util_browsertest.mm",
+          "../browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac_browsertest.mm",
+          "../browser/ui/cocoa/website_settings/permission_bubble_cocoa_browser_test.mm",
+        ]
       }
     }
     if (is_mac || is_win) {
@@ -1390,10 +2500,11 @@
       deps += [ "//components/wifi:test_support" ]
     }
     if (is_linux || is_win) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_non_mac_desktop_sources,
-              ".",
-              "//chrome")
+      sources += [
+        # This test is for the spelling options submenu that's only for Windows,
+        # ChromeOS, and Linux.
+        "../browser/renderer_context_menu/spelling_options_submenu_observer_browsertest.cc",
+      ]
     }
     if (!is_posix || is_chromeos) {
       sources -= [ "../common/time_format_browsertest.cc" ]
@@ -1405,16 +2516,23 @@
       ]
     }
     if (is_mac || is_win || (is_linux && !is_chromeos)) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_non_mobile_non_cros_sources,
-              ".",
-              "//chrome")
+      sources += [
+        # Tests for non mobile and non CrOS (includes Linux, Win, Mac).
+        "../browser/metrics/desktop_engagement/audible_contents_tracker_browsertest.cc",
+        "../browser/metrics/desktop_engagement/chrome_visibility_observer_browsertest.cc",
+        "../browser/profiles/profile_statistics_browsertest.cc",
+      ]
     }
     if (enable_app_list) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_app_list_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/apps/drive/drive_app_converter_browsertest.cc",
+        "../browser/apps/drive/drive_app_provider_browsertest.cc",
+        "../browser/ui/app_list/app_list_controller_browsertest.cc",
+        "../browser/ui/app_list/app_list_service_impl_browsertest.cc",
+        "../browser/ui/app_list/app_list_service_views_browsertest.cc",
+        "../browser/ui/app_list/search/webstore/webstore_provider_browsertest.cc",
+        "../browser/ui/app_list/speech_recognizer_browsertest.cc",
+      ]
       if (is_mac) {
         # This assumes the AppList is views-based, but Mac only links
         # browser parts for the Cocoa implementation.
@@ -1423,16 +2541,14 @@
       }
     }
     if (enable_service_discovery) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_service_discovery_sources,
-              ".",
-              "//chrome")
+      sources += [ "../browser/extensions/api/mdns/mdns_apitest.cc" ]
     }
     if (enable_supervised_users) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_supervised_user_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "../browser/supervised_user/supervised_user_browsertest.cc",
+        "../browser/supervised_user/supervised_user_resource_throttle_browsertest.cc",
+        "../browser/supervised_user/supervised_user_service_browsertest.cc",
+      ]
     }
     if (enable_pepper_cdms) {
       # Runtime dependencies.
@@ -1485,10 +2601,30 @@
       ]
     }
     if (enable_remoting) {
-      sources += rebase_path(
-              chrome_tests_gypi_values.chrome_browser_tests_remoting_sources,
-              ".",
-              "//chrome")
+      sources += [
+        "remoting/auth_browsertest.cc",
+        "remoting/fullscreen_browsertest.cc",
+        "remoting/it2me_browsertest.cc",
+        "remoting/key_code_conv.cc",
+        "remoting/key_code_conv.h",
+        "remoting/key_code_map.h",
+        "remoting/key_code_test_map.h",
+        "remoting/launch_browsertest.cc",
+        "remoting/me2me_browsertest.cc",
+        "remoting/page_load_notification_observer.cc",
+        "remoting/page_load_notification_observer.h",
+        "remoting/pin_browsertest.cc",
+        "remoting/qunit_browser_test_runner.cc",
+        "remoting/remote_desktop_browsertest.cc",
+        "remoting/remote_desktop_browsertest.h",
+        "remoting/remote_test_helper.cc",
+        "remoting/remote_test_helper.h",
+        "remoting/scrollbar_browsertest.cc",
+        "remoting/unauthenticated_browsertest.cc",
+        "remoting/waiter.cc",
+        "remoting/waiter.h",
+        "remoting/webapp_javascript_browsertest.cc",
+      ]
       deps += [ "//remoting/webapp" ]
     }
     if (use_x11) {
@@ -1497,10 +2633,11 @@
 
     if (use_aura) {
       if (enable_wifi_display) {
-        sources += rebase_path(
-                chrome_tests_gypi_values.chrome_browser_tests_display_source_apitest,
-                ".",
-                "//chrome")
+        sources += [
+          "../../extensions/browser/api/display_source/display_source_apitestbase.cc",
+          "../../extensions/browser/api/display_source/display_source_apitestbase.h",
+          "../browser/extensions/api/display_source/display_source_wifi_display_apitest.cc",
+        ]
       }
     }
   }
@@ -1508,10 +2645,50 @@
 
 if (!is_android) {
   test("sync_integration_tests") {
-    sources =
-        rebase_path(chrome_tests_gypi_values.sync_integration_tests_sources,
-                    ".",
-                    "//chrome")
+    sources = [
+      "../app/chrome_dll.rc",
+      "../app/chrome_dll_resource.h",
+      "../app/chrome_version.rc.version",
+      "../browser/sync/test/integration/enable_disable_test.cc",
+      "../browser/sync/test/integration/migration_test.cc",
+      "../browser/sync/test/integration/single_client_app_list_sync_test.cc",
+      "../browser/sync/test/integration/single_client_apps_sync_test.cc",
+      "../browser/sync/test/integration/single_client_arc_package_sync_test.cc",
+      "../browser/sync/test/integration/single_client_bookmarks_sync_test.cc",
+      "../browser/sync/test/integration/single_client_dictionary_sync_test.cc",
+      "../browser/sync/test/integration/single_client_directory_sync_test.cc",
+      "../browser/sync/test/integration/single_client_extensions_sync_test.cc",
+      "../browser/sync/test/integration/single_client_password_manager_setting_migrator_service_sync_test.cc",
+      "../browser/sync/test/integration/single_client_passwords_sync_test.cc",
+      "../browser/sync/test/integration/single_client_preferences_sync_test.cc",
+      "../browser/sync/test/integration/single_client_search_engines_sync_test.cc",
+      "../browser/sync/test/integration/single_client_sessions_sync_test.cc",
+      "../browser/sync/test/integration/single_client_supervised_user_settings_sync_test.cc",
+      "../browser/sync/test/integration/single_client_themes_sync_test.cc",
+      "../browser/sync/test/integration/single_client_typed_urls_sync_test.cc",
+      "../browser/sync/test/integration/single_client_wallet_sync_test.cc",
+      "../browser/sync/test/integration/single_client_wifi_credentials_sync_test.cc",
+      "../browser/sync/test/integration/sync_auth_test.cc",
+      "../browser/sync/test/integration/sync_errors_test.cc",
+      "../browser/sync/test/integration/sync_exponential_backoff_test.cc",
+      "../browser/sync/test/integration/two_client_app_list_sync_test.cc",
+      "../browser/sync/test/integration/two_client_apps_sync_test.cc",
+      "../browser/sync/test/integration/two_client_arc_package_sync_test.cc",
+      "../browser/sync/test/integration/two_client_autofill_sync_test.cc",
+      "../browser/sync/test/integration/two_client_bookmarks_sync_test.cc",
+      "../browser/sync/test/integration/two_client_dictionary_sync_test.cc",
+      "../browser/sync/test/integration/two_client_extension_settings_and_app_settings_sync_test.cc",
+      "../browser/sync/test/integration/two_client_extensions_sync_test.cc",
+      "../browser/sync/test/integration/two_client_password_manager_setting_migrator_service_sync_test.cc",
+      "../browser/sync/test/integration/two_client_passwords_sync_test.cc",
+      "../browser/sync/test/integration/two_client_preferences_sync_test.cc",
+      "../browser/sync/test/integration/two_client_search_engines_sync_test.cc",
+      "../browser/sync/test/integration/two_client_sessions_sync_test.cc",
+      "../browser/sync/test/integration/two_client_themes_sync_test.cc",
+      "../browser/sync/test/integration/two_client_typed_urls_sync_test.cc",
+      "../browser/sync/test/integration/two_client_wifi_credentials_sync_test.cc",
+      "data/resource.rc",
+    ]
 
     data = [
       "//chrome/test/data/sync/",
@@ -1615,10 +2792,22 @@
   }
 
   test("sync_performance_tests") {
-    sources =
-        rebase_path(chrome_tests_gypi_values.sync_performance_tests_sources,
-                    ".",
-                    "//chrome")
+    sources = [
+      "../app/chrome_dll.rc",
+      "../app/chrome_dll_resource.h",
+      "../app/chrome_version.rc.version",
+      "../browser/sync/test/integration/performance/autofill_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/bookmarks_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/dictionary_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/extensions_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/passwords_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/sessions_sync_perf_test.cc",
+      "../browser/sync/test/integration/performance/sync_timing_helper.cc",
+      "../browser/sync/test/integration/performance/sync_timing_helper.h",
+      "../browser/sync/test/integration/performance/typed_urls_sync_perf_test.cc",
+      "base/browser_perf_tests_main.cc",
+      "data/resource.rc",
+    ]
 
     defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
 
@@ -2397,10 +3586,24 @@
 
 if (!is_android && !is_ios && !is_chromecast) {
   test("performance_browser_tests") {
-    sources =
-        rebase_path(chrome_tests_gypi_values.performance_browser_tests_sources,
-                    ".",
-                    "//chrome")
+    sources = [
+      "../app/chrome_dll.rc",
+      "../app/chrome_dll_resource.h",
+      "../app/chrome_version.rc.version",
+      "../browser/extensions/api/cast_streaming/performance_test.cc",
+      "../browser/extensions/api/tab_capture/tab_capture_performancetest.cc",
+      "../browser/extensions/browsertest_util.cc",
+      "../browser/extensions/extension_apitest.cc",
+      "../browser/extensions/extension_browsertest.cc",
+      "../browser/extensions/extension_test_notification_observer.cc",
+      "../browser/extensions/updater/extension_cache_fake.cc",
+      "../browser/extensions/updater/extension_cache_fake.h",
+      "base/browser_perf_tests_main.cc",
+      "base/chrome_render_view_test.cc",
+      "base/chrome_render_view_test.h",
+      "perf/mach_ports_performancetest.cc",
+      "perf/url_parse_perftest.cc",
+    ]
 
     defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
 
diff --git a/chrome/test/android/telemetry_tests/PRESUBMIT.py b/chrome/test/android/telemetry_tests/PRESUBMIT.py
index 54975213..ecd0546 100644
--- a/chrome/test/android/telemetry_tests/PRESUBMIT.py
+++ b/chrome/test/android/telemetry_tests/PRESUBMIT.py
@@ -20,7 +20,7 @@
       output_api,
       pylintrc='pylintrc',
       extra_paths_list=[
-          J('third_party', 'catapult', 'catapult_base'),
+          J('third_party', 'catapult', 'common', 'py_utils'),
           J('third_party', 'catapult', 'telemetry'),
           J('tools', 'perf'),
       ])
diff --git a/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py b/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py
index dd0b1046..fc41bb5 100644
--- a/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py
+++ b/chrome/test/android/telemetry_tests/browser_tests/popular_urls.py
@@ -6,7 +6,7 @@
 
 from telemetry.testing import serially_executed_browser_test_case
 
-from catapult_base import cloud_storage
+from py_utils import cloud_storage
 
 _WPR_ARCHIVE_PATH = os.path.join(os.path.dirname(__file__),
                                  'popular_urls_000.wpr')
diff --git a/chrome/test/base/browser_with_test_window_test.cc b/chrome/test/base/browser_with_test_window_test.cc
index 967d987..3ceadfb6 100644
--- a/chrome/test/base/browser_with_test_window_test.cc
+++ b/chrome/test/base/browser_with_test_window_test.cc
@@ -117,7 +117,7 @@
 void BrowserWithTestWindowTest::AddTab(Browser* browser, const GURL& url) {
   chrome::NavigateParams params(browser, url, ui::PAGE_TRANSITION_TYPED);
   params.tabstrip_index = 0;
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
   CommitPendingLoad(&params.target_contents->GetController());
 }
diff --git a/chrome/test/base/browser_with_test_window_test.h b/chrome/test/base/browser_with_test_window_test.h
index ba85e3ff..9792495 100644
--- a/chrome/test/base/browser_with_test_window_test.h
+++ b/chrome/test/base/browser_with_test_window_test.h
@@ -61,7 +61,7 @@
 //
 //   // This is equivalent to the above, and lets you test pending navigations.
 //   browser()->OpenURL(OpenURLParams(
-//       GURL("http://foo/2"), GURL(), CURRENT_TAB,
+//       GURL("http://foo/2"), GURL(), WindowOpenDisposition::CURRENT_TAB,
 //       ui::PAGE_TRANSITION_TYPED, false));
 //   CommitPendingLoad(controller);
 //
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index 2c82ab0..d08bd2f1 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -387,7 +387,7 @@
     bool check_navigation_success) {
   chrome::NavigateParams params(browser, url, transition);
   params.tabstrip_index = index;
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   chrome::Navigate(&params);
 
   if (check_navigation_success)
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc
index 10dd131f..b8181d4d 100644
--- a/chrome/test/base/test_browser_window.cc
+++ b/chrome/test/base/test_browser_window.cc
@@ -34,7 +34,7 @@
 
 WindowOpenDisposition
     TestBrowserWindow::TestLocationBar::GetWindowOpenDisposition() const {
-  return CURRENT_TAB;
+  return WindowOpenDisposition::CURRENT_TAB;
 }
 
 ui::PageTransition
@@ -170,7 +170,7 @@
 
 WindowOpenDisposition TestBrowserWindow::GetDispositionForPopupBounds(
     const gfx::Rect& bounds) {
-  return NEW_POPUP;
+  return WindowOpenDisposition::NEW_POPUP;
 }
 
 FindBar* TestBrowserWindow::CreateFindBar() {
diff --git a/chrome/test/base/tracing_browsertest.cc b/chrome/test/base/tracing_browsertest.cc
index a1fcaccd..acaa70d 100644
--- a/chrome/test/base/tracing_browsertest.cc
+++ b/chrome/test/base/tracing_browsertest.cc
@@ -50,7 +50,7 @@
       const base::trace_event::TraceConfig& trace_config) {
     GURL url1("about:blank");
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url1, NEW_FOREGROUND_TAB,
+        browser(), url1, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
 
@@ -62,7 +62,7 @@
     // Create and destroy renderers while tracing is enabled.
     GURL url2("chrome://credits");
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url2, NEW_FOREGROUND_TAB,
+        browser(), url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
 
@@ -71,7 +71,7 @@
 
     GURL url3("chrome://settings");
     ui_test_utils::NavigateToURLWithDisposition(
-        browser(), url3, CURRENT_TAB,
+        browser(), url3, WindowOpenDisposition::CURRENT_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
     ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
 
@@ -142,11 +142,13 @@
                                     "OnJavaScriptExecuteRequestForTests", 2));
   // Open two tabs to different URLs to encourage two separate renderer
   // processes. Each will fire an event that will be counted towards the total.
-  ui_test_utils::NavigateToURLWithDisposition(browser(), url1,
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url1, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
-  ui_test_utils::NavigateToURLWithDisposition(browser(), url2,
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser(), url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   ASSERT_NO_FATAL_FAILURE(ExecuteJavascriptOnCurrentTab());
   EXPECT_TRUE(WaitForWatchEvent(no_timeout));
   ASSERT_TRUE(EndTracing(&json_events));
diff --git a/chrome/test/base/ui_test_utils.cc b/chrome/test/base/ui_test_utils.cc
index b3f7143..2be097e 100644
--- a/chrome/test/base/ui_test_utils.cc
+++ b/chrome/test/base/ui_test_utils.cc
@@ -166,7 +166,7 @@
 }
 
 void NavigateToURL(Browser* browser, const GURL& url) {
-  NavigateToURLWithDisposition(browser, url, CURRENT_TAB,
+  NavigateToURLWithDisposition(browser, url, WindowOpenDisposition::CURRENT_TAB,
                                BROWSER_TEST_WAIT_FOR_NAVIGATION);
 }
 
@@ -177,8 +177,9 @@
     WindowOpenDisposition disposition,
     int browser_test_flags) {
   TabStripModel* tab_strip = browser->tab_strip_model();
-  if (disposition == CURRENT_TAB && tab_strip->GetActiveWebContents())
-      content::WaitForLoadStop(tab_strip->GetActiveWebContents());
+  if (disposition == WindowOpenDisposition::CURRENT_TAB &&
+      tab_strip->GetActiveWebContents())
+    content::WaitForLoadStop(tab_strip->GetActiveWebContents());
   content::TestNavigationObserver same_tab_observer(
       tab_strip->GetActiveWebContents(),
       number_of_navigations);
@@ -202,7 +203,7 @@
     return;
   }
   WebContents* web_contents = NULL;
-  if (disposition == NEW_BACKGROUND_TAB) {
+  if (disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB) {
     // We've opened up a new tab, but not selected it.
     TabStripModel* tab_strip = browser->tab_strip_model();
     web_contents = tab_strip->GetWebContentsAt(tab_strip->active_index() + 1);
@@ -211,13 +212,13 @@
         << "\" because the new tab is not available yet";
     if (!web_contents)
       return;
-  } else if ((disposition == CURRENT_TAB) ||
-      (disposition == NEW_FOREGROUND_TAB) ||
-      (disposition == SINGLETON_TAB)) {
+  } else if ((disposition == WindowOpenDisposition::CURRENT_TAB) ||
+             (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB) ||
+             (disposition == WindowOpenDisposition::SINGLETON_TAB)) {
     // The currently selected tab is the right one.
     web_contents = browser->tab_strip_model()->GetActiveWebContents();
   }
-  if (disposition == CURRENT_TAB) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
     same_tab_observer.Wait();
     return;
   } else if (web_contents) {
@@ -247,10 +248,7 @@
                                                 const GURL& url,
                                                 int number_of_navigations) {
   NavigateToURLWithDispositionBlockUntilNavigationsComplete(
-      browser,
-      url,
-      number_of_navigations,
-      CURRENT_TAB,
+      browser, url, number_of_navigations, WindowOpenDisposition::CURRENT_TAB,
       BROWSER_TEST_WAIT_FOR_NAVIGATION);
 }
 
diff --git a/chrome/test/base/web_ui_browser_test.cc b/chrome/test/base/web_ui_browser_test.cc
index c0135cf..d699330 100644
--- a/chrome/test/base/web_ui_browser_test.cc
+++ b/chrome/test/base/web_ui_browser_test.cc
@@ -221,7 +221,7 @@
   content::TestNavigationObserver navigation_observer(web_contents);
   chrome::NavigateParams params(
       browser(), GURL(browse_to), ui::PAGE_TRANSITION_TYPED);
-  params.disposition = CURRENT_TAB;
+  params.disposition = WindowOpenDisposition::CURRENT_TAB;
 
   // This is needed to make the test
   // MaterialHistoryBrowserTest.HistoryToolbarFocusTest pass on macOS. The test
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index f7fd852..b4d6936f 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -1219,7 +1219,6 @@
 
   def testCanSwitchToPrintPreviewDialog(self):
     old_handles = self._driver.GetWindowHandles()
-    self.assertEquals(1, len(old_handles))
     self._driver.ExecuteScript('setTimeout(function(){window.print();}, 0);')
     new_window_handle = self.WaitForNewWindow(self._driver, old_handles)
     self.assertNotEqual(None, new_window_handle)
@@ -1651,9 +1650,9 @@
     app_path = os.path.join(_TEST_DATA_DIR, 'test_app')
     driver = self.CreateDriver(chrome_switches=['load-extension=%s' % app_path])
     old_handles = driver.GetWindowHandles()
-    self.assertEqual(1, len(old_handles))
     driver.LaunchApp('gegjcdcfeiojglhifpmibkadodekakpc')
-    new_window_handle = self.WaitForNewWindow(driver, old_handles)
+    new_window_handle = self.WaitForNewWindow(
+        driver, old_handles, check_closed_windows=False)
     driver.SwitchToWindow(new_window_handle)
     body_element = driver.FindElement('tag name', 'body')
     self.assertEqual('It works!', body_element.GetText())
diff --git a/chrome/test/gpu/webgl_infobar_browsertest.cc b/chrome/test/gpu/webgl_infobar_browsertest.cc
index a99475c..038aa5c 100644
--- a/chrome/test/gpu/webgl_infobar_browsertest.cc
+++ b/chrome/test/gpu/webgl_infobar_browsertest.cc
@@ -45,7 +45,7 @@
       ui::PageTransitionFromInt(
           ui::PAGE_TRANSITION_TYPED |
           ui::PAGE_TRANSITION_FROM_ADDRESS_BAR));
-  params.disposition = NEW_BACKGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   chrome::Navigate(&params);
 }
 
diff --git a/chrome/test/media_router/media_router_integration_browsertest.cc b/chrome/test/media_router/media_router_integration_browsertest.cc
index e35d4ef..f9e5640c 100644
--- a/chrome/test/media_router/media_router_integration_browsertest.cc
+++ b/chrome/test/media_router/media_router_integration_browsertest.cc
@@ -152,7 +152,8 @@
     base::FilePath::StringPieceType file_name) {
   base::FilePath full_path = GetResourceFile(file_name);
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(), net::FilePathToFileURL(full_path), NEW_FOREGROUND_TAB,
+      browser(), net::FilePathToFileURL(full_path),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
 }
 
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index 812e32422..d01ff08 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -1022,7 +1022,7 @@
   // Make a second tab in the foreground.
   GURL url = GetTestFileUrl("View_CreatedInvisible");
   chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_BACKGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_BACKGROUND_TAB;
   ui_test_utils::NavigateToURL(&params);
 }
 
@@ -1045,7 +1045,7 @@
   // next phase of the test.
   chrome::NavigateParams params(
       browser(), GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_LINK);
-  params.disposition = NEW_FOREGROUND_TAB;
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
   ui_test_utils::NavigateToURL(&params);
 
   // Wait until the test acks that it got hidden.
@@ -1262,9 +1262,9 @@
     const extensions::Extension* extension = LoadExtension(app_dir);
     ASSERT_TRUE(extension);
 
-    AppLaunchParams params(browser()->profile(), extension,
-                           extensions::LAUNCH_CONTAINER_NONE, NEW_WINDOW,
-                           extensions::SOURCE_TEST);
+    AppLaunchParams params(
+        browser()->profile(), extension, extensions::LAUNCH_CONTAINER_NONE,
+        WindowOpenDisposition::NEW_WINDOW, extensions::SOURCE_TEST);
     params.command_line = *base::CommandLine::ForCurrentProcess();
     OpenApplication(params);
   }
diff --git a/chrome/test/remoting/it2me_browsertest.cc b/chrome/test/remoting/it2me_browsertest.cc
index 0c35eae..6a9123a 100644
--- a/chrome/test/remoting/it2me_browsertest.cc
+++ b/chrome/test/remoting/it2me_browsertest.cc
@@ -26,7 +26,7 @@
 
 content::WebContents* It2MeBrowserTest::SetUpHelperInstance() {
   content::WebContents* helper_content =
-      LaunchChromotingApp(false, NEW_FOREGROUND_TAB);
+      LaunchChromotingApp(false, WindowOpenDisposition::NEW_FOREGROUND_TAB);
   LoadBrowserTestJavaScript(helper_content);
   LoadScript(helper_content, FILE_PATH_LITERAL("it2me_browser_test.js"));
   return helper_content;
diff --git a/chrome/test/remoting/remote_desktop_browsertest.cc b/chrome/test/remoting/remote_desktop_browsertest.cc
index c0609a65..46021ee 100644
--- a/chrome/test/remoting/remote_desktop_browsertest.cc
+++ b/chrome/test/remoting/remote_desktop_browsertest.cc
@@ -77,9 +77,9 @@
 void RemoteDesktopBrowserTest::OpenClientBrowserPage() {
   // Open the client browser page in a new tab
   ui_test_utils::NavigateToURLWithDisposition(
-      browser(),
-      GURL(http_server() + "/client.html"),
-      NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
+      browser(), GURL(http_server() + "/client.html"),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
 
   // Save this web content for later reference
   client_web_content_ = browser()->tab_strip_model()->GetActiveWebContents();
@@ -195,7 +195,7 @@
       defer_start);
 
   if (is_platform_app()) {
-    window_open_disposition = NEW_WINDOW;
+    window_open_disposition = WindowOpenDisposition::NEW_WINDOW;
   }
 
   OpenApplication(AppLaunchParams(browser()->profile(), extension_,
@@ -237,7 +237,7 @@
 
 content::WebContents* RemoteDesktopBrowserTest::LaunchChromotingApp(
     bool defer_start) {
-  return LaunchChromotingApp(defer_start, CURRENT_TAB);
+  return LaunchChromotingApp(defer_start, WindowOpenDisposition::CURRENT_TAB);
 }
 
 void RemoteDesktopBrowserTest::StartChromotingApp() {
diff --git a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
index 4343a1f..020d5e0 100644
--- a/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
+++ b/components/autofill/core/browser/autofill_save_card_infobar_delegate_mobile.cc
@@ -54,7 +54,7 @@
 
 void AutofillSaveCardInfoBarDelegateMobile::OnLegalMessageLinkClicked(
     GURL url) {
-  infobar()->owner()->OpenURL(url, NEW_FOREGROUND_TAB);
+  infobar()->owner()->OpenURL(url, WindowOpenDisposition::NEW_FOREGROUND_TAB);
 }
 
 int AutofillSaveCardInfoBarDelegateMobile::GetIconId() const {
diff --git a/components/content_settings/core/browser/content_settings_registry_unittest.cc b/components/content_settings/core/browser/content_settings_registry_unittest.cc
index 7b8d662..bf595c44 100644
--- a/components/content_settings/core/browser/content_settings_registry_unittest.cc
+++ b/components/content_settings/core/browser/content_settings_registry_unittest.cc
@@ -86,7 +86,7 @@
   ASSERT_TRUE(
       website_settings_info->initial_default_value()->GetAsInteger(&setting));
   EXPECT_EQ(CONTENT_SETTING_ALLOW, setting);
-#if defined(OS_IOS)
+#if defined(OS_ANDROID) || defined(OS_IOS)
   EXPECT_EQ(PrefRegistry::NO_REGISTRATION_FLAGS,
             website_settings_info->GetPrefRegistrationFlags());
 #else
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc
index 62ec02a..fa0123ff 100644
--- a/components/content_settings/core/browser/website_settings_registry.cc
+++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -77,13 +77,16 @@
 #elif defined(OS_ANDROID)
   if (!(platform & PLATFORM_ANDROID))
     return nullptr;
+  // Don't sync settings to mobile platforms. The UI is different to desktop and
+  // doesn't allow the settings to be managed in the same way. See
+  // crbug.com/642184.
+  sync_status = WebsiteSettingsInfo::UNSYNCABLE;
 #elif defined(OS_IOS)
   if (!(platform & PLATFORM_IOS))
     return nullptr;
-  // Only default settings for Cookies and Popups are used in iOS. Exceptions
-  // and all the other content setting types are not used in iOS currently. So
-  // make content settings unsyncable on iOS for now.
-  // TODO(lshang): address this once we have proper content settings on iOS.
+  // Don't sync settings to mobile platforms. The UI is different to desktop and
+  // doesn't allow the settings to be managed in the same way. See
+  // crbug.com/642184.
   sync_status = WebsiteSettingsInfo::UNSYNCABLE;
 #else
 #error "Unsupported platform"
diff --git a/components/content_settings/core/browser/website_settings_registry_unittest.cc b/components/content_settings/core/browser/website_settings_registry_unittest.cc
index 4d0c96f..aeb0a80 100644
--- a/components/content_settings/core/browser/website_settings_registry_unittest.cc
+++ b/components/content_settings/core/browser/website_settings_registry_unittest.cc
@@ -102,7 +102,7 @@
   int setting;
   ASSERT_TRUE(info->initial_default_value()->GetAsInteger(&setting));
   EXPECT_EQ(999, setting);
-#if defined(OS_IOS)
+#if defined(OS_ANDROID) || defined(OS_IOS)
   EXPECT_EQ(PrefRegistry::LOSSY_PREF, info->GetPrefRegistrationFlags());
 #else
   EXPECT_EQ(PrefRegistry::LOSSY_PREF |
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
index 9aaf35f3..74327d5 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java
@@ -63,6 +63,8 @@
         UrlRequest urlRequest = builder.build();
         urlRequest.start();
         callback.blockForDone();
+        // Wait for all posted tasks to be executed to ensure there is no unhandled exception.
+        callback.shutdownExecutorAndWait();
         assertTrue(urlRequest.isDone());
         return callback;
     }
@@ -627,7 +629,7 @@
         assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCode());
         assertEquals(0, callback.mRedirectCount);
         assertTrue(callback.mOnErrorCalled);
-        assertEquals(callback.mResponseStep, ResponseStep.NOTHING);
+        assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
     }
 
     @SmallTest
@@ -644,7 +646,7 @@
         assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCode());
         assertEquals(0, callback.mRedirectCount);
         assertTrue(callback.mOnErrorCalled);
-        assertEquals(callback.mResponseStep, ResponseStep.ON_RESPONSE_STARTED);
+        assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
     }
 
     @SmallTest
@@ -661,7 +663,7 @@
         assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCode());
         assertEquals(0, callback.mRedirectCount);
         assertTrue(callback.mOnErrorCalled);
-        assertEquals(callback.mResponseStep, ResponseStep.ON_RESPONSE_STARTED);
+        assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
     }
 
     /**
@@ -696,7 +698,7 @@
         assertEquals(-201, callback.mError.getCronetInternalErrorCode());
         assertEquals("Exception in CronetUrlRequest: net::ERR_CERT_DATE_INVALID",
                 callback.mError.getMessage());
-        assertEquals(callback.mResponseStep, ResponseStep.NOTHING);
+        assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
     }
 
     /**
@@ -1571,8 +1573,14 @@
         UrlRequest urlRequest = builder.build();
         urlRequest.start();
         callback.blockForDone();
+        // Wait for all posted tasks to be executed to ensure there is no unhandled exception.
+        callback.shutdownExecutorAndWait();
         assertEquals(1, callback.mRedirectCount);
-        assertEquals(callback.mResponseStep, failureStep);
+        if (failureType == FailureType.CANCEL_SYNC || failureType == FailureType.CANCEL_ASYNC) {
+            assertEquals(ResponseStep.ON_CANCELED, callback.mResponseStep);
+        } else if (failureType == FailureType.THROW_SYNC) {
+            assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
+        }
         assertTrue(urlRequest.isDone());
         assertEquals(expectResponseInfo, callback.mResponseInfo != null);
         assertEquals(expectError, callback.mError != null);
@@ -1616,20 +1624,83 @@
 
     @SmallTest
     @Feature({"Cronet"})
-    public void testThrowON_SUCCEEDED() {
-        TestUrlRequestCallback callback = new TestUrlRequestCallback();
-        callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_SUCCEEDED);
-        UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getRedirectURL(),
-                callback, callback.getExecutor(), mTestFramework.mCronetEngine);
-        UrlRequest urlRequest = builder.build();
-        urlRequest.start();
-        callback.blockForDone();
-        assertEquals(1, callback.mRedirectCount);
-        assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED);
-        assertTrue(urlRequest.isDone());
-        assertNotNull(callback.mResponseInfo);
-        assertNull(callback.mError);
-        assertFalse(callback.mOnErrorCalled);
+    public void testThrowOrCancelInOnSucceeded() {
+        FailureType[] testTypes = new FailureType[] {
+                FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CANCEL_ASYNC};
+        for (FailureType type : testTypes) {
+            TestUrlRequestCallback callback = new TestUrlRequestCallback();
+            callback.setFailure(type, ResponseStep.ON_SUCCEEDED);
+            UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getEchoMethodURL(),
+                    callback, callback.getExecutor(), mTestFramework.mCronetEngine);
+            UrlRequest urlRequest = builder.build();
+            urlRequest.start();
+            callback.blockForDone();
+            // Wait for all posted tasks to be executed to ensure there is no unhandled exception.
+            callback.shutdownExecutorAndWait();
+            assertNull(callback.mError);
+            assertEquals(ResponseStep.ON_SUCCEEDED, callback.mResponseStep);
+            assertTrue(urlRequest.isDone());
+            assertNotNull(callback.mResponseInfo);
+            assertFalse(callback.mOnErrorCalled);
+            assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
+            assertEquals("GET", callback.mResponseAsString);
+        }
+    }
+
+    @SmallTest
+    @Feature({"Cronet"})
+    public void testThrowOrCancelInOnFailed() {
+        FailureType[] testTypes = new FailureType[] {
+                FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CANCEL_ASYNC};
+        for (FailureType type : testTypes) {
+            String url = NativeTestServer.getEchoBodyURL();
+            // Shut down NativeTestServer so request will fail.
+            NativeTestServer.shutdownNativeTestServer();
+            TestUrlRequestCallback callback = new TestUrlRequestCallback();
+            callback.setFailure(type, ResponseStep.ON_FAILED);
+            UrlRequest.Builder builder = new UrlRequest.Builder(
+                    url, callback, callback.getExecutor(), mTestFramework.mCronetEngine);
+            UrlRequest urlRequest = builder.build();
+            urlRequest.start();
+            callback.blockForDone();
+            // Wait for all posted tasks to be executed to ensure there is no unhandled exception.
+            callback.shutdownExecutorAndWait();
+            assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
+            assertTrue(callback.mOnErrorCalled);
+            assertNotNull(callback.mError);
+            assertTrue(urlRequest.isDone());
+            // Start NativeTestServer again to run the test for a second time.
+            assertTrue(NativeTestServer.startNativeTestServer(getContext()));
+        }
+    }
+
+    @SmallTest
+    @Feature({"Cronet"})
+    public void testThrowOrCancelInOnCanceled() {
+        FailureType[] testTypes = new FailureType[] {
+                FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CANCEL_ASYNC};
+        for (FailureType type : testTypes) {
+            TestUrlRequestCallback callback = new TestUrlRequestCallback() {
+                @Override
+                public void onResponseStarted(UrlRequest request, UrlResponseInfo info) {
+                    super.onResponseStarted(request, info);
+                    request.cancel();
+                }
+            };
+            callback.setFailure(type, ResponseStep.ON_CANCELED);
+            UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.getEchoBodyURL(),
+                    callback, callback.getExecutor(), mTestFramework.mCronetEngine);
+            UrlRequest urlRequest = builder.build();
+            urlRequest.start();
+            callback.blockForDone();
+            // Wait for all posted tasks to be executed to ensure there is no unhandled exception.
+            callback.shutdownExecutorAndWait();
+            assertEquals(ResponseStep.ON_CANCELED, callback.mResponseStep);
+            assertTrue(urlRequest.isDone());
+            assertNotNull(callback.mResponseInfo);
+            assertNull(callback.mError);
+            assertTrue(callback.mOnCanceledCalled);
+        }
     }
 
     @SmallTest
@@ -1837,7 +1908,7 @@
                 "Exception in CronetUrlRequest: net::ERR_" + name, callback.mError.getMessage());
         assertEquals(0, callback.mRedirectCount);
         assertTrue(callback.mOnErrorCalled);
-        assertEquals(callback.mResponseStep, ResponseStep.NOTHING);
+        assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
     }
 
     // Returns the contents of byteBuffer, from its position() to its limit(),
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
index da46d1b..11e85fa 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
@@ -19,6 +19,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Callback that tracks information from different callbacks and and has a
@@ -45,6 +46,8 @@
     // When false, the consumer is responsible for all calls into the request
     // that advance it.
     private boolean mAutoAdvance = true;
+    // Whether an exception is thrown by maybeThrowCancelOrPause().
+    private boolean mListenerExceptionThrown;
 
     // Conditionally fail on certain steps.
     private FailureType mFailureType = FailureType.NONE;
@@ -91,7 +94,9 @@
         ON_RECEIVED_REDIRECT,
         ON_RESPONSE_STARTED,
         ON_READ_COMPLETED,
-        ON_SUCCEEDED
+        ON_SUCCEEDED,
+        ON_FAILED,
+        ON_CANCELED,
     }
 
     public enum FailureType {
@@ -130,6 +135,21 @@
         mExecutorService.shutdown();
     }
 
+    /**
+     * Shuts down the ExecutorService and waits until it executes all posted
+     * tasks.
+     */
+    public void shutdownExecutorAndWait() {
+        mExecutorService.shutdown();
+        try {
+            // Termination shouldn't take long. Use 1 min which should be more than enough.
+            mExecutorService.awaitTermination(1, TimeUnit.MINUTES);
+        } catch (InterruptedException e) {
+            assertTrue("ExecutorService is interrupted while waiting for termination", false);
+        }
+        assertTrue(mExecutorService.isTerminated());
+    }
+
     @Override
     public void onRedirectReceived(
             UrlRequest request, UrlResponseInfo info, String newLocationUrl) {
@@ -218,7 +238,7 @@
         assertFalse(mOnErrorCalled);
         assertFalse(mOnCanceledCalled);
         assertNull(mError);
-        if (mFailureType == FailureType.THROW_SYNC) {
+        if (mListenerExceptionThrown) {
             assertEquals(UrlRequestError.LISTENER_EXCEPTION_THROWN, error.getErrorCode());
             assertEquals(0, error.getCronetInternalErrorCode());
             assertEquals("Exception received from UrlRequest.Callback", error.getMessage());
@@ -228,6 +248,7 @@
             assertFalse(error.immediatelyRetryable());
         }
 
+        mResponseStep = ResponseStep.ON_FAILED;
         mOnErrorCalled = true;
         mError = error;
         openDone();
@@ -243,6 +264,7 @@
         assertFalse(mOnErrorCalled);
         assertNull(mError);
 
+        mResponseStep = ResponseStep.ON_CANCELED;
         mOnCanceledCalled = true;
         openDone();
         maybeThrowCancelOrPause(request);
@@ -273,6 +295,7 @@
      * request.
      */
     private boolean maybeThrowCancelOrPause(final UrlRequest request) {
+        assertEquals(mExecutorThread, Thread.currentThread());
         if (mResponseStep != mFailureStep || mFailureType == FailureType.NONE) {
             if (!mAutoAdvance) {
                 mStepBlock.open();
@@ -282,6 +305,8 @@
         }
 
         if (mFailureType == FailureType.THROW_SYNC) {
+            assertFalse(mListenerExceptionThrown);
+            mListenerExceptionThrown = true;
             throw new IllegalStateException("Listener Exception.");
         }
         Runnable task = new Runnable() {
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc
index 00c0c2a25..f7d0eb8 100644
--- a/components/flags_ui/flags_state.cc
+++ b/components/flags_ui/flags_state.cc
@@ -228,9 +228,7 @@
 
 }  // namespace
 
-// Keeps track of affected switches for each FeatureEntry, based on which
-// choice is selected for it.
-struct SwitchEntry {
+struct FlagsState::SwitchEntry {
   // Corresponding base::Feature to toggle.
   std::string feature_name;
 
@@ -261,55 +259,33 @@
     const char* enable_features_flag_name,
     const char* disable_features_flag_name) {
   std::set<std::string> enabled_entries;
-
-  GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, &enabled_entries);
-
   std::map<std::string, SwitchEntry> name_to_switch_map;
-  for (size_t i = 0; i < num_feature_entries_; ++i) {
-    const FeatureEntry& e = feature_entries_[i];
-    switch (e.type) {
-      case FeatureEntry::SINGLE_VALUE:
-      case FeatureEntry::SINGLE_DISABLE_VALUE:
-        AddSwitchMapping(e.internal_name, e.command_line_switch,
-                         e.command_line_value, &name_to_switch_map);
-        break;
-      case FeatureEntry::MULTI_VALUE:
-        for (int j = 0; j < e.num_options; ++j) {
-          AddSwitchMapping(
-              e.NameForOption(j), e.ChoiceForOption(j).command_line_switch,
-              e.ChoiceForOption(j).command_line_value, &name_to_switch_map);
-        }
-        break;
-      case FeatureEntry::ENABLE_DISABLE_VALUE:
-        AddSwitchMapping(e.NameForOption(0), std::string(), std::string(),
-                         &name_to_switch_map);
-        AddSwitchMapping(e.NameForOption(1), e.command_line_switch,
-                         e.command_line_value, &name_to_switch_map);
-        AddSwitchMapping(e.NameForOption(2), e.disable_command_line_switch,
-                         e.disable_command_line_value, &name_to_switch_map);
-        break;
-      case FeatureEntry::FEATURE_VALUE:
-      case FeatureEntry::FEATURE_WITH_VARIATIONS_VALUE:
-        for (int j = 0; j < e.num_options; ++j) {
-          FeatureEntry::FeatureState state = e.StateForOption(j);
-          if (state == FeatureEntry::FeatureState::DEFAULT) {
-            AddFeatureMapping(e.NameForOption(j), std::string(), false,
-                              &name_to_switch_map);
-          } else {
-            AddFeatureMapping(e.NameForOption(j), e.feature->name,
-                              state == FeatureEntry::FeatureState::ENABLED,
-                              &name_to_switch_map);
-          }
-        }
-        break;
-    }
-  }
-
+  GenerateFlagsToSwitchesMapping(flags_storage, &enabled_entries,
+                                 &name_to_switch_map);
   AddSwitchesToCommandLine(enabled_entries, name_to_switch_map, sentinels,
                            command_line, enable_features_flag_name,
                            disable_features_flag_name);
 }
 
+std::set<std::string> FlagsState::GetSwitchesFromFlags(
+    FlagsStorage* flags_storage) {
+  std::set<std::string> enabled_entries;
+  std::map<std::string, SwitchEntry> name_to_switch_map;
+  GenerateFlagsToSwitchesMapping(flags_storage, &enabled_entries,
+                                 &name_to_switch_map);
+
+  std::set<std::string> switches;
+  for (const std::string& entry_name : enabled_entries) {
+    const auto& entry_it = name_to_switch_map.find(entry_name);
+    DCHECK(entry_it != name_to_switch_map.end());
+
+    const SwitchEntry& entry = entry_it->second;
+    if (!entry.switch_name.empty())
+      switches.insert("--" + entry.switch_name);
+  }
+  return switches;
+}
+
 bool FlagsState::IsRestartNeededToCommitChanges() {
   return needs_restart_;
 }
@@ -732,4 +708,51 @@
   result->swap(new_enabled_entries);
 }
 
+void FlagsState::GenerateFlagsToSwitchesMapping(
+    FlagsStorage* flags_storage,
+    std::set<std::string>* enabled_entries,
+    std::map<std::string, SwitchEntry>* name_to_switch_map) {
+  GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, enabled_entries);
+
+  for (size_t i = 0; i < num_feature_entries_; ++i) {
+    const FeatureEntry& e = feature_entries_[i];
+    switch (e.type) {
+      case FeatureEntry::SINGLE_VALUE:
+      case FeatureEntry::SINGLE_DISABLE_VALUE:
+        AddSwitchMapping(e.internal_name, e.command_line_switch,
+                         e.command_line_value, name_to_switch_map);
+        break;
+      case FeatureEntry::MULTI_VALUE:
+        for (int j = 0; j < e.num_options; ++j) {
+          AddSwitchMapping(
+              e.NameForOption(j), e.ChoiceForOption(j).command_line_switch,
+              e.ChoiceForOption(j).command_line_value, name_to_switch_map);
+        }
+        break;
+      case FeatureEntry::ENABLE_DISABLE_VALUE:
+        AddSwitchMapping(e.NameForOption(0), std::string(), std::string(),
+                         name_to_switch_map);
+        AddSwitchMapping(e.NameForOption(1), e.command_line_switch,
+                         e.command_line_value, name_to_switch_map);
+        AddSwitchMapping(e.NameForOption(2), e.disable_command_line_switch,
+                         e.disable_command_line_value, name_to_switch_map);
+        break;
+      case FeatureEntry::FEATURE_VALUE:
+      case FeatureEntry::FEATURE_WITH_VARIATIONS_VALUE:
+        for (int j = 0; j < e.num_options; ++j) {
+          FeatureEntry::FeatureState state = e.StateForOption(j);
+          if (state == FeatureEntry::FeatureState::DEFAULT) {
+            AddFeatureMapping(e.NameForOption(j), std::string(), false,
+                              name_to_switch_map);
+          } else {
+            AddFeatureMapping(e.NameForOption(j), e.feature->name,
+                              state == FeatureEntry::FeatureState::ENABLED,
+                              name_to_switch_map);
+          }
+        }
+        break;
+    }
+  }
+}
+
 }  // namespace flags_ui
diff --git a/components/flags_ui/flags_state.h b/components/flags_ui/flags_state.h
index 7d7e933e9b..c7e59be4 100644
--- a/components/flags_ui/flags_state.h
+++ b/components/flags_ui/flags_state.h
@@ -73,6 +73,12 @@
                               SentinelsMode sentinels,
                               const char* enable_features_flag_name,
                               const char* disable_features_flag_name);
+
+  // Reads the state from |flags_storage| and returns the set of command line
+  // flags that correspond to enabled entries. Does not populate any information
+  // about entries that enable/disable base::Feature states.
+  std::set<std::string> GetSwitchesFromFlags(FlagsStorage* flags_storage);
+
   bool IsRestartNeededToCommitChanges();
   void SetFeatureEntryEnabled(FlagsStorage* flags_storage,
                               const std::string& internal_name,
@@ -122,6 +128,10 @@
       const char* extra_flag_sentinel_end_flag_name);
 
  private:
+  // Keeps track of affected switches for each FeatureEntry, based on which
+  // choice is selected for it.
+  struct SwitchEntry;
+
   // Adds mapping to |name_to_switch_map| to set the given switch name/value.
   void AddSwitchMapping(const std::string& key,
                         const std::string& switch_name,
@@ -171,6 +181,15 @@
       FlagsStorage* flags_storage,
       std::set<std::string>* result);
 
+  // Generates a flags to switches mapping based on the set of enabled flags
+  // from |flags_storage|. On output, |enabled_entries| will contain the
+  // internal names of enabled flags and |name_to_switch_map| will contain
+  // information on how they map to command-line flags or features.
+  void GenerateFlagsToSwitchesMapping(
+      FlagsStorage* flags_storage,
+      std::set<std::string>* enabled_entries,
+      std::map<std::string, SwitchEntry>* name_to_switch_map);
+
   const FeatureEntry* feature_entries_;
   size_t num_feature_entries_;
 
diff --git a/components/flags_ui/resources/flags.css b/components/flags_ui/resources/flags.css
index 4d1a61c..d73b13ca 100644
--- a/components/flags_ui/resources/flags.css
+++ b/components/flags_ui/resources/flags.css
@@ -84,6 +84,10 @@
   line-height: 200%;
 }
 
+select {
+  max-width: 85vw;
+}
+
 #experiment-reset-all {
   float: right;
 }
diff --git a/components/guest_view/browser/guest_view_base.cc b/components/guest_view/browser/guest_view_base.cc
index f816a6ec..e4866d74 100644
--- a/components/guest_view/browser/guest_view_base.cc
+++ b/components/guest_view/browser/guest_view_base.cc
@@ -478,6 +478,8 @@
   StopTrackingEmbedderZoomLevel();
   owner_web_contents_ = nullptr;
 
+  element_instance_id_ = kInstanceIDNone;
+
   DCHECK(web_contents());
 
   // Give the derived class an opportunity to perform some cleanup.
diff --git a/components/ntp_snippets/content_suggestions_metrics.cc b/components/ntp_snippets/content_suggestions_metrics.cc
index 614ce75..5d4fbe16 100644
--- a/components/ntp_snippets/content_suggestions_metrics.cc
+++ b/components/ntp_snippets/content_suggestions_metrics.cc
@@ -181,11 +181,12 @@
 
   LogCategoryHistogramScore(kHistogramOpenedScore, category, score);
 
-  UMA_HISTOGRAM_ENUMERATION(kHistogramOpenDisposition, disposition,
-                            WINDOW_OPEN_DISPOSITION_LAST + 1);
-  LogCategoryHistogramEnumeration(kHistogramOpenDisposition, category,
-                                  disposition,
-                                  WINDOW_OPEN_DISPOSITION_LAST + 1);
+  UMA_HISTOGRAM_ENUMERATION(
+      kHistogramOpenDisposition, static_cast<int>(disposition),
+      static_cast<int>(WindowOpenDisposition::MAX_VALUE) + 1);
+  LogCategoryHistogramEnumeration(
+      kHistogramOpenDisposition, category, static_cast<int>(disposition),
+      static_cast<int>(WindowOpenDisposition::MAX_VALUE) + 1);
 }
 
 void OnSuggestionMenuOpened(int global_position,
diff --git a/components/omnibox/browser/omnibox_edit_controller.cc b/components/omnibox/browser/omnibox_edit_controller.cc
index 1b653b24..6b2980c 100644
--- a/components/omnibox/browser/omnibox_edit_controller.cc
+++ b/components/omnibox/browser/omnibox_edit_controller.cc
@@ -15,7 +15,7 @@
 }
 
 OmniboxEditController::OmniboxEditController()
-    : disposition_(CURRENT_TAB),
+    : disposition_(WindowOpenDisposition::CURRENT_TAB),
       transition_(ui::PageTransitionFromInt(
           ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR)) {}
 
diff --git a/components/omnibox/browser/omnibox_edit_model.cc b/components/omnibox/browser/omnibox_edit_model.cc
index 88067e4..edc1a79 100644
--- a/components/omnibox/browser/omnibox_edit_model.cc
+++ b/components/omnibox/browser/omnibox_edit_model.cc
@@ -536,8 +536,8 @@
   AutocompleteMatch match;
   GURL alternate_nav_url;
   ClassifyStringForPasteAndGo(text, &match, &alternate_nav_url);
-  view_->OpenMatch(match, CURRENT_TAB, alternate_nav_url, text,
-                   OmniboxPopupModel::kNoMatch);
+  view_->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB, alternate_nav_url,
+                   text, OmniboxPopupModel::kNoMatch);
 }
 
 bool OmniboxEditModel::IsPasteAndSearch(const base::string16& text) const {
@@ -708,7 +708,8 @@
       << "omnibox text at same time or before the most recent time the "
       << "default match changed.";
 
-  if ((disposition == CURRENT_TAB) && client_->CurrentPageExists()) {
+  if ((disposition == WindowOpenDisposition::CURRENT_TAB) &&
+      client_->CurrentPageExists()) {
     // If we know the destination is being opened in the current tab,
     // we can easily get the tab ID.  (If it's being opened in a new
     // tab, we don't know the tab ID yet.)
@@ -735,7 +736,7 @@
       // Don't increment usage count for extension keywords.
       if (client_->ProcessExtensionKeyword(template_url, match, disposition,
                                            observer.get())) {
-        if (disposition != NEW_BACKGROUND_TAB)
+        if (disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB)
           view_->RevertAll();
         return;
       }
@@ -760,7 +761,7 @@
   // Get the current text before we call RevertAll() which will clear it.
   base::string16 current_text = view_->GetText();
 
-  if (disposition != NEW_BACKGROUND_TAB) {
+  if (disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB) {
     base::AutoReset<bool> tmp(&in_revert_, true);
     view_->RevertAll();  // Revert the box to its unedited state.
   }
diff --git a/components/omnibox/browser/omnibox_edit_unittest.cc b/components/omnibox/browser/omnibox_edit_unittest.cc
index 15cfb3f2..1d4f5d0 100644
--- a/components/omnibox/browser/omnibox_edit_unittest.cc
+++ b/components/omnibox/browser/omnibox_edit_unittest.cc
@@ -383,14 +383,14 @@
 
   model()->OnSetFocus(false);  // Avoids DCHECK in OpenMatch().
   model()->SetUserText(base::ASCIIToUTF16("http://ab cd"));
-  model()->OpenMatch(match, CURRENT_TAB, alternate_nav_url, base::string16(),
-                     0);
+  model()->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB,
+                     alternate_nav_url, base::string16(), 0);
   EXPECT_TRUE(AutocompleteInput::HasHTTPScheme(
       client->alternate_nav_match().fill_into_edit));
 
   model()->SetUserText(base::ASCIIToUTF16("ab cd"));
-  model()->OpenMatch(match, CURRENT_TAB, alternate_nav_url, base::string16(),
-                     0);
+  model()->OpenMatch(match, WindowOpenDisposition::CURRENT_TAB,
+                     alternate_nav_url, base::string16(), 0);
   EXPECT_TRUE(AutocompleteInput::HasHTTPScheme(
       client->alternate_nav_match().fill_into_edit));
 }
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
index c07757b..488f6c2 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -111,7 +111,7 @@
 
     em::CertificateBasedDeviceRegisterRequest* cert_based_register_request =
         cert_based_registration_request_.mutable_cert_based_register_request();
-    fake_signing_service_.SignRegistrationData(&data,
+    fake_signing_service_.SignDataSynchronously(data.SerializeAsString(),
         cert_based_register_request->mutable_signed_request());
 
     em::PolicyFetchRequest* policy_fetch_request =
diff --git a/components/policy/core/common/cloud/mock_signing_service.cc b/components/policy/core/common/cloud/mock_signing_service.cc
index aece3a6..8e281514 100644
--- a/components/policy/core/common/cloud/mock_signing_service.cc
+++ b/components/policy/core/common/cloud/mock_signing_service.cc
@@ -19,22 +19,17 @@
 
 FakeSigningService::~FakeSigningService() {}
 
-void FakeSigningService::SignRegistrationData(
-      const em::CertificateBasedDeviceRegistrationData* registration_data,
-      em::SignedData* signed_data) {
-    DoSignData(registration_data->SerializeAsString(), signed_data);
-  }
-
 void FakeSigningService::SignData(const std::string& data,
                                   const SigningCallback& callback) {
   em::SignedData signed_data;
-  if (success_)
-    DoSignData(data, &signed_data);
+  if (success_) {
+    SignDataSynchronously(data, &signed_data);
+  }
   callback.Run(success_, signed_data);
 }
 
-void FakeSigningService::DoSignData(const std::string& data,
-                                    em::SignedData* signed_data) {
+void FakeSigningService::SignDataSynchronously(const std::string& data,
+    em::SignedData* signed_data) {
   signed_data->set_data(data + kSignedDataNonce);
   signed_data->set_signature(kSignature);
   signed_data->set_extra_data_bytes(sizeof(kSignedDataNonce) - 1);
@@ -49,4 +44,3 @@
 MockSigningService::~MockSigningService() {}
 
 } // namespace policy
-
diff --git a/components/policy/core/common/cloud/mock_signing_service.h b/components/policy/core/common/cloud/mock_signing_service.h
index beb3f092..d8024f3a 100644
--- a/components/policy/core/common/cloud/mock_signing_service.h
+++ b/components/policy/core/common/cloud/mock_signing_service.h
@@ -17,19 +17,17 @@
   FakeSigningService();
   virtual ~FakeSigningService();
 
-  void SignRegistrationData(
-      const enterprise_management::CertificateBasedDeviceRegistrationData*
-          registration_data,
-      enterprise_management::SignedData* signed_data);
-
   void SignData(const std::string& data, const SigningCallback& callback)
       override;
 
-  void set_success(bool success);
- private:
-  void DoSignData(const std::string& data,
-                         enterprise_management::SignedData* signed_data);
+  // Useful for test setups without having to deal with callbacks.
+  void SignDataSynchronously(const std::string& data,
+      enterprise_management::SignedData* signed_data);
 
+  // Determine whether SignData will appear successful or not.
+  void set_success(bool success);
+
+ private:
   bool success_ = true;
 };
 
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc
index 9965772e..708c47e 100644
--- a/components/renderer_context_menu/render_view_context_menu_base.cc
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc
@@ -391,7 +391,8 @@
       content::Referrer(referring_url.GetAsReferrer(),
                         params_.referrer_policy));
 
-  if (params_.link_url == url && disposition != OFF_THE_RECORD)
+  if (params_.link_url == url &&
+      disposition != WindowOpenDisposition::OFF_THE_RECORD)
     params_.custom_context.link_followed = url;
 
   OpenURLParams open_url_params(url, referrer, disposition, transition, false);
diff --git a/components/sessions/core/tab_restore_service_helper.cc b/components/sessions/core/tab_restore_service_helper.cc
index cc3f2ae..1390ba1 100644
--- a/components/sessions/core/tab_restore_service_helper.cc
+++ b/components/sessions/core/tab_restore_service_helper.cc
@@ -129,7 +129,8 @@
     LiveTabContext* context) {
   if (entries_.empty())
     return std::vector<LiveTab*>();
-  return RestoreEntryById(context, entries_.front()->id, UNKNOWN);
+  return RestoreEntryById(context, entries_.front()->id,
+                          WindowOpenDisposition::UNKNOWN);
 }
 
 std::unique_ptr<TabRestoreService::Tab>
@@ -242,8 +243,8 @@
       }
       context->ShowBrowserWindow();
 
-      if (disposition == CURRENT_TAB && current_context &&
-          current_context->GetActiveLiveTab()) {
+      if (disposition == WindowOpenDisposition::CURRENT_TAB &&
+          current_context && current_context->GetActiveLiveTab()) {
         current_context->CloseTab();
       }
       break;
@@ -373,13 +374,13 @@
     WindowOpenDisposition disposition,
     LiveTab** live_tab) {
   LiveTab* restored_tab;
-  if (disposition == CURRENT_TAB && context) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB && context) {
     restored_tab = context->ReplaceRestoredTab(
         tab.navigations, tab.current_navigation_index, tab.from_last_session,
         tab.extension_app_id, tab.platform_data.get(), tab.user_agent_override);
   } else {
     // We only respsect the tab's original browser if there's no disposition.
-    if (disposition == UNKNOWN && tab.browser_id) {
+    if (disposition == WindowOpenDisposition::UNKNOWN && tab.browser_id) {
       context = client_->FindLiveTabContextWithID(tab.browser_id);
     }
 
@@ -388,7 +389,7 @@
     // |context| will be NULL in cases where one isn't already available (eg,
     // when invoked on Mac OS X with no windows open). In this case, create a
     // new browser into which we restore the tabs.
-    if (context && disposition != NEW_WINDOW) {
+    if (context && disposition != WindowOpenDisposition::NEW_WINDOW) {
       tab_index = tab.tabstrip_index;
     } else {
       context = client_->CreateLiveTabContext(std::string());
@@ -399,13 +400,14 @@
     // Place the tab at the end if the tab index is no longer valid or
     // we were passed a specific disposition.
     if (tab_index < 0 || tab_index > context->GetTabCount() ||
-        disposition != UNKNOWN) {
+        disposition != WindowOpenDisposition::UNKNOWN) {
       tab_index = context->GetTabCount();
     }
 
     restored_tab = context->AddRestoredTab(
         tab.navigations, tab_index, tab.current_navigation_index,
-        tab.extension_app_id, disposition != NEW_BACKGROUND_TAB, tab.pinned,
+        tab.extension_app_id,
+        disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB, tab.pinned,
         tab.from_last_session, tab.platform_data.get(),
         tab.user_agent_override);
     restored_tab->LoadIfNecessary();
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
index 3949e6f..64e934f 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -5,8 +5,10 @@
 #include "components/startup_metric_utils/browser/startup_metric_utils.h"
 
 #include <stddef.h>
+#include <stdint.h>
 
 #include <memory>
+#include <string>
 
 #include "base/containers/hash_tables.h"
 #include "base/environment.h"
@@ -28,7 +30,6 @@
 #if defined(OS_WIN)
 #include <winternl.h>
 #include "base/win/win_util.h"
-#include "base/win/windows_version.h"
 #endif
 
 namespace startup_metric_utils {
@@ -54,6 +55,25 @@
 base::LazyInstance<base::Time>::Leaky g_browser_main_entry_point_time =
     LAZY_INSTANCE_INITIALIZER;
 
+// An enumeration of startup temperatures. This must be kept in sync with the
+// UMA StartupType enumeration defined in histograms.xml.
+enum StartupTemperature {
+  // The startup was a cold start: nearly all of the binaries and resources were
+  // brought into memory using hard faults.
+  COLD_STARTUP_TEMPERATURE = 0,
+  // The startup was a warm start: the binaries and resources were mostly
+  // already resident in memory and effectively no hard faults were observed.
+  WARM_STARTUP_TEMPERATURE = 1,
+  // The startup type couldn't quite be classified as warm or cold, but rather
+  // was somewhere in between.
+  LUKEWARM_STARTUP_TEMPERATURE = 2,
+  // This must be after all meaningful values. All new values should be added
+  // above this one.
+  STARTUP_TEMPERATURE_COUNT,
+  // Startup temperature wasn't yet determined.
+  UNDETERMINED_STARTUP_TEMPERATURE
+};
+
 StartupTemperature g_startup_temperature = UNDETERMINED_STARTUP_TEMPERATURE;
 
 constexpr int kUndeterminedStartupsWithCurrentVersion = 0;
@@ -70,11 +90,11 @@
 // Maximum number of hard faults tolerated for a startup to be classified as a
 // warm start. Set at roughly the 40th percentile of the HardFaultCount
 // histogram.
-const uint32_t WARM_START_HARD_FAULT_COUNT_THRESHOLD = 5;
+constexpr uint32_t kWarmStartHardFaultCountThreshold = 5;
 // Minimum number of hard faults expected for a startup to be classified as a
 // cold start. Set at roughly the 60th percentile of the HardFaultCount
 // histogram.
-const uint32_t COLD_START_HARD_FAULT_COUNT_THRESHOLD = 1200;
+constexpr uint32_t kColdStartHardFaultCountThreshold = 1200;
 
 // The struct used to return system process information via the NT internal
 // QuerySystemInformation call. This is partially documented at
@@ -105,6 +125,61 @@
 // The signature of the NtQuerySystemInformation function.
 typedef NTSTATUS (WINAPI *NtQuerySystemInformationPtr)(
     SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
+
+// Gets the hard fault count of the current process through |hard_fault_count|.
+// Returns true on success.
+bool GetHardFaultCountForCurrentProcess(uint32_t* hard_fault_count) {
+  DCHECK(hard_fault_count);
+
+  // Get the function pointer.
+  static const NtQuerySystemInformationPtr query_sys_info =
+      reinterpret_cast<NtQuerySystemInformationPtr>(::GetProcAddress(
+          GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
+  if (query_sys_info == nullptr)
+    return false;
+
+  // The output of this system call depends on the number of threads and
+  // processes on the entire system, and this can change between calls. Retry
+  // a small handful of times growing the buffer along the way.
+  // NOTE: The actual required size depends entirely on the number of processes
+  //       and threads running on the system. The initial guess suffices for
+  //       ~100s of processes and ~1000s of threads.
+  std::vector<uint8_t> buffer(32 * 1024);
+  for (size_t tries = 0; tries < 3; ++tries) {
+    ULONG return_length = 0;
+    const NTSTATUS status =
+        query_sys_info(SystemProcessInformation, buffer.data(),
+                       static_cast<ULONG>(buffer.size()), &return_length);
+    // Insufficient space in the buffer.
+    if (return_length > buffer.size()) {
+      buffer.resize(return_length);
+      continue;
+    }
+    if (NT_SUCCESS(status) && return_length <= buffer.size())
+      break;
+    return false;
+  }
+
+  // Look for the struct housing information for the current process.
+  const DWORD proc_id = ::GetCurrentProcessId();
+  size_t index = 0;
+  while (index < buffer.size()) {
+    DCHECK_LE(index + sizeof(SYSTEM_PROCESS_INFORMATION_EX), buffer.size());
+    SYSTEM_PROCESS_INFORMATION_EX* proc_info =
+        reinterpret_cast<SYSTEM_PROCESS_INFORMATION_EX*>(buffer.data() + index);
+    if (base::win::HandleToUint32(proc_info->UniqueProcessId) == proc_id) {
+      *hard_fault_count = proc_info->HardFaultCount;
+      return true;
+    }
+    // The list ends when NextEntryOffset is zero. This also prevents busy
+    // looping if the data is in fact invalid.
+    if (proc_info->NextEntryOffset <= 0)
+      return false;
+    index += proc_info->NextEntryOffset;
+  }
+
+  return false;
+}
 #endif  // defined(OS_WIN)
 
 #define UMA_HISTOGRAM_TIME_IN_MINUTES_MONTH_RANGE(name, sample) \
@@ -279,9 +354,9 @@
 
   // Determine the startup type based on the number of observed hard faults.
   DCHECK_EQ(UNDETERMINED_STARTUP_TEMPERATURE, g_startup_temperature);
-  if (hard_fault_count < WARM_START_HARD_FAULT_COUNT_THRESHOLD) {
+  if (hard_fault_count < kWarmStartHardFaultCountThreshold) {
     g_startup_temperature = WARM_STARTUP_TEMPERATURE;
-  } else if (hard_fault_count >= COLD_START_HARD_FAULT_COUNT_THRESHOLD) {
+  } else if (hard_fault_count >= kColdStartHardFaultCountThreshold) {
     g_startup_temperature = COLD_STARTUP_TEMPERATURE;
   } else {
     g_startup_temperature = LUKEWARM_STARTUP_TEMPERATURE;
@@ -488,64 +563,6 @@
 
 }  // namespace
 
-#if defined(OS_WIN)
-bool GetHardFaultCountForCurrentProcess(uint32_t* hard_fault_count) {
-  DCHECK(hard_fault_count);
-
-  if (base::win::GetVersion() < base::win::VERSION_WIN7)
-    return false;
-
-  // Get the function pointer.
-  static const NtQuerySystemInformationPtr query_sys_info =
-      reinterpret_cast<NtQuerySystemInformationPtr>(::GetProcAddress(
-          GetModuleHandle(L"ntdll.dll"), "NtQuerySystemInformation"));
-  if (query_sys_info == nullptr)
-    return false;
-
-  // The output of this system call depends on the number of threads and
-  // processes on the entire system, and this can change between calls. Retry
-  // a small handful of times growing the buffer along the way.
-  // NOTE: The actual required size depends entirely on the number of processes
-  //       and threads running on the system. The initial guess suffices for
-  //       ~100s of processes and ~1000s of threads.
-  std::vector<uint8_t> buffer(32 * 1024);
-  for (size_t tries = 0; tries < 3; ++tries) {
-    ULONG return_length = 0;
-    NTSTATUS status =
-        query_sys_info(SystemProcessInformation, buffer.data(),
-                       static_cast<ULONG>(buffer.size()), &return_length);
-    // Insufficient space in the buffer.
-    if (return_length > buffer.size()) {
-      buffer.resize(return_length);
-      continue;
-    }
-    if (NT_SUCCESS(status) && return_length <= buffer.size())
-      break;
-    return false;
-  }
-
-  // Look for the struct housing information for the current process.
-  DWORD proc_id = ::GetCurrentProcessId();
-  size_t index = 0;
-  while (index < buffer.size()) {
-    DCHECK_LE(index + sizeof(SYSTEM_PROCESS_INFORMATION_EX), buffer.size());
-    SYSTEM_PROCESS_INFORMATION_EX* proc_info =
-        reinterpret_cast<SYSTEM_PROCESS_INFORMATION_EX*>(buffer.data() + index);
-    if (base::win::HandleToUint32(proc_info->UniqueProcessId) == proc_id) {
-      *hard_fault_count = proc_info->HardFaultCount;
-      return true;
-    }
-    // The list ends when NextEntryOffset is zero. This also prevents busy
-    // looping if the data is in fact invalid.
-    if (proc_info->NextEntryOffset <= 0)
-      return false;
-    index += proc_info->NextEntryOffset;
-  }
-
-  return false;
-}
-#endif  // defined(OS_WIN)
-
 void RegisterPrefs(PrefRegistrySimple* registry) {
   DCHECK(registry);
   registry->RegisterInt64Pref(prefs::kLastStartupTimestamp, 0);
@@ -771,8 +788,4 @@
   return g_browser_main_entry_point_ticks.Get();
 }
 
-StartupTemperature GetStartupTemperature() {
-  return g_startup_temperature;
-}
-
 }  // namespace startup_metric_utils
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.h b/components/startup_metric_utils/browser/startup_metric_utils.h
index 3d373c2..4029ffb0 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.h
+++ b/components/startup_metric_utils/browser/startup_metric_utils.h
@@ -5,11 +5,7 @@
 #ifndef COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
 #define COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
 
-#include <stdint.h>
-#include <string>
-
 #include "base/time/time.h"
-#include "build/build_config.h"
 
 class PrefRegistrySimple;
 class PrefService;
@@ -22,31 +18,6 @@
 
 namespace startup_metric_utils {
 
-// An enumeration of startup temperatures. This must be kept in sync with the
-// UMA StartupType enumeration defined in histograms.xml.
-enum StartupTemperature {
-  // The startup was a cold start: nearly all of the binaries and resources were
-  // brought into memory using hard faults.
-  COLD_STARTUP_TEMPERATURE = 0,
-  // The startup was a warm start: the binaries and resources were mostly
-  // already resident in memory and effectively no hard faults were observed.
-  WARM_STARTUP_TEMPERATURE = 1,
-  // The startup type couldn't quite be classified as warm or cold, but rather
-  // was somewhere in between.
-  LUKEWARM_STARTUP_TEMPERATURE = 2,
-  // This must be after all meaningful values. All new values should be added
-  // above this one.
-  STARTUP_TEMPERATURE_COUNT,
-  // Startup temperature wasn't yet determined.
-  UNDETERMINED_STARTUP_TEMPERATURE
-};
-
-#if defined(OS_WIN)
-// Gets the hard fault count of the current process through |hard_fault_count|.
-// Returns true on success.
-bool GetHardFaultCountForCurrentProcess(uint32_t* hard_fault_count);
-#endif  // defined(OS_WIN)
-
 // Registers startup related prefs in |registry|.
 void RegisterPrefs(PrefRegistrySimple* registry);
 
@@ -116,11 +87,6 @@
 // recorded yet. This method is expected to be called from the UI thread.
 base::TimeTicks MainEntryPointTicks();
 
-// Returns the startup type. This is only currently supported on the Windows
-// platform and will simply return UNCERTAIN_STARTUP_TYPE on other platforms.
-// This is only valid after a call to RecordBrowserMainMessageLoopStart().
-StartupTemperature GetStartupTemperature();
-
 }  // namespace startup_metric_utils
 
 #endif  // COMPONENTS_STARTUP_METRIC_UTILS_BROWSER_STARTUP_METRIC_UTILS_H_
diff --git a/components/startup_metric_utils/common/BUILD.gn b/components/startup_metric_utils/common/BUILD.gn
index 2539277..4bb32b55 100644
--- a/components/startup_metric_utils/common/BUILD.gn
+++ b/components/startup_metric_utils/common/BUILD.gn
@@ -4,19 +4,6 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 
-source_set("common") {
-  sources = [
-    "pre_read_field_trial_utils_win.cc",
-    "pre_read_field_trial_utils_win.h",
-  ]
-
-  deps = [
-    "//base",
-    "//components/variations",
-    "//ipc",
-  ]
-}
-
 mojom("interfaces") {
   sources = [
     "startup_metric.mojom",
diff --git a/components/startup_metric_utils/common/DEPS b/components/startup_metric_utils/common/DEPS
deleted file mode 100644
index 80f6f90..0000000
--- a/components/startup_metric_utils/common/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+components/variations",
-]
diff --git a/components/startup_metric_utils/common/pre_read_field_trial_utils_win.cc b/components/startup_metric_utils/common/pre_read_field_trial_utils_win.cc
deleted file mode 100644
index cb9207a..0000000
--- a/components/startup_metric_utils/common/pre_read_field_trial_utils_win.cc
+++ /dev/null
@@ -1,151 +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 "components/startup_metric_utils/common/pre_read_field_trial_utils_win.h"
-
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/metrics/field_trial.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/registry.h"
-#include "components/variations/variations_associated_data.h"
-
-namespace startup_metric_utils {
-
-namespace {
-
-// Name of the pre-read field trial. This name is used to get the pre-read group
-// to use for the next startup from base::FieldTrialList.
-const char kPreReadFieldTrialName[] = "PreRead";
-
-// Name of the synthetic pre-read field trial. A synthetic field trial is
-// registered so that UMA metrics recorded during the current startup are
-// annotated with the pre-read group that is actually used during this startup.
-const char kPreReadSyntheticFieldTrialName[] = "SyntheticPreRead";
-
-// Variation names for the PreRead field trial. All variations change the
-// default behavior, i.e. the default is the inverse of the variation. Thus,
-// variations that cancel something that is done by default have a negative
-// name.
-const base::char16 kNoPreReadVariationName[] = L"NoPreRead";
-const base::char16 kHighPriorityVariationName[] = L"HighPriority";
-const base::char16 kPrefetchVirtualMemoryVariationName[] =
-    L"PrefetchVirtualMemory";
-const base::char16 kPreReadChromeChildInBrowser[] =
-    L"PreReadChromeChildInBrowser";
-
-// Registry key in which the PreRead field trial group is stored.
-const base::char16 kPreReadFieldTrialRegistryKey[] = L"\\PreReadFieldTrial";
-
-// Pre-read options to use for the current process. This is initialized by
-// InitializePreReadOptions().
-PreReadOptions g_pre_read_options = {};
-
-// Returns the registry path in which the PreRead group is stored.
-base::string16 GetPreReadRegistryPath(
-    const base::string16& product_registry_path) {
-  return product_registry_path + kPreReadFieldTrialRegistryKey;
-}
-
-// Returns true if |key| has a value named |name| which is not zero.
-bool ReadBool(const base::win::RegKey& key, const base::char16* name) {
-  DWORD value = 0;
-  return key.ReadValueDW(name, &value) == ERROR_SUCCESS && value != 0;
-}
-
-}  // namespace
-
-void InitializePreReadOptions(const base::string16& product_registry_path) {
-  DCHECK(!product_registry_path.empty());
-
-#if DCHECK_IS_ON()
-  static bool initialized = false;
-  DCHECK(!initialized);
-  initialized = true;
-#endif  // DCHECK_IS_ON()
-
-  // Open the PreRead field trial's registry key.
-  const base::string16 registry_path =
-      GetPreReadRegistryPath(product_registry_path);
-  const base::win::RegKey key(HKEY_CURRENT_USER, registry_path.c_str(),
-                              KEY_QUERY_VALUE);
-
-  // Set the PreRead field trial's options.
-  g_pre_read_options.pre_read = !ReadBool(key, kNoPreReadVariationName);
-  g_pre_read_options.high_priority = ReadBool(key, kHighPriorityVariationName);
-  g_pre_read_options.prefetch_virtual_memory =
-      ReadBool(key, kPrefetchVirtualMemoryVariationName);
-  g_pre_read_options.pre_read_chrome_child_in_browser =
-      ReadBool(key, kPreReadChromeChildInBrowser);
-}
-
-PreReadOptions GetPreReadOptions() {
-  return g_pre_read_options;
-}
-
-void UpdatePreReadOptions(const base::string16& product_registry_path) {
-  DCHECK(!product_registry_path.empty());
-
-  const base::string16 registry_path =
-      GetPreReadRegistryPath(product_registry_path);
-
-  // Clear the experiment key. That way, when the trial is shut down, the
-  // registry will be cleaned automatically. Also, this prevents variation
-  // params from the previous group to stay in the registry when the group is
-  // updated.
-  base::win::RegKey(HKEY_CURRENT_USER, registry_path.c_str(), KEY_SET_VALUE)
-      .DeleteKey(L"");
-
-  // Get the new group name.
-  const base::string16 group = base::UTF8ToUTF16(
-      base::FieldTrialList::FindFullName(kPreReadFieldTrialName));
-  if (group.empty())
-    return;
-
-  // Get variation params for the new group.
-  std::map<std::string, std::string> variation_params;
-  variations::GetVariationParams(kPreReadFieldTrialName, &variation_params);
-
-  // Open the registry key.
-  base::win::RegKey key(HKEY_CURRENT_USER, registry_path.c_str(),
-                        KEY_SET_VALUE);
-
-  // Write variation params in the registry.
-  for (const auto& variation_param : variation_params) {
-    if (!variation_param.second.empty()) {
-      if (key.WriteValue(base::UTF8ToUTF16(variation_param.first).c_str(), 1) !=
-          ERROR_SUCCESS) {
-        // Abort on failure to prevent the group name from being written in the
-        // registry if not all variation params have been written. No synthetic
-        // field trial is registered when there is no group name in the
-        // registry.
-        return;
-      }
-    }
-  }
-
-  // Write the new group name in the registry.
-  key.WriteValue(L"", group.c_str());
-}
-
-void RegisterPreReadSyntheticFieldTrial(
-    const base::string16& product_registry_path,
-    const RegisterPreReadSyntheticFieldTrialCallback&
-        register_synthetic_field_trial) {
-  DCHECK(!product_registry_path.empty());
-
-  const base::win::RegKey key(
-      HKEY_CURRENT_USER, GetPreReadRegistryPath(product_registry_path).c_str(),
-      KEY_QUERY_VALUE);
-  base::string16 group;
-  key.ReadValue(L"", &group);
-
-  if (!group.empty()) {
-    register_synthetic_field_trial.Run(kPreReadSyntheticFieldTrialName,
-                                       base::UTF16ToUTF8(group));
-  }
-}
-
-}  // namespace startup_metric_utils
diff --git a/components/startup_metric_utils/common/pre_read_field_trial_utils_win.h b/components/startup_metric_utils/common/pre_read_field_trial_utils_win.h
deleted file mode 100644
index beed901..0000000
--- a/components/startup_metric_utils/common/pre_read_field_trial_utils_win.h
+++ /dev/null
@@ -1,64 +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 COMPONENTS_STARTUP_METRIC_UTILS_COMMON_PRE_READ_FIELD_TRIAL_UTILS_WIN_H_
-#define COMPONENTS_STARTUP_METRIC_UTILS_COMMON_PRE_READ_FIELD_TRIAL_UTILS_WIN_H_
-
-#include <string>
-
-#include "base/callback_forward.h"
-#include "base/strings/string16.h"
-
-// Utility functions to support the PreRead field trial. The PreRead field trial
-// changes the way DLLs are pre-read during startup.
-
-namespace startup_metric_utils {
-
-// Callback to register a synthetic field trial.
-using RegisterPreReadSyntheticFieldTrialCallback =
-    const base::Callback<bool(const std::string&, const std::string&)>;
-
-// The options controlled by the PreRead field trial.
-struct PreReadOptions {
-  // Pre-read DLLs explicitly.
-  bool pre_read : 1;
-
-  // Pre-read DLLs with a high thread priority.
-  bool high_priority : 1;
-
-  // Pre-read DLLs using the ::PrefetchVirtualMemory function, if available.
-  bool prefetch_virtual_memory : 1;
-
-  // Pre-read chrome_child.dll in the browser process and not in child
-  // processes.
-  bool pre_read_chrome_child_in_browser : 1;
-};
-
-// Initializes DLL pre-reading options from the registry.
-// |product_registry_path| is the registry path under which the registry key for
-// this field trial resides.
-void InitializePreReadOptions(const base::string16& product_registry_path);
-
-// Returns the bitfield of the DLL pre-reading options to use for the current
-// process. InitializePreReadOptions() must have been called before this.
-PreReadOptions GetPreReadOptions();
-
-// Updates DLL pre-reading options in the registry with the latest info for the
-// next startup. |product_registry_path| is the registry path under which the
-// registry key for this field trial resides.
-void UpdatePreReadOptions(const base::string16& product_registry_path);
-
-// Registers a synthetic field trial with the PreRead group currently stored in
-// the registry. This must be done before the first metric log
-// (metrics::MetricsLog) is created. Otherwise, UMA metrics generated during
-// startup won't be correctly annotated. |product_registry_path| is the registry
-// path under which the key for this field trial resides.
-void RegisterPreReadSyntheticFieldTrial(
-    const base::string16& product_registry_path,
-    const RegisterPreReadSyntheticFieldTrialCallback&
-        register_synthetic_field_trial);
-
-}  // namespace startup_metric_utils
-
-#endif  // COMPONENTS_STARTUP_METRIC_UTILS_COMMON_PRE_READ_FIELD_TRIAL_UTILS_WIN_H_
diff --git a/components/sync/core_impl/sync_manager_impl_unittest.cc b/components/sync/core_impl/sync_manager_impl_unittest.cc
index e2cef4b..a52ecbe 100644
--- a/components/sync/core_impl/sync_manager_impl_unittest.cc
+++ b/components/sync/core_impl/sync_manager_impl_unittest.cc
@@ -221,6 +221,10 @@
   return node.GetTotalNodeCount();
 }
 
+const char kUrl[] = "example.com";
+const char kPasswordValue[] = "secret";
+const char kClientTag[] = "tag";
+
 }  // namespace
 
 class SyncApiTest : public testing::Test {
@@ -517,10 +521,10 @@
 
     WriteNode password_node(&trans);
     WriteNode::InitUniqueByCreationResult result =
-        password_node.InitUniqueByCreation(PASSWORDS, root_node, "foo");
+        password_node.InitUniqueByCreation(PASSWORDS, root_node, kClientTag);
     EXPECT_EQ(WriteNode::INIT_SUCCESS, result);
     sync_pb::PasswordSpecificsData data;
-    data.set_password_value("secret");
+    data.set_password_value(kPasswordValue);
     password_node.SetPasswordSpecifics(data);
   }
   {
@@ -528,10 +532,14 @@
 
     ReadNode password_node(&trans);
     EXPECT_EQ(BaseNode::INIT_OK,
-              password_node.InitByClientTagLookup(PASSWORDS, "foo"));
+              password_node.InitByClientTagLookup(PASSWORDS, kClientTag));
     const sync_pb::PasswordSpecificsData& data =
         password_node.GetPasswordSpecifics();
-    EXPECT_EQ("secret", data.password_value());
+    EXPECT_EQ(kPasswordValue, data.password_value());
+    // Check that nothing has appeared in the unencrypted field.
+    EXPECT_FALSE(password_node.GetEntitySpecifics()
+                     .password()
+                     .has_unencrypted_metadata());
   }
 }
 
@@ -2043,24 +2051,27 @@
 }
 
 // Passwords have their own handling for encryption. Verify setting a new
-// passphrase updates the data.
+// passphrase updates the data and clears the unencrypted metadta for passwords.
 TEST_F(SyncManagerTest, UpdatePasswordNewPassphrase) {
-  std::string client_tag = "title";
   EXPECT_TRUE(SetUpEncryption(WRITE_TO_NIGORI, DEFAULT_ENCRYPTION));
   sync_pb::EntitySpecifics entity_specifics;
   {
     ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare());
     Cryptographer* cryptographer = trans.GetCryptographer();
     sync_pb::PasswordSpecificsData data;
-    data.set_password_value("secret");
+    data.set_password_value(kPasswordValue);
+    entity_specifics.mutable_password()
+        ->mutable_unencrypted_metadata()
+        ->set_url(kUrl);
     cryptographer->Encrypt(
         data, entity_specifics.mutable_password()->mutable_encrypted());
   }
-  MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, client_tag,
-                 syncable::GenerateSyncableHash(PASSWORDS, client_tag),
+  EXPECT_TRUE(entity_specifics.password().has_unencrypted_metadata());
+  MakeServerNode(sync_manager_.GetUserShare(), PASSWORDS, kClientTag,
+                 syncable::GenerateSyncableHash(PASSWORDS, kClientTag),
                  entity_specifics);
   // New node shouldn't start off unsynced.
-  EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, client_tag));
+  EXPECT_FALSE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
 
   // Set a new passphrase. Should set is_unsynced.
   testing::Mock::VerifyAndClearExpectations(&encryption_observer_);
@@ -2068,7 +2079,21 @@
               OnBootstrapTokenUpdated(_, PASSPHRASE_BOOTSTRAP_TOKEN));
   ExpectPassphraseAcceptance();
   SetCustomPassphraseAndCheck("new_passphrase");
-  EXPECT_TRUE(ResetUnsyncedEntry(PASSWORDS, client_tag));
+  {
+    ReadTransaction trans(FROM_HERE, sync_manager_.GetUserShare());
+    Cryptographer* cryptographer = trans.GetCryptographer();
+    EXPECT_TRUE(cryptographer->is_ready());
+    ReadNode password_node(&trans);
+    EXPECT_EQ(BaseNode::INIT_OK,
+              password_node.InitByClientTagLookup(PASSWORDS, kClientTag));
+    const sync_pb::PasswordSpecificsData& data =
+        password_node.GetPasswordSpecifics();
+    EXPECT_EQ(kPasswordValue, data.password_value());
+    EXPECT_FALSE(password_node.GetEntitySpecifics()
+                     .password()
+                     .has_unencrypted_metadata());
+  }
+  EXPECT_TRUE(ResetUnsyncedEntry(PASSWORDS, kClientTag));
 }
 
 // Passwords have their own handling for encryption. Verify it does not result
diff --git a/components/sync/protocol/password_specifics.proto b/components/sync/protocol/password_specifics.proto
index ad8c9f71..5c52246 100644
--- a/components/sync/protocol/password_specifics.proto
+++ b/components/sync/protocol/password_specifics.proto
@@ -110,6 +110,11 @@
   optional string federation_url = 17;
 }
 
+// Contains the password specifics metadata which simplifies its lookup.
+message PasswordSpecificsMetadata {
+  optional string url = 1;
+};
+
 // Properties of password sync objects.
 message PasswordSpecifics {
   // The actual password data. Contains an encrypted PasswordSpecificsData
@@ -118,4 +123,8 @@
   // An unsynced field for use internally on the client. This field should
   // never be set in any network-based communications.
   optional PasswordSpecificsData client_only_encrypted_data = 2;
+  // Password related metadata, which is sent to the server side. The field
+  // should never be set for full encryption users. If encryption is enabled,
+  // this field must be cleared.
+  optional PasswordSpecificsMetadata unencrypted_metadata = 3;
 }
diff --git a/components/sync/protocol/proto_value_conversions.cc b/components/sync/protocol/proto_value_conversions.cc
index e4f0f23..1397db8c 100644
--- a/components/sync/protocol/proto_value_conversions.cc
+++ b/components/sync/protocol/proto_value_conversions.cc
@@ -136,6 +136,13 @@
   return value;
 }
 
+std::unique_ptr<base::DictionaryValue> PasswordSpecificsMetadataToValue(
+    const sync_pb::PasswordSpecificsMetadata& proto) {
+  std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
+  SET_STR(url);
+  return value;
+}
+
 std::unique_ptr<base::DictionaryValue> AppSettingsToValue(
     const sync_pb::AppNotificationSettings& proto) {
   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
@@ -607,6 +614,7 @@
     const sync_pb::PasswordSpecifics& proto) {
   std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
   SET(encrypted, EncryptedDataToValue);
+  SET(unencrypted_metadata, PasswordSpecificsMetadataToValue);
   return value;
 }
 
diff --git a/components/sync/syncable/nigori_util.cc b/components/sync/syncable/nigori_util.cc
index 96e687d..791b518f 100644
--- a/components/sync/syncable/nigori_util.cc
+++ b/components/sync/syncable/nigori_util.cc
@@ -13,6 +13,7 @@
 
 #include "base/json/json_writer.h"
 #include "components/sync/base/cryptographer.h"
+#include "components/sync/base/passphrase_type.h"
 #include "components/sync/syncable/directory.h"
 #include "components/sync/syncable/entry.h"
 #include "components/sync/syncable/mutable_entry.h"
@@ -225,6 +226,14 @@
       bookmark_specifics->set_title(kEncryptedString);
     }
   }
+
+  if (type == PASSWORDS &&
+      IsExplicitPassphrase(nigori_handler->GetPassphraseType(trans))) {
+    sync_pb::PasswordSpecifics* password_specifics =
+        generated_specifics.mutable_password();
+    password_specifics->clear_unencrypted_metadata();
+  }
+
   entry->PutSpecifics(generated_specifics);
   DVLOG(1) << "Overwriting specifics of type " << ModelTypeToString(type)
            << " and marking for syncing.";
diff --git a/components/translate/content/browser/content_translate_driver.cc b/components/translate/content/browser/content_translate_driver.cc
index e9a6fe9..9860c30 100644
--- a/components/translate/content/browser/content_translate_driver.cc
+++ b/components/translate/content/browser/content_translate_driver.cc
@@ -146,11 +146,9 @@
 }
 
 void ContentTranslateDriver::OpenUrlInNewTab(const GURL& url) {
-  content::OpenURLParams params(url,
-                                content::Referrer(),
-                                NEW_FOREGROUND_TAB,
-                                ui::PAGE_TRANSITION_LINK,
-                                false);
+  content::OpenURLParams params(url, content::Referrer(),
+                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                ui::PAGE_TRANSITION_LINK, false);
   navigation_controller_->GetWebContents()->OpenURL(params);
 }
 
diff --git a/components/translate/ios/browser/ios_translate_driver.mm b/components/translate/ios/browser/ios_translate_driver.mm
index a83d5c0..e1851db 100644
--- a/components/translate/ios/browser/ios_translate_driver.mm
+++ b/components/translate/ios/browser/ios_translate_driver.mm
@@ -165,7 +165,8 @@
 }
 
 void IOSTranslateDriver::OpenUrlInNewTab(const GURL& url) {
-  web::WebState::OpenURLParams params(url, web::Referrer(), NEW_FOREGROUND_TAB,
+  web::WebState::OpenURLParams params(url, web::Referrer(),
+                                      WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                       ui::PAGE_TRANSITION_LINK, false);
   web_state()->OpenURL(params);
 }
diff --git a/components/variations/variations_request_scheduler.cc b/components/variations/variations_request_scheduler.cc
index 08d39d1..dfc39d9c 100644
--- a/components/variations/variations_request_scheduler.cc
+++ b/components/variations/variations_request_scheduler.cc
@@ -47,7 +47,7 @@
 base::TimeDelta VariationsRequestScheduler::GetFetchPeriod() const {
   // The fetch interval can be overridden by a variation param.
   std::string period_min_str =
-      variations::GetVariationParamValue("VarationsServiceControl",
+      variations::GetVariationParamValue("VariationsServiceControl",
                                          "fetch_period_min");
   size_t period_min;
   if (base::StringToSizeT(period_min_str, &period_min))
diff --git a/components/variations/variations_url_constants.cc b/components/variations/variations_url_constants.cc
index dce446a..f8d9ebc 100644
--- a/components/variations/variations_url_constants.cc
+++ b/components/variations/variations_url_constants.cc
@@ -7,7 +7,12 @@
 namespace variations {
 
 // Default server of Variations seed info.
+#if defined(OS_ANDROID)
+const char kDefaultServerUrl[] =
+    "https://clientservices.googleapis.com/chrome-variations/seed";
+#else
 const char kDefaultServerUrl[] =
     "https://clients4.google.com/chrome-variations/seed";
+#endif
 
 }  // namespace variations
diff --git a/components/web_contents_delegate_android/web_contents_delegate_android.cc b/components/web_contents_delegate_android/web_contents_delegate_android.cc
index 61710e6..7d6c23a 100644
--- a/components/web_contents_delegate_android/web_contents_delegate_android.cc
+++ b/components/web_contents_delegate_android/web_contents_delegate_android.cc
@@ -69,10 +69,10 @@
   const GURL& url = params.url;
   WindowOpenDisposition disposition = params.disposition;
 
-  if (!source || (disposition != CURRENT_TAB &&
-                  disposition != NEW_FOREGROUND_TAB &&
-                  disposition != NEW_BACKGROUND_TAB &&
-                  disposition != OFF_THE_RECORD)) {
+  if (!source || (disposition != WindowOpenDisposition::CURRENT_TAB &&
+                  disposition != WindowOpenDisposition::NEW_FOREGROUND_TAB &&
+                  disposition != WindowOpenDisposition::NEW_BACKGROUND_TAB &&
+                  disposition != WindowOpenDisposition::OFF_THE_RECORD)) {
     NOTIMPLEMENTED();
     return NULL;
   }
@@ -82,9 +82,9 @@
   if (obj.is_null())
     return WebContentsDelegate::OpenURLFromTab(source, params);
 
-  if (disposition == NEW_FOREGROUND_TAB ||
-      disposition == NEW_BACKGROUND_TAB ||
-      disposition == OFF_THE_RECORD) {
+  if (disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB ||
+      disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB ||
+      disposition == WindowOpenDisposition::OFF_THE_RECORD) {
     JNIEnv* env = AttachCurrentThread();
     ScopedJavaLocalRef<jstring> java_url =
         ConvertUTF8ToJavaString(env, url.spec());
@@ -94,8 +94,8 @@
     if (params.uses_post && params.post_data)
       post_data = params.post_data->ToJavaObject(env);
     Java_WebContentsDelegateAndroid_openNewTab(
-        env, obj, java_url, extra_headers, post_data, disposition,
-        params.is_renderer_initiated);
+        env, obj, java_url, extra_headers, post_data,
+        static_cast<int>(disposition), params.is_renderer_initiated);
     return NULL;
   }
 
diff --git a/content/browser/DEPS b/content/browser/DEPS
index f67bc5cf..cc884d1 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -88,6 +88,7 @@
   "+third_party/WebKit/public/platform/modules/serviceworker/service_worker_event_status.mojom.h",
   "+third_party/WebKit/public/platform/modules/vr/WebVR.h",
   "+third_party/WebKit/public/platform/modules/wake_lock/wake_lock_service.mojom.h",
+  "+third_party/WebKit/public/platform/modules/websockets/websocket.mojom.h",
   "+third_party/WebKit/public/web/WebAXEnums.h",
   "+third_party/WebKit/public/web/WebCompositionUnderline.h",
   "+third_party/WebKit/public/web/WebConsoleMessage.h",
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.cc b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
index af1e10e..454f3cb 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.cc
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
@@ -75,7 +75,9 @@
 
 typedef AccessibilityTreeFormatter::Filter Filter;
 
-DumpAccessibilityTestBase::DumpAccessibilityTestBase() {
+DumpAccessibilityTestBase::DumpAccessibilityTestBase()
+    : is_blink_pass_(false),
+      enable_accessibility_after_navigating_(false) {
 }
 
 DumpAccessibilityTestBase::~DumpAccessibilityTestBase() {
@@ -245,15 +247,28 @@
   AddDefaultFilters(&filters_);
   ParseHtmlForExtraDirectives(html_contents, &filters_, &wait_for);
 
-  // Load the test html and wait for the "load complete" AX event.
+  // Get the test URL.
   GURL url(embedded_test_server()->GetURL(
       "/" + std::string(file_dir) + "/" + file_path.BaseName().MaybeAsASCII()));
-  AccessibilityNotificationWaiter accessibility_waiter(
-      shell()->web_contents(),
-      AccessibilityModeComplete,
-      ui::AX_EVENT_LOAD_COMPLETE);
-  NavigateToURL(shell(), url);
-  accessibility_waiter.WaitForNotification();
+
+  if (enable_accessibility_after_navigating_) {
+    // Load the url, then enable accessibility.
+    NavigateToURL(shell(), url);
+    AccessibilityNotificationWaiter accessibility_waiter(
+        shell()->web_contents(),
+        AccessibilityModeComplete,
+        ui::AX_EVENT_NONE);
+    accessibility_waiter.WaitForNotification();
+  } else {
+    // Enable accessibility, then load the test html and wait for the
+    // "load complete" AX event.
+    AccessibilityNotificationWaiter accessibility_waiter(
+        shell()->web_contents(),
+        AccessibilityModeComplete,
+        ui::AX_EVENT_LOAD_COMPLETE);
+    NavigateToURL(shell(), url);
+    accessibility_waiter.WaitForNotification();
+  }
 
   // Get the url of every frame in the frame tree.
   WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.h b/content/browser/accessibility/dump_accessibility_browsertest_base.h
index 58a69bc..32762eea 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.h
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.h
@@ -107,6 +107,10 @@
 
   // Whether we're doing a native pass or internal/blink tree pass.
   bool is_blink_pass_;
+
+  // Whether we should enable accessibility after navigating to the page,
+  // otherwise we enable it first.
+  bool enable_accessibility_after_navigating_;
 };
 
 }  // namespace content
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 560027b..89c7fd0d 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -848,6 +848,12 @@
   RunHtmlTest(FILE_PATH_LITERAL("frameset.html"));
 }
 
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
+                       AccessibilityFramesetPostEnable) {
+  enable_accessibility_after_navigating_ = true;
+  RunHtmlTest(FILE_PATH_LITERAL("frameset.html"));
+}
+
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityHead) {
   RunHtmlTest(FILE_PATH_LITERAL("head.html"));
 }
@@ -882,6 +888,12 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
+                       AccessibilityIframePostEnable) {
+  enable_accessibility_after_navigating_ = true;
+  RunHtmlTest(FILE_PATH_LITERAL("iframe.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
                        AccessibilityIframeCrossProcess) {
   RunHtmlTest(FILE_PATH_LITERAL("iframe-cross-process.html"));
 }
diff --git a/content/browser/frame_host/frame_navigation_entry.cc b/content/browser/frame_host/frame_navigation_entry.cc
index 26671f7..bf78bef 100644
--- a/content/browser/frame_host/frame_navigation_entry.cc
+++ b/content/browser/frame_host/frame_navigation_entry.cc
@@ -83,6 +83,17 @@
   document_sequence_number_ = document_sequence_number;
 }
 
+void FrameNavigationEntry::SetPageState(const PageState& page_state) {
+  page_state_ = page_state;
+
+  ExplodedPageState exploded_state;
+  if (!DecodePageState(page_state_.ToEncodedData(), &exploded_state))
+    return;
+
+  item_sequence_number_ = exploded_state.top.item_sequence_number;
+  document_sequence_number_ = exploded_state.top.document_sequence_number;
+}
+
 scoped_refptr<ResourceRequestBodyImpl> FrameNavigationEntry::GetPostData()
     const {
   DCHECK(SiteIsolationPolicy::UseSubframeNavigationEntries());
diff --git a/content/browser/frame_host/frame_navigation_entry.h b/content/browser/frame_host/frame_navigation_entry.h
index 39965e2..861dcc4 100644
--- a/content/browser/frame_host/frame_navigation_entry.h
+++ b/content/browser/frame_host/frame_navigation_entry.h
@@ -110,7 +110,7 @@
   void set_referrer(const Referrer& referrer) { referrer_ = referrer; }
   const Referrer& referrer() const { return referrer_; }
 
-  void set_page_state(const PageState& page_state) { page_state_ = page_state; }
+  void SetPageState(const PageState& page_state);
   const PageState& page_state() const { return page_state_; }
 
   // The HTTP method used to navigate.
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 55c5fa4..cbb6084 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -890,7 +890,7 @@
     // We may not find a frame_entry in some cases; ignore the PageState if so.
     // TODO(creis): Remove the "if" once https://crbug.com/522193 is fixed.
     if (frame_entry)
-      frame_entry->set_page_state(params.page_state);
+      frame_entry->SetPageState(params.page_state);
   } else {
     active_entry->SetPageState(params.page_state);
   }
diff --git a/content/browser/frame_host/navigation_entry_impl.cc b/content/browser/frame_host/navigation_entry_impl.cc
index dd1fa64..ac1876b5 100644
--- a/content/browser/frame_host/navigation_entry_impl.cc
+++ b/content/browser/frame_host/navigation_entry_impl.cc
@@ -59,7 +59,7 @@
     base::debug::DumpWithoutCrashing();
     NOTREACHED() << "Shouldn't generate an empty PageState.";
   }
-  node->frame_entry->set_page_state(PageState::CreateFromEncodedData(data));
+  node->frame_entry->SetPageState(PageState::CreateFromEncodedData(data));
 
   for (const ExplodedFrameState& child_state : state.children) {
     NavigationEntryImpl::TreeNode* child_node =
@@ -338,7 +338,7 @@
 
 void NavigationEntryImpl::SetPageState(const PageState& state) {
   if (!SiteIsolationPolicy::UseSubframeNavigationEntries()) {
-    frame_tree_->frame_entry->set_page_state(state);
+    frame_tree_->frame_entry->SetPageState(state);
     return;
   }
 
@@ -360,7 +360,7 @@
   ExplodedPageState exploded_state;
   if (!DecodePageState(state.ToEncodedData(), &exploded_state) ||
       exploded_state.top.children.size() == 0U) {
-    frame_tree_->frame_entry->set_page_state(state);
+    frame_tree_->frame_entry->SetPageState(state);
     return;
   }
 
@@ -835,7 +835,7 @@
       unique_name, item_sequence_number, document_sequence_number,
       site_instance, std::move(source_site_instance), url, referrer, method,
       post_id);
-  frame_entry->set_page_state(page_state);
+  frame_entry->SetPageState(page_state);
   parent_node->children.push_back(
       new NavigationEntryImpl::TreeNode(parent_node, frame_entry));
 }
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 9f20dd2..5269e0d 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -703,7 +703,8 @@
   // subframe in the current tab.  We'll assume it's for the main frame
   // (possibly of a new or different WebContents) otherwise.
   if (SiteIsolationPolicy::UseSubframeNavigationEntries() &&
-      disposition == CURRENT_TAB && render_frame_host->GetParent()) {
+      disposition == WindowOpenDisposition::CURRENT_TAB &&
+      render_frame_host->GetParent()) {
     frame_tree_node_id =
         render_frame_host->frame_tree_node()->frame_tree_node_id();
   }
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc
index 7d79501b..34f364f 100644
--- a/content/browser/frame_host/render_frame_proxy_host.cc
+++ b/content/browser/frame_host/render_frame_proxy_host.cc
@@ -257,7 +257,7 @@
 
   // Since this navigation targeted a specific RenderFrameProxy, it should stay
   // in the current tab.
-  DCHECK_EQ(CURRENT_TAB, params.disposition);
+  DCHECK_EQ(WindowOpenDisposition::CURRENT_TAB, params.disposition);
 
   // TODO(alexmos, creis): Figure out whether |params.user_gesture| needs to be
   // passed in as well.
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
index 53d4230..e948531 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
@@ -88,23 +88,6 @@
                             MESSAGE_FILTER_ERROR_MAX_VALUE);
 }
 
-const wchar_t* kFontsToIgnore[] = {
-    // "Gill Sans Ultra Bold" turns into an Ultra Bold weight "Gill Sans" in
-    // DirectWrite, but most users don't have any other weights. The regular
-    // weight font is named "Gill Sans MT", but that ends up in a different
-    // family with that name. On Mac, there's a "Gill Sans" with various
-    // weights, so CSS authors use { 'font-family': 'Gill Sans',
-    // 'Gill Sans MT', ... } and because of the DirectWrite family futzing,
-    // they end up with an Ultra Bold font, when they just wanted "Gill Sans".
-    // Mozilla implemented a more complicated hack where they effectively
-    // rename the Ultra Bold font to "Gill Sans MT Ultra Bold", but because the
-    // Ultra Bold font is so ugly anyway, we simply ignore it. See
-    // http://www.microsoft.com/typography/fonts/font.aspx?FMID=978 for a
-    // picture of the font, and the file name. We also ignore "Gill Sans Ultra
-    // Bold Condensed".
-    L"gilsanub.ttf", L"gillubcd.ttf",
-};
-
 base::string16 GetWindowsFontsPath() {
   std::vector<base::char16> font_path_chars;
   // SHGetSpecialFolderPath requires at least MAX_PATH characters.
@@ -140,10 +123,14 @@
 };
 
 const RequiredFontStyle kRequiredStyles[] = {
-    {L"open sans", DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
+    // The regular version of Gill Sans is actually in the Gill Sans MT family,
+    // and the Gill Sans family typically contains just the ultra-bold styles.
+    {L"gill sans", DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
      DWRITE_FONT_STYLE_NORMAL},
     {L"helvetica", DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
      DWRITE_FONT_STYLE_NORMAL},
+    {L"open sans", DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
+     DWRITE_FONT_STYLE_NORMAL},
 };
 
 // As a workaround for crbug.com/635932, refuse to load some common fonts that
@@ -615,21 +602,6 @@
 
   base::string16 file_path = base::i18n::FoldCase(file_path_chars.data());
 
-  // Refer to comments in kFontsToIgnore for this block.
-  for (const auto& file_to_ignore : kFontsToIgnore) {
-    // Ok to do ascii comparison since the strings we are looking for are
-    // all ascii.
-    if (base::EndsWith(file_path, file_to_ignore,
-                       base::CompareCase::INSENSITIVE_ASCII)) {
-      // Unlike most other cases in this function, we do not abort loading
-      // the entire family, since we want to specifically ignore particular
-      // font styles and load the rest of the family if it exists. The
-      // renderer can deal with a family with zero files if that ends up
-      // being the case.
-      return true;
-    }
-  }
-
   if (!base::StartsWith(file_path, windows_fonts_path_,
                         base::CompareCase::SENSITIVE) ||
       custom_font_file_loading_mode_ == FORCE) {
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index a4a6da90..2463c00 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -90,7 +90,8 @@
   WebContentsImpl* wc = static_cast<WebContentsImpl*>(shell->web_contents());
   wc->GetFrameTree()->root()->navigator()->RequestOpenURL(
       wc->GetFrameTree()->root()->current_frame_host(), extension_url, false,
-      nullptr, nullptr, Referrer(), CURRENT_TAB, false, true);
+      nullptr, nullptr, Referrer(), WindowOpenDisposition::CURRENT_TAB, false,
+      true);
 
   // Since the navigation above requires a cross-process swap, there will be a
   // speculative/pending RenderFrameHost. Ensure it exists and is in a different
diff --git a/content/browser/service_worker/service_worker_client_utils.cc b/content/browser/service_worker/service_worker_client_utils.cc
index 6f8f367..0cd39b27 100644
--- a/content/browser/service_worker/service_worker_client_utils.cc
+++ b/content/browser/service_worker/service_worker_client_utils.cc
@@ -197,8 +197,8 @@
   OpenURLParams params(
       url, Referrer::SanitizeForRequest(
                url, Referrer(script_url, blink::WebReferrerPolicyDefault)),
-      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-      true /* is_renderer_initiated */);
+      WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui::PAGE_TRANSITION_AUTO_TOPLEVEL, true /* is_renderer_initiated */);
 
   GetContentClient()->browser()->OpenURL(browser_context, params,
                                          base::Bind(&DidOpenURLOnUI, callback));
@@ -230,7 +230,7 @@
   OpenURLParams params(
       url, Referrer::SanitizeForRequest(
                url, Referrer(script_url, blink::WebReferrerPolicyDefault)),
-      frame_tree_node_id, CURRENT_TAB, transition,
+      frame_tree_node_id, WindowOpenDisposition::CURRENT_TAB, transition,
       true /* is_renderer_initiated */);
   web_contents->OpenURL(params);
   new OpenURLObserver(web_contents, frame_tree_node_id, callback);
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index fb5b6d31..f579093f 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -7253,9 +7253,11 @@
   // Now, simulate that both ShowView messages arrive by showing both of the
   // pending WebContents.
   web_contents()->ShowCreatedWindow(process1->GetID(), filter1->routing_id(),
-                                    NEW_FOREGROUND_TAB, gfx::Rect(), true);
+                                    WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                    gfx::Rect(), true);
   web_contents()->ShowCreatedWindow(process2->GetID(), filter2->routing_id(),
-                                    NEW_FOREGROUND_TAB, gfx::Rect(), true);
+                                    WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                                    gfx::Rect(), true);
 
   // Verify that both shells were properly created.
   EXPECT_EQ(3u, Shell::windows().size());
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index abbd9e7..6aabf786 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2056,7 +2056,7 @@
   create_params.opener_render_process_id = render_process_id;
   create_params.opener_render_frame_id = params.opener_render_frame_id;
   create_params.opener_suppressed = params.opener_suppressed;
-  if (params.disposition == NEW_BACKGROUND_TAB)
+  if (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB)
     create_params.initially_hidden = true;
   create_params.renderer_initiated_creation =
       main_frame_route_id != MSG_ROUTING_NONE;
@@ -2117,7 +2117,8 @@
           params.user_gesture, &was_blocked);
     }
     if (!was_blocked) {
-      OpenURLParams open_params(params.target_url, params.referrer, CURRENT_TAB,
+      OpenURLParams open_params(params.target_url, params.referrer,
+                                WindowOpenDisposition::CURRENT_TAB,
                                 ui::PAGE_TRANSITION_LINK,
                                 true /* is_renderer_initiated */);
       open_params.user_gesture = params.user_gesture;
@@ -4527,7 +4528,7 @@
     return;
   }
 
-  frame_entry->set_page_state(page_state);
+  frame_entry->SetPageState(page_state);
   controller_.NotifyEntryChanged(entry);
 }
 
@@ -5107,7 +5108,7 @@
                                       const gfx::Rect& selection_rect,
                                       int active_match_ordinal,
                                       bool final_update) {
-  if (delegate_) {
+  if (delegate_ && !is_being_destroyed_) {
     delegate_->FindReply(this, request_id, number_of_matches, selection_rect,
                          active_match_ordinal, final_update);
   }
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index d1f781f..2111308 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -382,7 +382,8 @@
 
   // Navigate with the subframe's FrameTreeNode ID.
   const GURL url(embedded_test_server()->GetURL("/title1.html"));
-  OpenURLParams params(url, Referrer(), frame_tree_node_id, CURRENT_TAB,
+  OpenURLParams params(url, Referrer(), frame_tree_node_id,
+                       WindowOpenDisposition::CURRENT_TAB,
                        ui::PAGE_TRANSITION_LINK, true);
   shell()->web_contents()->OpenURL(params);
 
diff --git a/content/browser/web_contents/web_drag_dest_mac.mm b/content/browser/web_contents/web_drag_dest_mac.mm
index d549b54..9e595764 100644
--- a/content/browser/web_contents/web_drag_dest_mac.mm
+++ b/content/browser/web_contents/web_drag_dest_mac.mm
@@ -235,9 +235,9 @@
     if ([pboard containsURLDataConvertingTextToURL:YES]) {
       GURL url;
       ui::PopulateURLAndTitleFromPasteboard(&url, NULL, pboard, YES);
-      webContents_->OpenURL(OpenURLParams(
-          url, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_AUTO_BOOKMARK,
-          false));
+      webContents_->OpenURL(
+          OpenURLParams(url, Referrer(), WindowOpenDisposition::CURRENT_TAB,
+                        ui::PAGE_TRANSITION_AUTO_BOOKMARK, false));
       return YES;
     } else {
       return NO;
diff --git a/content/browser/websockets/websocket_impl.cc b/content/browser/websockets/websocket_impl.cc
index 6e64a7e..28bbd8c 100644
--- a/content/browser/websockets/websocket_impl.cc
+++ b/content/browser/websockets/websocket_impl.cc
@@ -43,38 +43,38 @@
 
 typedef net::WebSocketEventInterface::ChannelState ChannelState;
 
-// Convert a mojom::WebSocketMessageType to a
+// Convert a blink::mojom::WebSocketMessageType to a
 // net::WebSocketFrameHeader::OpCode
 net::WebSocketFrameHeader::OpCode MessageTypeToOpCode(
-    mojom::WebSocketMessageType type) {
-  DCHECK(type == mojom::WebSocketMessageType::CONTINUATION ||
-         type == mojom::WebSocketMessageType::TEXT ||
-         type == mojom::WebSocketMessageType::BINARY);
+    blink::mojom::WebSocketMessageType type) {
+  DCHECK(type == blink::mojom::WebSocketMessageType::CONTINUATION ||
+         type == blink::mojom::WebSocketMessageType::TEXT ||
+         type == blink::mojom::WebSocketMessageType::BINARY);
   typedef net::WebSocketFrameHeader::OpCode OpCode;
   // These compile asserts verify that the same underlying values are used for
   // both types, so we can simply cast between them.
   static_assert(
-      static_cast<OpCode>(mojom::WebSocketMessageType::CONTINUATION) ==
+      static_cast<OpCode>(blink::mojom::WebSocketMessageType::CONTINUATION) ==
           net::WebSocketFrameHeader::kOpCodeContinuation,
       "enum values must match for opcode continuation");
   static_assert(
-      static_cast<OpCode>(mojom::WebSocketMessageType::TEXT) ==
+      static_cast<OpCode>(blink::mojom::WebSocketMessageType::TEXT) ==
           net::WebSocketFrameHeader::kOpCodeText,
       "enum values must match for opcode text");
   static_assert(
-      static_cast<OpCode>(mojom::WebSocketMessageType::BINARY) ==
+      static_cast<OpCode>(blink::mojom::WebSocketMessageType::BINARY) ==
           net::WebSocketFrameHeader::kOpCodeBinary,
       "enum values must match for opcode binary");
   return static_cast<OpCode>(type);
 }
 
-mojom::WebSocketMessageType OpCodeToMessageType(
+blink::mojom::WebSocketMessageType OpCodeToMessageType(
     net::WebSocketFrameHeader::OpCode opCode) {
   DCHECK(opCode == net::WebSocketFrameHeader::kOpCodeContinuation ||
          opCode == net::WebSocketFrameHeader::kOpCodeText ||
          opCode == net::WebSocketFrameHeader::kOpCodeBinary);
   // This cast is guaranteed valid by the static_assert() statements above.
-  return static_cast<mojom::WebSocketMessageType>(opCode);
+  return static_cast<blink::mojom::WebSocketMessageType>(opCode);
 }
 
 }  // namespace
@@ -244,12 +244,12 @@
   if (!should_send)
     return WebSocketEventInterface::CHANNEL_ALIVE;
 
-  mojom::WebSocketHandshakeRequestPtr request_to_pass(
-      mojom::WebSocketHandshakeRequest::New());
+  blink::mojom::WebSocketHandshakeRequestPtr request_to_pass(
+      blink::mojom::WebSocketHandshakeRequest::New());
   request_to_pass->url.Swap(&request->url);
   net::HttpRequestHeaders::Iterator it(request->headers);
   while (it.GetNext()) {
-    mojom::HttpHeaderPtr header(mojom::HttpHeader::New());
+    blink::mojom::HttpHeaderPtr header(blink::mojom::HttpHeader::New());
     header->name = it.name();
     header->value = it.value();
     request_to_pass->headers.push_back(std::move(header));
@@ -276,15 +276,15 @@
   if (!should_send)
     return WebSocketEventInterface::CHANNEL_ALIVE;
 
-  mojom::WebSocketHandshakeResponsePtr response_to_pass(
-      mojom::WebSocketHandshakeResponse::New());
+  blink::mojom::WebSocketHandshakeResponsePtr response_to_pass(
+      blink::mojom::WebSocketHandshakeResponse::New());
   response_to_pass->url.Swap(&response->url);
   response_to_pass->status_code = response->status_code;
   response_to_pass->status_text = response->status_text;
   size_t iter = 0;
   std::string name, value;
   while (response->headers->EnumerateHeaderLines(&iter, &name, &value)) {
-    mojom::HttpHeaderPtr header(mojom::HttpHeader::New());
+    blink::mojom::HttpHeaderPtr header(blink::mojom::HttpHeader::New());
     header->name = name;
     header->value = value;
     response_to_pass->headers.push_back(std::move(header));
@@ -350,7 +350,7 @@
 
 WebSocketImpl::WebSocketImpl(
     Delegate* delegate,
-    mojom::WebSocketRequest request,
+    blink::mojom::WebSocketRequest request,
     int frame_id,
     base::TimeDelta delay)
     : delegate_(delegate),
@@ -377,7 +377,7 @@
     const url::Origin& origin,
     const GURL& first_party_for_cookies,
     const std::string& user_agent_override,
-    mojom::WebSocketClientPtr client) {
+    blink::mojom::WebSocketClientPtr client) {
   DVLOG(3) << "WebSocketImpl::AddChannelRequest @"
            << reinterpret_cast<void*>(this)
            << " socket_url=\"" << socket_url << "\" requested_protocols=\""
@@ -415,7 +415,7 @@
 }
 
 void WebSocketImpl::SendFrame(bool fin,
-                              mojom::WebSocketMessageType type,
+                              blink::mojom::WebSocketMessageType type,
                               const std::vector<uint8_t>& data) {
   DVLOG(3) << "WebSocketImpl::SendFrame @"
            << reinterpret_cast<void*>(this) << " fin=" << fin
diff --git a/content/browser/websockets/websocket_impl.h b/content/browser/websockets/websocket_impl.h
index 00c9f0d..fb64613d 100644
--- a/content/browser/websockets/websocket_impl.h
+++ b/content/browser/websockets/websocket_impl.h
@@ -15,8 +15,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "content/common/content_export.h"
-#include "content/common/websocket.mojom.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "third_party/WebKit/public/platform/modules/websockets/websocket.mojom.h"
 
 class GURL;
 
@@ -33,7 +33,7 @@
 
 // Host of net::WebSocketChannel.
 class CONTENT_EXPORT WebSocketImpl
-    : NON_EXPORTED_BASE(public mojom::WebSocket) {
+    : NON_EXPORTED_BASE(public blink::mojom::WebSocket) {
  public:
   class Delegate {
    public:
@@ -45,7 +45,7 @@
   };
 
   WebSocketImpl(Delegate* delegate,
-                mojom::WebSocketRequest request,
+                blink::mojom::WebSocketRequest request,
                 int frame_id,
                 base::TimeDelta delay);
   ~WebSocketImpl() override;
@@ -54,15 +54,15 @@
   // This function is virtual for testing.
   virtual void GoAway();
 
-  // mojom::WebSocket methods:
+  // blink::mojom::WebSocket methods:
   void AddChannelRequest(const GURL& url,
                          const std::vector<std::string>& requested_protocols,
                          const url::Origin& origin,
                          const GURL& first_party_for_cookies,
                          const std::string& user_agent_override,
-                         mojom::WebSocketClientPtr client) override;
+                         blink::mojom::WebSocketClientPtr client) override;
   void SendFrame(bool fin,
-                 mojom::WebSocketMessageType type,
+                 blink::mojom::WebSocketMessageType type,
                  const std::vector<uint8_t>& data) override;
   void SendFlowControl(int64_t quota) override;
   void StartClosingHandshake(uint16_t code, const std::string& reason) override;
@@ -81,9 +81,9 @@
                   const std::string& user_agent_override);
 
   Delegate* delegate_;
-  mojo::Binding<mojom::WebSocket> binding_;
+  mojo::Binding<blink::mojom::WebSocket> binding_;
 
-  mojom::WebSocketClientPtr client_;
+  blink::mojom::WebSocketClientPtr client_;
 
   // The channel we use to send events to the network.
   std::unique_ptr<net::WebSocketChannel> channel_;
diff --git a/content/browser/websockets/websocket_manager.cc b/content/browser/websockets/websocket_manager.cc
index 1d98ba42..9bce39c 100644
--- a/content/browser/websockets/websocket_manager.cc
+++ b/content/browser/websockets/websocket_manager.cc
@@ -53,7 +53,7 @@
 
 // static
 void WebSocketManager::CreateWebSocket(int process_id, int frame_id,
-                                       mojom::WebSocketRequest request) {
+                                       blink::mojom::WebSocketRequest request) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
 
   RenderProcessHost* host = RenderProcessHost::FromID(process_id);
@@ -102,8 +102,9 @@
   }
 }
 
-void WebSocketManager::DoCreateWebSocket(int frame_id,
-                                         mojom::WebSocketRequest request) {
+void WebSocketManager::DoCreateWebSocket(
+    int frame_id,
+    blink::mojom::WebSocketRequest request) {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 
   if (num_pending_connections_ >= kMaxPendingWebSocketConnections) {
@@ -157,7 +158,7 @@
 
 WebSocketImpl* WebSocketManager::CreateWebSocketImpl(
     WebSocketImpl::Delegate* delegate,
-    mojom::WebSocketRequest request,
+    blink::mojom::WebSocketRequest request,
     int frame_id,
     base::TimeDelta delay) {
   return new WebSocketImpl(delegate, std::move(request), frame_id, delay);
diff --git a/content/browser/websockets/websocket_manager.h b/content/browser/websockets/websocket_manager.h
index 4047e435..bee498a 100644
--- a/content/browser/websockets/websocket_manager.h
+++ b/content/browser/websockets/websocket_manager.h
@@ -13,10 +13,6 @@
 #include "content/browser/websockets/websocket_impl.h"
 #include "content/common/content_export.h"
 
-namespace shell {
-class InterfaceRegistry;
-}  // namespace shell
-
 namespace content {
 class StoragePartition;
 
@@ -29,7 +25,7 @@
  public:
   // Called on the UI thread:
   static void CreateWebSocket(int process_id, int frame_id,
-                              mojom::WebSocketRequest request);
+                              blink::mojom::WebSocketRequest request);
 
  protected:
   class Handle;
@@ -41,15 +37,16 @@
   // All other methods must run on the IO thread.
 
   ~WebSocketManager() override;
-  void DoCreateWebSocket(int frame_id, mojom::WebSocketRequest request);
+  void DoCreateWebSocket(int frame_id, blink::mojom::WebSocketRequest request);
   base::TimeDelta CalculateDelay() const;
   void ThrottlingPeriodTimerCallback();
 
   // This is virtual to support testing.
-  virtual WebSocketImpl* CreateWebSocketImpl(WebSocketImpl::Delegate* delegate,
-                                             mojom::WebSocketRequest request,
-                                             int frame_id,
-                                             base::TimeDelta delay);
+  virtual WebSocketImpl* CreateWebSocketImpl(
+      WebSocketImpl::Delegate* delegate,
+      blink::mojom::WebSocketRequest request,
+      int frame_id,
+      base::TimeDelta delay);
 
   // WebSocketImpl::Delegate methods:
   int GetClientProcessId() override;
diff --git a/content/browser/websockets/websocket_manager_unittest.cc b/content/browser/websockets/websocket_manager_unittest.cc
index fc5f94f..c2a90b80 100644
--- a/content/browser/websockets/websocket_manager_unittest.cc
+++ b/content/browser/websockets/websocket_manager_unittest.cc
@@ -22,7 +22,7 @@
 class TestWebSocketImpl : public WebSocketImpl {
  public:
   TestWebSocketImpl(Delegate* delegate,
-                    mojom::WebSocketRequest request,
+                    blink::mojom::WebSocketRequest request,
                     int frame_id,
                     base::TimeDelta delay)
       : WebSocketImpl(delegate, std::move(request), frame_id, delay) {}
@@ -54,13 +54,13 @@
            num_previous_succeeded_connections_;
   }
 
-  void DoCreateWebSocket(mojom::WebSocketRequest request) {
+  void DoCreateWebSocket(blink::mojom::WebSocketRequest request) {
     WebSocketManager::DoCreateWebSocket(MSG_ROUTING_NONE, std::move(request));
   }
 
  private:
   WebSocketImpl* CreateWebSocketImpl(WebSocketImpl::Delegate* delegate,
-                                     mojom::WebSocketRequest request,
+                                     blink::mojom::WebSocketRequest request,
                                      int frame_id,
                                      base::TimeDelta delay) override {
     TestWebSocketImpl* impl =
@@ -91,14 +91,14 @@
 
   void AddMultipleChannels(int number_of_channels) {
     for (int i = 0; i < number_of_channels; ++i) {
-      mojom::WebSocketPtr websocket;
+      blink::mojom::WebSocketPtr websocket;
       websocket_manager_->DoCreateWebSocket(mojo::GetProxy(&websocket));
     }
   }
 
   void AddAndCancelMultipleChannels(int number_of_channels) {
     for (int i = 0; i < number_of_channels; ++i) {
-      mojom::WebSocketPtr websocket;
+      blink::mojom::WebSocketPtr websocket;
       websocket_manager_->DoCreateWebSocket(mojo::GetProxy(&websocket));
       websocket_manager_->sockets().back()->SimulateConnectionError();
     }
@@ -116,7 +116,7 @@
 }
 
 TEST_F(WebSocketManagerTest, CreateWebSocket) {
-  mojom::WebSocketPtr websocket;
+  blink::mojom::WebSocketPtr websocket;
 
   websocket_manager()->DoCreateWebSocket(mojo::GetProxy(&websocket));
 
@@ -124,14 +124,14 @@
 }
 
 TEST_F(WebSocketManagerTest, SendFrameButNotConnectedYet) {
-  mojom::WebSocketPtr websocket;
+  blink::mojom::WebSocketPtr websocket;
 
   websocket_manager()->DoCreateWebSocket(mojo::GetProxy(&websocket));
 
   // This should not crash.
   mojo::Array<uint8_t> data;
   websocket->SendFrame(
-      true, mojom::WebSocketMessageType::TEXT, std::move(data));
+      true, blink::mojom::WebSocketMessageType::TEXT, std::move(data));
 }
 
 TEST_F(WebSocketManagerTest, DelayFor4thPendingConnectionIsZero) {
diff --git a/content/browser/webui/generic_handler.cc b/content/browser/webui/generic_handler.cc
index b26bcd92..71259a8 100644
--- a/content/browser/webui/generic_handler.cc
+++ b/content/browser/webui/generic_handler.cc
@@ -47,8 +47,9 @@
 
   WindowOpenDisposition disposition = ui::DispositionFromClick(
       middle_button, alt_key, ctrl_key, meta_key, shift_key);
-  if (disposition == CURRENT_TAB && target_string == "_blank")
-    disposition = NEW_FOREGROUND_TAB;
+  if (disposition == WindowOpenDisposition::CURRENT_TAB &&
+      target_string == "_blank")
+    disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
 
   web_ui()->GetWebContents()->OpenURL(OpenURLParams(GURL(url_string),
                                                     Referrer(),
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 7b5db9e4..33c5982 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -248,7 +248,6 @@
     "storage_partition_service.mojom",
     "url_loader.mojom",
     "url_loader_factory.mojom",
-    "websocket.mojom",
   ]
 
   import_dirs = [ "//mojo/services" ]
diff --git a/content/common/font_config_ipc_linux.h b/content/common/font_config_ipc_linux.h
index 258c200..0fc85ec5 100644
--- a/content/common/font_config_ipc_linux.h
+++ b/content/common/font_config_ipc_linux.h
@@ -39,8 +39,6 @@
                        SkString* outFamilyName,
                        SkFontStyle* outStyle) override;
 
-  // Returns a new SkTypeface instance or a ref'ed one from the cache. The
-  // caller should adopt the pointer.
   sk_sp<SkTypeface> makeTypeface(const FontIdentity& identity) override
       WARN_UNUSED_RESULT;
 
diff --git a/content/content_common_mojo_bindings.gyp b/content/content_common_mojo_bindings.gyp
index 129b2a3..444c7c1 100644
--- a/content/content_common_mojo_bindings.gyp
+++ b/content/content_common_mojo_bindings.gyp
@@ -18,7 +18,6 @@
           'common/render_frame_message_filter.mojom',
           'common/service_worker/embedded_worker_setup.mojom',
           'common/storage_partition_service.mojom',
-          'common/websocket.mojom',
           '../third_party/WebKit/public/platform/modules/bluetooth/web_bluetooth.mojom',
         ],
         'mojom_typemaps': [
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
new file mode 100644
index 0000000..e630b47
--- /dev/null
+++ b/content/content_renderer.gypi
@@ -0,0 +1,915 @@
+# 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.
+
+{
+  'dependencies': [
+    '../base/base.gyp:base',
+    '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations',
+    '../cc/cc.gyp:cc',
+    '../cc/cc.gyp:cc_proto',
+    '../cc/blink/cc_blink.gyp:cc_blink',
+    '../components/components.gyp:memory_coordinator_child',
+    '../components/url_formatter/url_formatter.gyp:url_formatter',
+    '../device/battery/battery.gyp:device_battery',
+    '../device/battery/battery.gyp:device_battery_mojo_bindings',
+    '../device/vibration/vibration.gyp:device_vibration_mojo_bindings',
+    '../gin/gin.gyp:gin',
+    '../gpu/gpu.gyp:gpu',
+    '../ipc/ipc.gyp:ipc',
+    '../jingle/jingle.gyp:jingle_glue',
+    '../media/blink/media_blink.gyp:media_blink',
+    '../media/gpu/ipc/media_ipc.gyp:media_gpu_ipc_client',
+    '../media/gpu/ipc/media_ipc.gyp:media_gpu_ipc_common',
+    '../media/media.gyp:media',
+    '../media/media.gyp:media_gpu',
+    '../mojo/mojo_edk.gyp:mojo_js_lib',
+    '../net/net.gyp:net',
+    '../services/shell/shell_public.gyp:shell_public',
+    '../skia/skia.gyp:skia',
+    '../skia/skia.gyp:skia_mojo',
+    '../storage/storage_common.gyp:storage_common',
+    '../third_party/WebKit/public/blink.gyp:blink',
+    '../third_party/boringssl/boringssl.gyp:boringssl',
+    '../third_party/icu/icu.gyp:icui18n',
+    '../third_party/icu/icu.gyp:icuuc',
+    '../third_party/libjingle/libjingle.gyp:libjingle',
+    '../third_party/libyuv/libyuv.gyp:libyuv',
+    '../third_party/widevine/cdm/widevine_cdm.gyp:widevine_cdm_version_h',
+    '../ui/accessibility/accessibility.gyp:accessibility',
+    '../ui/display/display.gyp:display',
+    '../ui/events/blink/events_blink.gyp:events_blink',
+    '../ui/events/events.gyp:dom_keycode_converter',
+    '../ui/gfx/gfx.gyp:gfx',
+    '../ui/gfx/gfx.gyp:gfx_geometry',
+    '../ui/gfx/gfx.gyp:gfx_range',
+    '../ui/gfx/gfx.gyp:mojo_geometry_bindings',
+    '../ui/native_theme/native_theme.gyp:native_theme',
+    '../ui/surface/surface.gyp:surface',
+    '../url/ipc/url_ipc.gyp:url_ipc',
+    '../v8/src/v8.gyp:v8',
+    'content_common_mojo_bindings.gyp:content_common_mojo_bindings',
+  ],
+  'include_dirs': [
+    '..',
+    '<(SHARED_INTERMEDIATE_DIR)',  # Needed by key_systems.cc.
+  ],
+  'variables': {
+    'public_renderer_sources': [
+      'public/renderer/android_content_detection_prefixes.cc',
+      'public/renderer/android_content_detection_prefixes.h',
+      'public/renderer/browser_plugin_delegate.cc',
+      'public/renderer/browser_plugin_delegate.h',
+      'public/renderer/chrome_object_extensions_utils.cc',
+      'public/renderer/chrome_object_extensions_utils.h',
+      'public/renderer/content_renderer_client.cc',
+      'public/renderer/content_renderer_client.h',
+      'public/renderer/context_menu_client.h',
+      'public/renderer/document_state.cc',
+      'public/renderer/document_state.h',
+      'public/renderer/media_stream_audio_renderer.h',
+      'public/renderer/media_stream_audio_sink.cc',
+      'public/renderer/media_stream_audio_sink.h',
+      'public/renderer/media_stream_sink.h',
+      'public/renderer/navigation_state.cc',
+      'public/renderer/navigation_state.h',
+      'public/renderer/pepper_plugin_instance.h',
+      'public/renderer/platform_event_observer.h',
+      'public/renderer/render_accessibility.h',
+      'public/renderer/render_frame.h',
+      'public/renderer/render_frame_observer.cc',
+      'public/renderer/render_frame_observer.h',
+      'public/renderer/render_frame_observer_tracker.h',
+      'public/renderer/render_thread.cc',
+      'public/renderer/render_thread.h',
+      'public/renderer/render_thread_observer.cc',
+      'public/renderer/render_thread_observer.h',
+      'public/renderer/render_view.h',
+      'public/renderer/render_view_observer.cc',
+      'public/renderer/render_view_observer.h',
+      'public/renderer/render_view_observer_tracker.h',
+      'public/renderer/render_view_visitor.h',
+      'public/renderer/renderer_ppapi_host.h',
+      'public/renderer/resource_fetcher.h',
+      'public/renderer/video_encode_accelerator.cc',
+      'public/renderer/video_encode_accelerator.h',
+      'public/renderer/media_stream_video_renderer.h',
+    ],
+    'public_renderer_plugin_sources': [
+      'public/renderer/plugin_instance_throttler.h',
+    ],
+    'private_renderer_sources': [
+      'renderer/accessibility/blink_ax_enum_conversion.cc',
+      'renderer/accessibility/blink_ax_enum_conversion.h',
+      'renderer/accessibility/blink_ax_tree_source.cc',
+      'renderer/accessibility/blink_ax_tree_source.h',
+      'renderer/accessibility/render_accessibility_impl.cc',
+      'renderer/accessibility/render_accessibility_impl.h',
+      'renderer/android/address_detector.cc',
+      'renderer/android/address_detector.h',
+      'renderer/android/content_detector.cc',
+      'renderer/android/content_detector.h',
+      'renderer/android/disambiguation_popup_helper.cc',
+      'renderer/android/disambiguation_popup_helper.h',
+      'renderer/android/email_detector.cc',
+      'renderer/android/email_detector.h',
+      'renderer/android/phone_number_detector.cc',
+      'renderer/android/phone_number_detector.h',
+      'renderer/android/renderer_date_time_picker.cc',
+      'renderer/android/renderer_date_time_picker.h',
+      'renderer/android/synchronous_compositor_filter.cc',
+      'renderer/android/synchronous_compositor_filter.h',
+      'renderer/android/synchronous_compositor_output_surface.cc',
+      'renderer/android/synchronous_compositor_output_surface.h',
+      'renderer/android/synchronous_compositor_proxy.cc',
+      'renderer/android/synchronous_compositor_proxy.h',
+      'renderer/android/synchronous_compositor_registry.h',
+      'renderer/background_sync/background_sync_client_impl.cc',
+      'renderer/background_sync/background_sync_client_impl.h',
+      'renderer/bluetooth/bluetooth_type_converters.cc',
+      'renderer/bluetooth/bluetooth_type_converters.h',
+      'renderer/bluetooth/web_bluetooth_impl.cc',
+      'renderer/bluetooth/web_bluetooth_impl.h',
+      'renderer/browser_plugin/browser_plugin.cc',
+      'renderer/browser_plugin/browser_plugin.h',
+      'renderer/browser_plugin/browser_plugin_manager.cc',
+      'renderer/browser_plugin/browser_plugin_manager.h',
+      'renderer/cache_storage/cache_storage_dispatcher.cc',
+      'renderer/cache_storage/cache_storage_dispatcher.h',
+      'renderer/cache_storage/cache_storage_message_filter.cc',
+      'renderer/cache_storage/cache_storage_message_filter.h',
+      'renderer/cache_storage/webserviceworkercachestorage_impl.cc',
+      'renderer/cache_storage/webserviceworkercachestorage_impl.h',
+      'renderer/categorized_worker_pool.cc',
+      'renderer/categorized_worker_pool.h',
+      'renderer/child_frame_compositing_helper.cc',
+      'renderer/child_frame_compositing_helper.h',
+      'renderer/clipboard_utils.cc',
+      'renderer/clipboard_utils.h',
+      'renderer/context_menu_params_builder.cc',
+      'renderer/context_menu_params_builder.h',
+      'renderer/cursor_utils.cc',
+      'renderer/cursor_utils.h',
+      'renderer/device_sensors/device_light_event_pump.cc',
+      'renderer/device_sensors/device_light_event_pump.h',
+      'renderer/device_sensors/device_motion_event_pump.cc',
+      'renderer/device_sensors/device_motion_event_pump.h',
+      'renderer/device_sensors/device_orientation_event_pump.cc',
+      'renderer/device_sensors/device_orientation_event_pump.h',
+      'renderer/device_sensors/device_sensor_event_pump.h',
+      'renderer/devtools/devtools_agent.cc',
+      'renderer/devtools/devtools_agent.h',
+      'renderer/devtools/devtools_agent_filter.cc',
+      'renderer/devtools/devtools_agent_filter.h',
+      'renderer/devtools/devtools_client.cc',
+      'renderer/devtools/devtools_client.h',
+      'renderer/devtools/devtools_cpu_throttler.cc',
+      'renderer/devtools/devtools_cpu_throttler.h',
+      'renderer/devtools/lock_free_circular_queue.h',
+      'renderer/devtools/render_widget_screen_metrics_emulator.cc',
+      'renderer/devtools/render_widget_screen_metrics_emulator.h',
+      'renderer/devtools/v8_sampling_profiler.cc',
+      'renderer/devtools/v8_sampling_profiler.h',
+      'renderer/dom_automation_controller.cc',
+      'renderer/dom_automation_controller.h',
+      'renderer/dom_storage/dom_storage_cached_area.cc',
+      'renderer/dom_storage/dom_storage_cached_area.h',
+      'renderer/dom_storage/dom_storage_dispatcher.cc',
+      'renderer/dom_storage/dom_storage_dispatcher.h',
+      'renderer/dom_storage/dom_storage_proxy.h',
+      'renderer/dom_storage/local_storage_area.cc',
+      'renderer/dom_storage/local_storage_area.h',
+      'renderer/dom_storage/local_storage_cached_area.cc',
+      'renderer/dom_storage/local_storage_cached_area.h',
+      'renderer/dom_storage/local_storage_cached_areas.cc',
+      'renderer/dom_storage/local_storage_cached_areas.h',
+      'renderer/dom_storage/local_storage_namespace.cc',
+      'renderer/dom_storage/local_storage_namespace.h',
+      'renderer/dom_storage/webstoragearea_impl.cc',
+      'renderer/dom_storage/webstoragearea_impl.h',
+      'renderer/dom_storage/webstoragenamespace_impl.cc',
+      'renderer/dom_storage/webstoragenamespace_impl.h',
+      'renderer/drop_data_builder.cc',
+      'renderer/drop_data_builder.h',
+      'renderer/effective_connection_type_helper.cc',
+      'renderer/effective_connection_type_helper.h',
+      'renderer/fetchers/manifest_fetcher.cc',
+      'renderer/fetchers/manifest_fetcher.h',
+      'renderer/fetchers/multi_resolution_image_resource_fetcher.cc',
+      'renderer/fetchers/multi_resolution_image_resource_fetcher.h',
+      'renderer/fetchers/resource_fetcher_impl.cc',
+      'renderer/fetchers/resource_fetcher_impl.h',
+      'renderer/fetchers/web_url_loader_client_impl.cc',
+      'renderer/fetchers/web_url_loader_client_impl.h',
+      'renderer/frame_blame_context.cc',
+      'renderer/frame_blame_context.h',
+      'renderer/gamepad_shared_memory_reader.cc',
+      'renderer/gamepad_shared_memory_reader.h',
+      'renderer/gpu/compositor_dependencies.h',
+      'renderer/gpu/compositor_external_begin_frame_source.cc',
+      'renderer/gpu/compositor_external_begin_frame_source.h',
+      'renderer/gpu/compositor_forwarding_message_filter.cc',
+      'renderer/gpu/compositor_forwarding_message_filter.h',
+      'renderer/gpu/compositor_output_surface.cc',
+      'renderer/gpu/compositor_output_surface.h',
+      'renderer/gpu/frame_swap_message_queue.cc',
+      'renderer/gpu/frame_swap_message_queue.h',
+      'renderer/gpu/gpu_benchmarking_extension.cc',
+      'renderer/gpu/gpu_benchmarking_extension.h',
+      'renderer/gpu/queue_message_swap_promise.cc',
+      'renderer/gpu/queue_message_swap_promise.h',
+      'renderer/gpu/render_widget_compositor.cc',
+      'renderer/gpu/render_widget_compositor.h',
+      'renderer/gpu/render_widget_compositor_delegate.h',
+      'renderer/gpu/stream_texture_host_android.cc',
+      'renderer/gpu/stream_texture_host_android.h',
+      'renderer/history_controller.cc',
+      'renderer/history_controller.h',
+      'renderer/history_entry.cc',
+      'renderer/history_entry.h',
+      'renderer/history_serialization.cc',
+      'renderer/history_serialization.h',
+      'renderer/idle_user_detector.cc',
+      'renderer/idle_user_detector.h',
+      'renderer/image_downloader/image_downloader_impl.cc',
+      'renderer/image_downloader/image_downloader_impl.h',
+      'renderer/ime_event_guard.cc',
+      'renderer/ime_event_guard.h',
+      'renderer/in_process_renderer_thread.cc',
+      'renderer/in_process_renderer_thread.h',
+      'renderer/input/input_event_filter.cc',
+      'renderer/input/input_event_filter.h',
+      'renderer/input/input_handler_manager.cc',
+      'renderer/input/input_handler_manager.h',
+      'renderer/input/input_handler_manager_client.h',
+      'renderer/input/input_handler_wrapper.cc',
+      'renderer/input/input_handler_wrapper.h',
+      'renderer/input/main_thread_event_queue.cc',
+      'renderer/input/main_thread_event_queue.h',
+      'renderer/input/main_thread_input_event_filter.cc',
+      'renderer/input/main_thread_input_event_filter.h',
+      'renderer/input/render_widget_input_handler.cc',
+      'renderer/input/render_widget_input_handler.h',
+      'renderer/input/render_widget_input_handler_delegate.h',
+      'renderer/internal_document_state_data.cc',
+      'renderer/internal_document_state_data.h',
+      'renderer/java/gin_java_bridge_dispatcher.cc',
+      'renderer/java/gin_java_bridge_dispatcher.h',
+      'renderer/java/gin_java_bridge_object.cc',
+      'renderer/java/gin_java_bridge_object.h',
+      'renderer/java/gin_java_bridge_value_converter.cc',
+      'renderer/java/gin_java_bridge_value_converter.h',
+      'renderer/java/gin_java_function_invocation_helper.cc',
+      'renderer/java/gin_java_function_invocation_helper.h',
+      'renderer/manifest/manifest_debug_info.cc',
+      'renderer/manifest/manifest_debug_info.h',
+      'renderer/manifest/manifest_manager.cc',
+      'renderer/manifest/manifest_manager.h',
+      'renderer/manifest/manifest_parser.cc',
+      'renderer/manifest/manifest_parser.h',
+      'renderer/manifest/manifest_uma_util.cc',
+      'renderer/manifest/manifest_uma_util.h',
+      'renderer/media/aec_dump_message_filter.cc',
+      'renderer/media/aec_dump_message_filter.h',
+      'renderer/media/android/media_info_loader.cc',
+      'renderer/media/android/media_info_loader.h',
+      'renderer/media/android/media_player_renderer_client.cc',
+      'renderer/media/android/media_player_renderer_client.h',
+      'renderer/media/android/media_player_renderer_client_factory.cc',
+      'renderer/media/android/media_player_renderer_client_factory.h',
+      'renderer/media/android/media_source_delegate.cc',
+      'renderer/media/android/media_source_delegate.h',
+      'renderer/media/android/renderer_demuxer_android.cc',
+      'renderer/media/android/renderer_demuxer_android.h',
+      'renderer/media/android/renderer_media_player_manager.cc',
+      'renderer/media/android/renderer_media_player_manager.h',
+      'renderer/media/android/renderer_media_session_manager.cc',
+      'renderer/media/android/renderer_media_session_manager.h',
+      'renderer/media/android/renderer_surface_view_manager.cc',
+      'renderer/media/android/renderer_surface_view_manager.h',
+      'renderer/media/android/stream_texture_factory.cc',
+      'renderer/media/android/stream_texture_factory.h',
+      'renderer/media/android/stream_texture_wrapper_impl.cc',
+      'renderer/media/android/stream_texture_wrapper_impl.h',
+      'renderer/media/android/webmediaplayer_android.cc',
+      'renderer/media/android/webmediaplayer_android.h',
+      'renderer/media/android/webmediasession_android.cc',
+      'renderer/media/android/webmediasession_android.h',
+      'renderer/media/audio_decoder.cc',
+      'renderer/media/audio_decoder.h',
+      'renderer/media/audio_device_factory.cc',
+      'renderer/media/audio_device_factory.h',
+      'renderer/media/audio_input_message_filter.cc',
+      'renderer/media/audio_input_message_filter.h',
+      'renderer/media/audio_message_filter.cc',
+      'renderer/media/audio_message_filter.h',
+      'renderer/media/audio_renderer_mixer_manager.cc',
+      'renderer/media/audio_renderer_mixer_manager.h',
+      'renderer/media/audio_renderer_sink_cache.h',
+      'renderer/media/audio_renderer_sink_cache_impl.cc',
+      'renderer/media/audio_renderer_sink_cache_impl.h',
+      'renderer/media/cdm/pepper_cdm_wrapper.h',
+      'renderer/media/cdm/pepper_cdm_wrapper_impl.cc',
+      'renderer/media/cdm/pepper_cdm_wrapper_impl.h',
+      'renderer/media/cdm/ppapi_decryptor.cc',
+      'renderer/media/cdm/ppapi_decryptor.h',
+      'renderer/media/cdm/render_cdm_factory.cc',
+      'renderer/media/cdm/render_cdm_factory.h',
+      'renderer/media/html_audio_element_capturer_source.cc',
+      'renderer/media/html_audio_element_capturer_source.h',
+      'renderer/media/external_media_stream_audio_source.cc',
+      'renderer/media/external_media_stream_audio_source.h',
+      'renderer/media/local_media_stream_audio_source.cc',
+      'renderer/media/local_media_stream_audio_source.h',
+      'renderer/media/media_permission_dispatcher.cc',
+      'renderer/media/media_permission_dispatcher.h',
+      'renderer/media/media_stream_audio_deliverer.h',
+      'renderer/media/media_stream_audio_level_calculator.cc',
+      'renderer/media/media_stream_audio_level_calculator.h',
+      'renderer/media/media_stream_audio_source.cc',
+      'renderer/media/media_stream_audio_source.h',
+      'renderer/media/media_stream_audio_track.cc',
+      'renderer/media/media_stream_audio_track.h',
+      'renderer/media/media_stream_center.h',
+      'renderer/media/media_stream_constraints_util.cc',
+      'renderer/media/media_stream_constraints_util.h',
+      'renderer/media/media_stream_dispatcher.h',
+      'renderer/media/media_stream_dispatcher_eventhandler.h',
+      'renderer/media/media_stream_source.cc',
+      'renderer/media/media_stream_source.h',
+      'renderer/media/media_stream_track.cc',
+      'renderer/media/media_stream_track.h',
+      'renderer/media/midi_message_filter.cc',
+      'renderer/media/midi_message_filter.h',
+      'renderer/media/render_media_client.cc',
+      'renderer/media/render_media_client.h',
+      'renderer/media/render_media_log.cc',
+      'renderer/media/render_media_log.h',
+      'renderer/media/renderer_gpu_video_accelerator_factories.cc',
+      'renderer/media/renderer_gpu_video_accelerator_factories.h',
+      'renderer/media/renderer_webaudiodevice_impl.cc',
+      'renderer/media/renderer_webaudiodevice_impl.h',
+      'renderer/media/renderer_webmediaplayer_delegate.cc',
+      'renderer/media/renderer_webmediaplayer_delegate.h',
+      'renderer/media/renderer_webmidiaccessor_impl.cc',
+      'renderer/media/renderer_webmidiaccessor_impl.h',
+      'renderer/media/video_capture_impl.cc',
+      'renderer/media/video_capture_impl.h',
+      'renderer/media/video_capture_impl_manager.cc',
+      'renderer/media/video_capture_impl_manager.h',
+      'renderer/media/video_capture_message_filter.cc',
+      'renderer/media/video_capture_message_filter.h',
+      'renderer/media/web_media_element_source_utils.cc',
+      'renderer/media/web_media_element_source_utils.h',
+      'renderer/media/webaudio_media_stream_source.cc',
+      'renderer/media/webaudio_media_stream_source.h',
+      'renderer/media/webmediaplayer_ms.cc',
+      'renderer/media/webmediaplayer_ms.h',
+      'renderer/media/webmediaplayer_ms_compositor.cc',
+      'renderer/media/webmediaplayer_ms_compositor.h',
+      'renderer/menu_item_builder.cc',
+      'renderer/menu_item_builder.h',
+      'renderer/mojo/blink_interface_provider_impl.cc',
+      'renderer/mojo/blink_interface_provider_impl.h',
+      'renderer/mojo/interface_provider_js_wrapper.cc',
+      'renderer/mojo/interface_provider_js_wrapper.h',
+      'renderer/mojo_bindings_controller.cc',
+      'renderer/mojo_bindings_controller.h',
+      'renderer/mojo_context_state.cc',
+      'renderer/mojo_context_state.h',
+      'renderer/mojo_main_runner.cc',
+      'renderer/mojo_main_runner.h',
+      'renderer/mouse_lock_dispatcher.cc',
+      'renderer/mouse_lock_dispatcher.h',
+      'renderer/navigation_state_impl.cc',
+      'renderer/navigation_state_impl.h',
+      'renderer/net_info_helper.cc',
+      'renderer/net_info_helper.h',
+      'renderer/origin_trials/web_trial_token_validator_impl.cc',
+      'renderer/origin_trials/web_trial_token_validator_impl.h',
+      'renderer/peripheral_content_heuristic.cc',
+      'renderer/peripheral_content_heuristic.h',
+      'renderer/presentation/presentation_connection_client.cc',
+      'renderer/presentation/presentation_connection_client.h',
+      'renderer/presentation/presentation_dispatcher.cc',
+      'renderer/presentation/presentation_dispatcher.h',
+      'renderer/push_messaging/push_messaging_dispatcher.cc',
+      'renderer/push_messaging/push_messaging_dispatcher.h',
+      'renderer/render_frame_impl.cc',
+      'renderer/render_frame_impl.h',
+      'renderer/render_frame_proxy.cc',
+      'renderer/render_frame_proxy.h',
+      'renderer/render_process.h',
+      'renderer/render_process_impl.cc',
+      'renderer/render_process_impl.h',
+      'renderer/render_thread_impl.cc',
+      'renderer/render_thread_impl.h',
+      'renderer/render_view_impl.cc',
+      'renderer/render_view_impl.h',
+      'renderer/render_view_impl_android.cc',
+      'renderer/render_view_linux.cc',
+      'renderer/render_view_win.cc',
+      'renderer/render_widget.cc',
+      'renderer/render_widget.h',
+      'renderer/render_widget_fullscreen.cc',
+      'renderer/render_widget_fullscreen.h',
+      'renderer/render_widget_mouse_lock_dispatcher.cc',
+      'renderer/render_widget_mouse_lock_dispatcher.h',
+      'renderer/render_widget_owner_delegate.h',
+      'renderer/renderer_blink_platform_impl.cc',
+      'renderer/renderer_blink_platform_impl.h',
+      'renderer/renderer_clipboard_delegate.cc',
+      'renderer/renderer_clipboard_delegate.h',
+      'renderer/renderer_main.cc',
+      'renderer/renderer_main_platform_delegate.h',
+      'renderer/renderer_main_platform_delegate_android.cc',
+      'renderer/renderer_main_platform_delegate_linux.cc',
+      'renderer/renderer_main_platform_delegate_mac.mm',
+      'renderer/renderer_main_platform_delegate_win.cc',
+      'renderer/renderer_webapplicationcachehost_impl.cc',
+      'renderer/renderer_webapplicationcachehost_impl.h',
+      'renderer/renderer_webcolorchooser_impl.cc',
+      'renderer/renderer_webcolorchooser_impl.h',
+      'renderer/renderer_webcookiejar_impl.cc',
+      'renderer/renderer_webcookiejar_impl.h',
+      'renderer/resizing_mode_selector.cc',
+      'renderer/resizing_mode_selector.h',
+      'renderer/sad_plugin.cc',
+      'renderer/sad_plugin.h',
+      'renderer/savable_resources.cc',
+      'renderer/savable_resources.h',
+      'renderer/scheduler/resource_dispatch_throttler.cc',
+      'renderer/scheduler/resource_dispatch_throttler.h',
+      'renderer/screen_orientation/screen_orientation_dispatcher.cc',
+      'renderer/screen_orientation/screen_orientation_dispatcher.h',
+      'renderer/screen_orientation/screen_orientation_observer.cc',
+      'renderer/screen_orientation/screen_orientation_observer.h',
+      'renderer/service_worker/embedded_worker_devtools_agent.cc',
+      'renderer/service_worker/embedded_worker_devtools_agent.h',
+      'renderer/service_worker/embedded_worker_dispatcher.cc',
+      'renderer/service_worker/embedded_worker_dispatcher.h',
+      'renderer/service_worker/service_worker_context_client.cc',
+      'renderer/service_worker/service_worker_context_client.h',
+      'renderer/service_worker/service_worker_context_message_filter.cc',
+      'renderer/service_worker/service_worker_context_message_filter.h',
+      'renderer/service_worker/service_worker_type_util.cc',
+      'renderer/service_worker/service_worker_type_util.h',
+      'renderer/shared_memory_seqlock_reader.cc',
+      'renderer/shared_memory_seqlock_reader.h',
+      'renderer/shared_worker/embedded_shared_worker_content_settings_client_proxy.cc',
+      'renderer/shared_worker/embedded_shared_worker_content_settings_client_proxy.h',
+      'renderer/shared_worker/embedded_shared_worker_stub.cc',
+      'renderer/shared_worker/embedded_shared_worker_stub.h',
+      'renderer/shared_worker_repository.cc',
+      'renderer/shared_worker_repository.h',
+      'renderer/skia_benchmarking_extension.cc',
+      'renderer/skia_benchmarking_extension.h',
+      'renderer/speech_recognition_dispatcher.cc',
+      'renderer/speech_recognition_dispatcher.h',
+      'renderer/stats_collection_controller.cc',
+      'renderer/stats_collection_controller.h',
+      'renderer/stats_collection_observer.cc',
+      'renderer/stats_collection_observer.h',
+      'renderer/text_input_client_observer.cc',
+      'renderer/text_input_client_observer.h',
+      'renderer/theme_helper_mac.h',
+      'renderer/theme_helper_mac.mm',
+      'renderer/top_level_blame_context.cc',
+      'renderer/top_level_blame_context.h',
+      'renderer/web_frame_utils.cc',
+      'renderer/web_frame_utils.h',
+      'renderer/web_ui_extension.cc',
+      'renderer/web_ui_extension.h',
+      'renderer/web_ui_extension_data.cc',
+      'renderer/web_ui_extension_data.h',
+      'renderer/webclipboard_impl.cc',
+      'renderer/webclipboard_impl.h',
+      'renderer/webgraphicscontext3d_provider_impl.cc',
+      'renderer/webgraphicscontext3d_provider_impl.h',
+      'renderer/webpublicsuffixlist_impl.cc',
+      'renderer/webpublicsuffixlist_impl.h',
+      'renderer/webscrollbarbehavior_impl_gtkoraura.cc',
+      'renderer/webscrollbarbehavior_impl_gtkoraura.h',
+      'renderer/webscrollbarbehavior_impl_mac.h',
+      'renderer/webscrollbarbehavior_impl_mac.mm',
+      'renderer/websharedworker_proxy.cc',
+      'renderer/websharedworker_proxy.h',
+    ],
+    # Put WebRTC-related sources in the plugin+WebRTC section below.
+    'private_renderer_plugin_sources': [
+      'renderer/pepper/audio_helper.cc',
+      'renderer/pepper/audio_helper.h',
+      'renderer/pepper/content_decryptor_delegate.cc',
+      'renderer/pepper/content_decryptor_delegate.h',
+      'renderer/pepper/content_renderer_pepper_host_factory.cc',
+      'renderer/pepper/content_renderer_pepper_host_factory.h',
+      'renderer/pepper/event_conversion.cc',
+      'renderer/pepper/event_conversion.h',
+      'renderer/pepper/fullscreen_container.h',
+      'renderer/pepper/gfx_conversion.h',
+      'renderer/pepper/host_array_buffer_var.cc',
+      'renderer/pepper/host_array_buffer_var.h',
+      'renderer/pepper/host_dispatcher_wrapper.cc',
+      'renderer/pepper/host_dispatcher_wrapper.h',
+      'renderer/pepper/host_globals.cc',
+      'renderer/pepper/host_globals.h',
+      'renderer/pepper/host_resource_var.cc',
+      'renderer/pepper/host_resource_var.h',
+      'renderer/pepper/host_var_tracker.cc',
+      'renderer/pepper/host_var_tracker.h',
+      'renderer/pepper/message_channel.cc',
+      'renderer/pepper/message_channel.h',
+      'renderer/pepper/pepper_audio_controller.cc',
+      'renderer/pepper/pepper_audio_controller.h',
+      'renderer/pepper/pepper_audio_encoder_host.cc',
+      'renderer/pepper/pepper_audio_encoder_host.h',
+      'renderer/pepper/pepper_audio_input_host.cc',
+      'renderer/pepper/pepper_audio_input_host.h',
+      'renderer/pepper/pepper_broker.cc',
+      'renderer/pepper/pepper_broker.h',
+      'renderer/pepper/pepper_browser_connection.cc',
+      'renderer/pepper/pepper_browser_connection.h',
+      'renderer/pepper/pepper_camera_device_host.cc',
+      'renderer/pepper/pepper_camera_device_host.h',
+      'renderer/pepper/pepper_compositor_host.cc',
+      'renderer/pepper/pepper_compositor_host.h',
+      'renderer/pepper/pepper_device_enumeration_host_helper.cc',
+      'renderer/pepper/pepper_device_enumeration_host_helper.h',
+      'renderer/pepper/pepper_file_chooser_host.cc',
+      'renderer/pepper/pepper_file_chooser_host.h',
+      'renderer/pepper/pepper_file_ref_renderer_host.cc',
+      'renderer/pepper/pepper_file_ref_renderer_host.h',
+      'renderer/pepper/pepper_file_system_host.cc',
+      'renderer/pepper/pepper_file_system_host.h',
+      'renderer/pepper/pepper_graphics_2d_host.cc',
+      'renderer/pepper/pepper_graphics_2d_host.h',
+      'renderer/pepper/pepper_hung_plugin_filter.cc',
+      'renderer/pepper/pepper_hung_plugin_filter.h',
+      'renderer/pepper/pepper_in_process_resource_creation.cc',
+      'renderer/pepper/pepper_in_process_resource_creation.h',
+      'renderer/pepper/pepper_in_process_router.cc',
+      'renderer/pepper/pepper_in_process_router.h',
+      'renderer/pepper/pepper_media_device_manager.cc',
+      'renderer/pepper/pepper_media_device_manager.h',
+      'renderer/pepper/pepper_platform_audio_input.cc',
+      'renderer/pepper/pepper_platform_audio_input.h',
+      'renderer/pepper/pepper_platform_audio_output.cc',
+      'renderer/pepper/pepper_platform_audio_output.h',
+      'renderer/pepper/pepper_platform_camera_device.cc',
+      'renderer/pepper/pepper_platform_camera_device.h',
+      'renderer/pepper/pepper_platform_video_capture.cc',
+      'renderer/pepper/pepper_platform_video_capture.h',
+      'renderer/pepper/pepper_plugin_instance_impl.cc',
+      'renderer/pepper/pepper_plugin_instance_impl.h',
+      'renderer/pepper/pepper_plugin_instance_metrics.cc',
+      'renderer/pepper/pepper_plugin_instance_metrics.h',
+      'renderer/pepper/pepper_plugin_registry.cc',
+      'renderer/pepper/pepper_plugin_registry.h',
+      'renderer/pepper/pepper_proxy_channel_delegate_impl.cc',
+      'renderer/pepper/pepper_proxy_channel_delegate_impl.h',
+      'renderer/pepper/pepper_try_catch.cc',
+      'renderer/pepper/pepper_try_catch.h',
+      'renderer/pepper/pepper_url_loader_host.cc',
+      'renderer/pepper/pepper_url_loader_host.h',
+      'renderer/pepper/pepper_video_capture_host.cc',
+      'renderer/pepper/pepper_video_capture_host.h',
+      'renderer/pepper/pepper_video_decoder_host.cc',
+      'renderer/pepper/pepper_video_decoder_host.h',
+      'renderer/pepper/pepper_video_encoder_host.cc',
+      'renderer/pepper/pepper_video_encoder_host.h',
+      'renderer/pepper/pepper_webplugin_impl.cc',
+      'renderer/pepper/pepper_webplugin_impl.h',
+      'renderer/pepper/pepper_websocket_host.cc',
+      'renderer/pepper/pepper_websocket_host.h',
+      'renderer/pepper/plugin_instance_throttler_impl.cc',
+      'renderer/pepper/plugin_instance_throttler_impl.h',
+      'renderer/pepper/plugin_module.cc',
+      'renderer/pepper/plugin_module.h',
+      'renderer/pepper/plugin_object.cc',
+      'renderer/pepper/plugin_object.h',
+      'renderer/pepper/plugin_power_saver_helper.cc',
+      'renderer/pepper/plugin_power_saver_helper.h',
+      'renderer/pepper/ppapi_preferences_builder.cc',
+      'renderer/pepper/ppapi_preferences_builder.h',
+      'renderer/pepper/ppb_audio_impl.cc',
+      'renderer/pepper/ppb_audio_impl.h',
+      'renderer/pepper/ppb_broker_impl.cc',
+      'renderer/pepper/ppb_broker_impl.h',
+      'renderer/pepper/ppb_buffer_impl.cc',
+      'renderer/pepper/ppb_buffer_impl.h',
+      'renderer/pepper/ppb_flash_message_loop_impl.cc',
+      'renderer/pepper/ppb_flash_message_loop_impl.h',
+      'renderer/pepper/ppb_graphics_3d_impl.cc',
+      'renderer/pepper/ppb_graphics_3d_impl.h',
+      'renderer/pepper/ppb_image_data_impl.cc',
+      'renderer/pepper/ppb_image_data_impl.h',
+      'renderer/pepper/ppb_proxy_impl.cc',
+      'renderer/pepper/ppb_proxy_impl.h',
+      'renderer/pepper/ppb_var_deprecated_impl.cc',
+      'renderer/pepper/ppb_var_deprecated_impl.h',
+      'renderer/pepper/ppb_video_decoder_impl.cc',
+      'renderer/pepper/ppb_video_decoder_impl.h',
+      'renderer/pepper/renderer_ppapi_host_impl.cc',
+      'renderer/pepper/renderer_ppapi_host_impl.h',
+      'renderer/pepper/renderer_restrict_dispatch_group.h',
+      'renderer/pepper/resource_converter.cc',
+      'renderer/pepper/resource_converter.h',
+      'renderer/pepper/resource_creation_impl.cc',
+      'renderer/pepper/resource_creation_impl.h',
+      'renderer/pepper/url_request_info_util.cc',
+      'renderer/pepper/url_request_info_util.h',
+      'renderer/pepper/url_response_info_util.cc',
+      'renderer/pepper/url_response_info_util.h',
+      'renderer/pepper/v8_var_converter.cc',
+      'renderer/pepper/v8_var_converter.h',
+      'renderer/pepper/v8object_var.cc',
+      'renderer/pepper/v8object_var.h',
+      'renderer/pepper/video_decoder_shim.cc',
+      'renderer/pepper/video_decoder_shim.h',
+      'renderer/pepper/video_encoder_shim.cc',
+      'renderer/pepper/video_encoder_shim.h',
+      'renderer/render_widget_fullscreen_pepper.cc',
+      'renderer/render_widget_fullscreen_pepper.h',
+    ],
+    'public_renderer_webrtc_sources': [
+      'public/renderer/media_stream_renderer_factory.h',
+      'public/renderer/media_stream_utils.cc',
+      'public/renderer/media_stream_utils.h',
+      'public/renderer/media_stream_video_sink.cc',
+      'public/renderer/media_stream_video_sink.h',
+      'public/renderer/webrtc_log_message_delegate.h',
+    ],
+    # WebRTC-specific sources. Put WebRTC plugin-related stuff in the
+    # Plugin+WebRTC section below.
+    'private_renderer_webrtc_sources': [
+      'renderer/media/audio_repetition_detector.cc',
+      'renderer/media/audio_repetition_detector.h',
+      'renderer/media/audio_track_recorder.cc',
+      'renderer/media/audio_track_recorder.h',
+      'renderer/media/canvas_capture_handler.cc',
+      'renderer/media/canvas_capture_handler.h',
+      'renderer/media/gpu/rtc_video_decoder.cc',
+      'renderer/media/gpu/rtc_video_decoder.h',
+      'renderer/media/gpu/rtc_video_decoder_factory.cc',
+      'renderer/media/gpu/rtc_video_decoder_factory.h',
+      'renderer/media/gpu/rtc_video_encoder.cc',
+      'renderer/media/gpu/rtc_video_encoder.h',
+      'renderer/media/gpu/rtc_video_encoder_factory.cc',
+      'renderer/media/gpu/rtc_video_encoder_factory.h',
+      'renderer/media/html_video_element_capturer_source.cc',
+      'renderer/media/html_video_element_capturer_source.h',
+      'renderer/media/image_capture_frame_grabber.cc',
+      'renderer/media/image_capture_frame_grabber.h',
+      'renderer/media/media_recorder_handler.cc',
+      'renderer/media/media_recorder_handler.h',
+      'renderer/media/media_stream.cc',
+      'renderer/media/media_stream.h',
+      'renderer/media/media_stream_audio_processor.cc',
+      'renderer/media/media_stream_audio_processor.h',
+      'renderer/media/media_stream_audio_processor_options.cc',
+      'renderer/media/media_stream_audio_processor_options.h',
+      'renderer/media/media_stream_center.cc',
+      'renderer/media/media_stream_dispatcher.cc',
+      'renderer/media/media_stream_registry_interface.h',
+      'renderer/media/media_stream_renderer_factory_impl.cc',
+      'renderer/media/media_stream_renderer_factory_impl.h',
+      'renderer/media/media_stream_video_capturer_source.cc',
+      'renderer/media/media_stream_video_capturer_source.h',
+      'renderer/media/media_stream_video_renderer_sink.cc',
+      'renderer/media/media_stream_video_renderer_sink.h',
+      'renderer/media/media_stream_video_source.cc',
+      'renderer/media/media_stream_video_source.h',
+      'renderer/media/media_stream_video_track.cc',
+      'renderer/media/media_stream_video_track.h',
+      'renderer/media/peer_connection_tracker.cc',
+      'renderer/media/peer_connection_tracker.h',
+      'renderer/media/remote_media_stream_impl.cc',
+      'renderer/media/remote_media_stream_impl.h',
+      'renderer/media/rtc_certificate.cc',
+      'renderer/media/rtc_certificate.h',
+      'renderer/media/rtc_certificate_generator.cc',
+      'renderer/media/rtc_certificate_generator.h',
+      'renderer/media/rtc_data_channel_handler.cc',
+      'renderer/media/rtc_data_channel_handler.h',
+      'renderer/media/rtc_dtmf_sender_handler.cc',
+      'renderer/media/rtc_dtmf_sender_handler.h',
+      'renderer/media/rtc_peer_connection_handler.cc',
+      'renderer/media/rtc_peer_connection_handler.h',
+      'renderer/media/secure_display_link_tracker.h',
+      'renderer/media/speech_recognition_audio_sink.cc',
+      'renderer/media/speech_recognition_audio_sink.h',
+      'renderer/media/track_audio_renderer.cc',
+      'renderer/media/track_audio_renderer.h',
+      'renderer/media/user_media_client_impl.cc',
+      'renderer/media/video_track_adapter.cc',
+      'renderer/media/video_track_adapter.h',
+      'renderer/media/video_track_recorder.cc',
+      'renderer/media/video_track_recorder.h',
+      'renderer/media/webrtc/media_stream_remote_video_source.cc',
+      'renderer/media/webrtc/media_stream_remote_video_source.h',
+      'renderer/media/webrtc/media_stream_track_metrics.cc',
+      'renderer/media/webrtc/media_stream_track_metrics.h',
+      'renderer/media/webrtc/media_stream_video_webrtc_sink.cc',
+      'renderer/media/webrtc/media_stream_video_webrtc_sink.h',
+      'renderer/media/webrtc/peer_connection_dependency_factory.cc',
+      'renderer/media/webrtc/peer_connection_dependency_factory.h',
+      'renderer/media/webrtc/peer_connection_remote_audio_source.cc',
+      'renderer/media/webrtc/peer_connection_remote_audio_source.h',
+      'renderer/media/webrtc/processed_local_audio_source.cc',
+      'renderer/media/webrtc/processed_local_audio_source.h',
+      'renderer/media/webrtc/stun_field_trial.cc',
+      'renderer/media/webrtc/stun_field_trial.h',
+      'renderer/media/webrtc/track_observer.cc',
+      'renderer/media/webrtc/track_observer.h',
+      'renderer/media/webrtc/webrtc_audio_sink.cc',
+      'renderer/media/webrtc/webrtc_audio_sink.h',
+      'renderer/media/webrtc/webrtc_media_stream_adapter.cc',
+      'renderer/media/webrtc/webrtc_media_stream_adapter.h',
+      'renderer/media/webrtc/webrtc_video_capturer_adapter.cc',
+      'renderer/media/webrtc/webrtc_video_capturer_adapter.h',
+      'renderer/media/webrtc/webrtc_video_frame_adapter.cc',
+      'renderer/media/webrtc/webrtc_video_frame_adapter.h',
+      'renderer/media/webrtc_audio_device_impl.cc',
+      'renderer/media/webrtc_audio_device_impl.h',
+      'renderer/media/webrtc_audio_device_not_impl.cc',
+      'renderer/media/webrtc_audio_device_not_impl.h',
+      'renderer/media/webrtc_audio_renderer.cc',
+      'renderer/media/webrtc_audio_renderer.h',
+      'renderer/media/webrtc_local_audio_source_provider.cc',
+      'renderer/media/webrtc_local_audio_source_provider.h',
+      'renderer/media/webrtc_logging.cc',
+      'renderer/media/webrtc_logging.h',
+      'renderer/media/webrtc_uma_histograms.cc',
+      'renderer/media/webrtc_uma_histograms.h',
+      'renderer/p2p/empty_network_manager.cc',
+      'renderer/p2p/empty_network_manager.h',
+      'renderer/p2p/filtering_network_manager.cc',
+      'renderer/p2p/filtering_network_manager.h',
+      'renderer/p2p/host_address_request.cc',
+      'renderer/p2p/host_address_request.h',
+      'renderer/p2p/ipc_network_manager.cc',
+      'renderer/p2p/ipc_network_manager.h',
+      'renderer/p2p/ipc_socket_factory.cc',
+      'renderer/p2p/ipc_socket_factory.h',
+      'renderer/p2p/network_list_observer.h',
+      'renderer/p2p/network_manager_uma.cc',
+      'renderer/p2p/network_manager_uma.h',
+      'renderer/p2p/port_allocator.cc',
+      'renderer/p2p/port_allocator.h',
+      'renderer/p2p/socket_client_impl.cc',
+      'renderer/p2p/socket_client_impl.h',
+      'renderer/p2p/socket_dispatcher.cc',
+      'renderer/p2p/socket_dispatcher.h',
+    ],
+    # Stuff only used when both WebRTC and plugins are enabled.
+    'private_renderer_plugin_webrtc_sources': [
+      'renderer/media/pepper_to_video_track_adapter.cc',
+      'renderer/media/pepper_to_video_track_adapter.h',
+      'renderer/media/video_track_to_pepper_adapter.cc',
+      'renderer/media/video_track_to_pepper_adapter.h',
+      'renderer/pepper/pepper_media_stream_audio_track_host.cc',
+      'renderer/pepper/pepper_media_stream_audio_track_host.h',
+      'renderer/pepper/pepper_media_stream_track_host_base.cc',
+      'renderer/pepper/pepper_media_stream_track_host_base.h',
+      'renderer/pepper/pepper_media_stream_video_track_host.cc',
+      'renderer/pepper/pepper_media_stream_video_track_host.h',
+      'renderer/pepper/pepper_video_destination_host.cc',
+      'renderer/pepper/pepper_video_destination_host.h',
+      'renderer/pepper/pepper_video_source_host.cc',
+      'renderer/pepper/pepper_video_source_host.h',
+    ]
+  },
+  'sources': [
+    '<@(public_renderer_sources)',
+    '<@(private_renderer_sources)',
+  ],
+  'conditions': [
+    ['OS=="mac"', {
+      'sources!': [
+        'common/process_watcher_posix.cc',
+        'renderer/webscrollbarbehavior_impl_gtkoraura.cc',
+        'renderer/webscrollbarbehavior_impl_gtkoraura.h',
+      ],
+      'sources': [
+        'renderer/external_popup_menu.cc',
+        'renderer/external_popup_menu.h',
+      ],
+    }, {
+      'sources!': [
+        'renderer/webscrollbarbehavior_impl_mac.h',
+        'renderer/webscrollbarbehavior_impl_mac.mm',
+      ],
+    }],
+    ['OS=="android"', {
+      'sources': [
+        'renderer/external_popup_menu.cc',
+        'renderer/external_popup_menu.h',
+      ],
+      'dependencies': [
+        '../build/android/ndk.gyp:cpu_features',
+        '../third_party/libphonenumber/libphonenumber.gyp:libphonenumber',
+      ],
+      'dependencies!': [
+        '../device/battery/battery.gyp:device_battery',
+      ],
+    }, {
+      'sources!': [
+        'renderer/java/gin_java_bridge_dispatcher.cc',
+        'renderer/java/gin_java_bridge_dispatcher.h',
+        'renderer/java/gin_java_bridge_object.cc',
+        'renderer/java/gin_java_bridge_object.h',
+        'renderer/java/gin_java_bridge_value_converter.cc',
+        'renderer/java/gin_java_bridge_value_converter.h',
+        'renderer/java/gin_java_function_invocation_helper.cc',
+        'renderer/java/gin_java_function_invocation_helper.h',
+      ],
+      'dependencies': [
+        '../media/cast/cast.gyp:cast_sender',
+      ]
+    }],
+    ['enable_webrtc==1', {
+      'dependencies': [
+        '../third_party/libjingle/libjingle.gyp:libjingle_webrtc',
+        '../third_party/webrtc/modules/modules.gyp:audio_device',
+        '../third_party/webrtc/modules/modules.gyp:audio_processing',
+        '../third_party/webrtc/p2p/p2p.gyp:libstunprober',
+        '<(DEPTH)/content/content.gyp:common_features',
+        '<(DEPTH)/content/content.gyp:feature_h264_with_openh264_ffmpeg',
+        '<(DEPTH)/crypto/crypto.gyp:crypto',
+      ],
+      'sources': [
+        '<@(public_renderer_webrtc_sources)',
+        '<@(private_renderer_webrtc_sources)',
+      ],
+    },{  # enable_webrtc==0
+      'sources': [
+        'renderer/media/webrtc_logging.h',
+        'renderer/media/webrtc_logging_noop.cc',
+      ],
+      # TODO(jrg): Understand better how media_stream_ is tied into Chromium,
+      # and maybe remove the OS=="android" section? http://crbug.com/113172
+      'conditions': [
+        ['OS=="android"', {
+          'sources/': [
+            ['exclude', '^renderer/media/media_stream_'],
+          ],
+        }],
+      ],
+    }],
+    ['enable_plugins==1', {
+      'sources': [
+        '<@(public_renderer_plugin_sources)',
+        '<@(private_renderer_plugin_sources)',
+      ],
+      'conditions': [
+        ['OS=="android"', {
+          'sources!': [
+            # Android does not build FFmpeg, which these depend on.
+            'renderer/pepper/video_decoder_shim.cc',
+            'renderer/pepper/video_decoder_shim.h',
+            'renderer/pepper/video_encoder_shim.cc',
+            'renderer/pepper/video_encoder_shim.h',
+          ],
+        }],
+        ['enable_webrtc==1', {
+          'sources': [
+            '<@(private_renderer_plugin_webrtc_sources)',
+          ],
+        }],
+      ],
+      'dependencies': [
+        '../ppapi/ppapi_internal.gyp:ppapi_host',
+        '../ppapi/ppapi_internal.gyp:ppapi_proxy',
+        '../ppapi/ppapi_internal.gyp:ppapi_shared',
+        '../third_party/opus/opus.gyp:opus',
+      ],
+    }],
+    ['enable_pepper_cdms != 1', {
+      'sources!': [
+        'renderer/media/cdm/pepper_cdm_wrapper.h',
+        'renderer/media/cdm/pepper_cdm_wrapper_impl.cc',
+        'renderer/media/cdm/pepper_cdm_wrapper_impl.h',
+        'renderer/media/cdm/ppapi_decryptor.cc',
+        'renderer/media/cdm/ppapi_decryptor.h',
+      ],
+    }],
+    ['enable_browser_cdms==1', {
+      'sources': [
+        'renderer/media/cdm/proxy_media_keys.cc',
+        'renderer/media/cdm/proxy_media_keys.h',
+        'renderer/media/cdm/renderer_cdm_manager.cc',
+        'renderer/media/cdm/renderer_cdm_manager.h',
+      ],
+    }],
+    ['use_seccomp_bpf==1', {
+      'defines': ['USE_SECCOMP_BPF'],
+    }],
+  ],
+  'target_conditions': [
+    ['OS=="android"', {
+      'sources/': [
+        ['include', '^renderer/render_view_linux\\.cc$'],
+      ],
+    }],
+  ],
+}
diff --git a/content/public/browser/page_navigator.cc b/content/public/browser/page_navigator.cc
index 40225e1a..e8a61bbf 100644
--- a/content/public/browser/page_navigator.cc
+++ b/content/public/browser/page_navigator.cc
@@ -44,12 +44,11 @@
 OpenURLParams::OpenURLParams()
     : uses_post(false),
       frame_tree_node_id(-1),
-      disposition(UNKNOWN),
+      disposition(WindowOpenDisposition::UNKNOWN),
       transition(ui::PAGE_TRANSITION_LINK),
       is_renderer_initiated(false),
       should_replace_current_entry(false),
-      user_gesture(true) {
-}
+      user_gesture(true) {}
 
 OpenURLParams::OpenURLParams(const OpenURLParams& other) = default;
 
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index df97348..74e59b1 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -96,9 +96,10 @@
   // It suffers from http://crbug.com/523 and that is why browser overrides
   // it with proper implementation.
   GURL url = GURL(kViewSourceScheme + std::string(":") + page_url.spec());
-  OpenURLFromTab(source, OpenURLParams(url, Referrer(),
-                                       NEW_FOREGROUND_TAB,
-                                       ui::PAGE_TRANSITION_LINK, false));
+  OpenURLFromTab(
+      source,
+      OpenURLParams(url, Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                    ui::PAGE_TRANSITION_LINK, false));
 }
 
 void WebContentsDelegate::ViewSourceForFrame(WebContents* source,
@@ -106,9 +107,10 @@
                                              const PageState& page_state) {
   // Same as ViewSourceForTab, but for given subframe.
   GURL url = GURL(kViewSourceScheme + std::string(":") + frame_url.spec());
-  OpenURLFromTab(source, OpenURLParams(url, Referrer(),
-                                       NEW_FOREGROUND_TAB,
-                                       ui::PAGE_TRANSITION_LINK, false));
+  OpenURLFromTab(
+      source,
+      OpenURLParams(url, Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                    ui::PAGE_TRANSITION_LINK, false));
 }
 
 bool WebContentsDelegate::PreHandleKeyboardEvent(
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 5627e6f..293ceb3c 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -57,7 +57,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(content::EditingBehavior,
                           content::EDITING_BEHAVIOR_LAST)
 IPC_ENUM_TRAITS_MAX_VALUE(WindowOpenDisposition,
-                          WINDOW_OPEN_DISPOSITION_LAST)
+                          WindowOpenDisposition::MAX_VALUE)
 IPC_ENUM_TRAITS_MAX_VALUE(net::RequestPriority, net::MAXIMUM_PRIORITY)
 IPC_ENUM_TRAITS_MAX_VALUE(content::V8CacheOptions,
                           content::V8_CACHE_OPTIONS_LAST)
diff --git a/content/public/renderer/BUILD.gn b/content/public/renderer/BUILD.gn
index 05c6df7..74205af 100644
--- a/content/public/renderer/BUILD.gn
+++ b/content/public/renderer/BUILD.gn
@@ -38,11 +38,6 @@
     "context_menu_client.h",
     "document_state.cc",
     "document_state.h",
-    "media_stream_audio_renderer.h",
-    "media_stream_audio_sink.cc",
-    "media_stream_audio_sink.h",
-    "media_stream_sink.h",
-    "media_stream_video_renderer.h",
     "navigation_state.cc",
     "navigation_state.h",
     "pepper_plugin_instance.h",
@@ -96,9 +91,14 @@
 
   if (enable_webrtc) {
     sources += [
+      "media_stream_audio_renderer.h",
+      "media_stream_audio_sink.cc",
+      "media_stream_audio_sink.h",
       "media_stream_renderer_factory.h",
+      "media_stream_sink.h",
       "media_stream_utils.cc",
       "media_stream_utils.h",
+      "media_stream_video_renderer.h",
       "media_stream_video_sink.cc",
       "media_stream_video_sink.h",
       "webrtc_log_message_delegate.h",
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 02e4ed9..c192a87 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -238,30 +238,8 @@
     "media/cdm/ppapi_decryptor.h",
     "media/cdm/render_cdm_factory.cc",
     "media/cdm/render_cdm_factory.h",
-    "media/external_media_stream_audio_source.cc",
-    "media/external_media_stream_audio_source.h",
-    "media/html_audio_element_capturer_source.cc",
-    "media/html_audio_element_capturer_source.h",
-    "media/local_media_stream_audio_source.cc",
-    "media/local_media_stream_audio_source.h",
     "media/media_permission_dispatcher.cc",
     "media/media_permission_dispatcher.h",
-    "media/media_stream_audio_deliverer.h",
-    "media/media_stream_audio_level_calculator.cc",
-    "media/media_stream_audio_level_calculator.h",
-    "media/media_stream_audio_source.cc",
-    "media/media_stream_audio_source.h",
-    "media/media_stream_audio_track.cc",
-    "media/media_stream_audio_track.h",
-    "media/media_stream_center.h",
-    "media/media_stream_constraints_util.cc",
-    "media/media_stream_constraints_util.h",
-    "media/media_stream_dispatcher.h",
-    "media/media_stream_dispatcher_eventhandler.h",
-    "media/media_stream_source.cc",
-    "media/media_stream_source.h",
-    "media/media_stream_track.cc",
-    "media/media_stream_track.h",
     "media/midi_message_filter.cc",
     "media/midi_message_filter.h",
     "media/render_media_client.cc",
@@ -284,8 +262,6 @@
     "media/video_capture_message_filter.h",
     "media/web_media_element_source_utils.cc",
     "media/web_media_element_source_utils.h",
-    "media/webaudio_media_stream_source.cc",
-    "media/webaudio_media_stream_source.h",
     "media/webmediaplayer_ms.cc",
     "media/webmediaplayer_ms.h",
     "media/webmediaplayer_ms_compositor.cc",
@@ -417,8 +393,6 @@
     "webscrollbarbehavior_impl_mac.mm",
     "websharedworker_proxy.cc",
     "websharedworker_proxy.h",
-    "websockethandle_impl.cc",
-    "websockethandle_impl.h",
   ]
 
   configs += [
@@ -537,25 +511,6 @@
     ]
   }
 
-  # TODO(jrg): remove the OS=="android" section?
-  # http://crbug.com/113172
-  # Understand better how media_stream_ is tied into Chromium.
-  if (!enable_webrtc && is_android) {
-    sources -= [
-      "media/media_stream_audio_level_calculator.cc",
-      "media/media_stream_audio_level_calculator.h",
-      "media/media_stream_audio_track.cc",
-      "media/media_stream_audio_track.h",
-      "media/media_stream_center.h",
-      "media/media_stream_constraints_util.cc",
-      "media/media_stream_constraints_util.h",
-      "media/media_stream_dispatcher.h",
-      "media/media_stream_dispatcher_eventhandler.h",
-      "media/media_stream_track.cc",
-      "media/media_stream_track.h",
-    ]
-  }
-
   if (enable_webrtc) {
     # WebRTC plugin-related stuff goes in a different section below.
     sources += [
@@ -565,6 +520,8 @@
       "media/audio_track_recorder.h",
       "media/canvas_capture_handler.cc",
       "media/canvas_capture_handler.h",
+      "media/external_media_stream_audio_source.cc",
+      "media/external_media_stream_audio_source.h",
       "media/gpu/rtc_video_decoder.cc",
       "media/gpu/rtc_video_decoder.h",
       "media/gpu/rtc_video_decoder_factory.cc",
@@ -573,23 +530,43 @@
       "media/gpu/rtc_video_encoder.h",
       "media/gpu/rtc_video_encoder_factory.cc",
       "media/gpu/rtc_video_encoder_factory.h",
+      "media/html_audio_element_capturer_source.cc",
+      "media/html_audio_element_capturer_source.h",
       "media/html_video_element_capturer_source.cc",
       "media/html_video_element_capturer_source.h",
       "media/image_capture_frame_grabber.cc",
       "media/image_capture_frame_grabber.h",
+      "media/local_media_stream_audio_source.cc",
+      "media/local_media_stream_audio_source.h",
       "media/media_recorder_handler.cc",
       "media/media_recorder_handler.h",
       "media/media_stream.cc",
       "media/media_stream.h",
+      "media/media_stream_audio_deliverer.h",
+      "media/media_stream_audio_level_calculator.cc",
+      "media/media_stream_audio_level_calculator.h",
       "media/media_stream_audio_processor.cc",
       "media/media_stream_audio_processor.h",
       "media/media_stream_audio_processor_options.cc",
       "media/media_stream_audio_processor_options.h",
+      "media/media_stream_audio_source.cc",
+      "media/media_stream_audio_source.h",
+      "media/media_stream_audio_track.cc",
+      "media/media_stream_audio_track.h",
       "media/media_stream_center.cc",
+      "media/media_stream_center.h",
+      "media/media_stream_constraints_util.cc",
+      "media/media_stream_constraints_util.h",
       "media/media_stream_dispatcher.cc",
+      "media/media_stream_dispatcher.h",
+      "media/media_stream_dispatcher_eventhandler.h",
       "media/media_stream_registry_interface.h",
       "media/media_stream_renderer_factory_impl.cc",
       "media/media_stream_renderer_factory_impl.h",
+      "media/media_stream_source.cc",
+      "media/media_stream_source.h",
+      "media/media_stream_track.cc",
+      "media/media_stream_track.h",
       "media/media_stream_video_capturer_source.cc",
       "media/media_stream_video_capturer_source.h",
       "media/media_stream_video_renderer_sink.cc",
@@ -622,6 +599,8 @@
       "media/video_track_adapter.h",
       "media/video_track_recorder.cc",
       "media/video_track_recorder.h",
+      "media/webaudio_media_stream_source.cc",
+      "media/webaudio_media_stream_source.h",
       "media/webrtc/media_stream_remote_video_source.cc",
       "media/webrtc/media_stream_remote_video_source.h",
       "media/webrtc/media_stream_track_metrics.cc",
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 8b253ccb..1436a86 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -78,15 +78,6 @@
       ack_pending_(false),
       reset_token_(0),
       weak_factory_(this) {
-  // There's only one AXObjectCache for the root of a local frame tree,
-  // so if this frame's parent is local we can safely do nothing.
-  if (render_frame_ &&
-      render_frame_->GetWebFrame() &&
-      render_frame_->GetWebFrame()->parent() &&
-      render_frame_->GetWebFrame()->parent()->isWebLocalFrame()) {
-    return;
-  }
-
   WebView* web_view = render_frame_->GetRenderView()->GetWebView();
   WebSettings* settings = web_view->settings();
   settings->setAccessibilityEnabled(true);
diff --git a/content/renderer/dom_automation_controller.h b/content/renderer/dom_automation_controller.h
index 67d98e2..ac09e4a 100644
--- a/content/renderer/dom_automation_controller.h
+++ b/content/renderer/dom_automation_controller.h
@@ -115,7 +115,7 @@
   gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
       v8::Isolate* isolate) override;
 
-  // RenderViewObserver
+  // RenderFrameObserver
   void OnDestruct() override;
   void DidCreateScriptContext(v8::Local<v8::Context> context,
                               int extension_group,
diff --git a/content/renderer/media/gpu/rtc_video_encoder.cc b/content/renderer/media/gpu/rtc_video_encoder.cc
index 1718e97..da955a90 100644
--- a/content/renderer/media/gpu/rtc_video_encoder.cc
+++ b/content/renderer/media/gpu/rtc_video_encoder.cc
@@ -32,9 +32,6 @@
 
 namespace {
 
-// Used for timestamp conversions.
-static const int64_t kMsToRtpTimestamp = 90;
-
 // Translate from webrtc::VideoCodecType and webrtc::VideoCodec to
 // media::VideoCodecProfile.
 media::VideoCodecProfile WebRTCVideoCodecToVideoCodecProfile(
@@ -477,25 +474,27 @@
   output_buffers_free_count_--;
 
   // Derive the capture time (in ms) and RTP timestamp (in 90KHz ticks).
-  int64_t rtp_timestamp, capture_time_ms;
+  int64_t capture_time_us, capture_time_ms;
+  uint32_t rtp_timestamp;
+
   if (!timestamp.is_zero()) {
-    // Get RTP timestamp value.
-    rtp_timestamp = timestamp.ToInternalValue();
-    capture_time_ms = rtp_timestamp / kMsToRtpTimestamp;
+    capture_time_us = timestamp.InMicroseconds();;
+    capture_time_ms = timestamp.InMilliseconds();
   } else {
     // Fallback to the current time if encoder does not provide timestamp.
-    rtp_timestamp = rtc::TimeMicros() * kMsToRtpTimestamp /
-                    base::Time::kMicrosecondsPerMillisecond;
-    capture_time_ms =
-        rtc::TimeMicros() / base::Time::kMicrosecondsPerMillisecond;
+    capture_time_us = rtc::TimeMicros();
+    capture_time_ms = capture_time_us / base::Time::kMicrosecondsPerMillisecond;
   }
+  // RTP timestamp can wrap around. Get the lower 32 bits.
+  rtp_timestamp = static_cast<uint32_t>(
+      capture_time_us * 90 / base::Time::kMicrosecondsPerMillisecond);
 
   webrtc::EncodedImage image(
       reinterpret_cast<uint8_t*>(output_buffer->memory()), payload_size,
       output_buffer->mapped_size());
   image._encodedWidth = input_visible_size_.width();
   image._encodedHeight = input_visible_size_.height();
-  image._timeStamp = static_cast<uint32_t>(rtp_timestamp);
+  image._timeStamp = rtp_timestamp;
   image.capture_time_ms_ = capture_time_ms;
   image._frameType =
       (key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta);
@@ -572,13 +571,15 @@
   }
 
   if (requires_copy) {
+    const base::TimeDelta timestamp =
+        frame ? frame->timestamp()
+              : base::TimeDelta::FromMilliseconds(next_frame->ntp_time_ms());
     base::SharedMemory* input_buffer = input_buffers_[index];
     frame = media::VideoFrame::WrapExternalSharedMemory(
         media::PIXEL_FORMAT_I420, input_frame_coded_size_,
         gfx::Rect(input_visible_size_), input_visible_size_,
         reinterpret_cast<uint8_t*>(input_buffer->memory()),
-        input_buffer->mapped_size(), input_buffer->handle(), 0,
-        base::TimeDelta());
+        input_buffer->mapped_size(), input_buffer->handle(), 0, timestamp);
     if (!frame.get()) {
       LogAndNotifyError(FROM_HERE, "failed to create frame",
                         media::VideoEncodeAccelerator::kPlatformFailureError);
@@ -610,9 +611,6 @@
       return;
     }
   }
-  // Use the timestamp set from WebRTC and set it in 90 kHz.
-  frame->set_timestamp(
-      base::TimeDelta::FromInternalValue(next_frame->timestamp()));
   frame->AddDestructionObserver(media::BindToCurrentLoop(
       base::Bind(&RTCVideoEncoder::Impl::EncodeFrameFinished, this, index)));
   video_encoder_->Encode(frame, next_frame_keyframe);
diff --git a/content/renderer/media/rtc_peer_connection_handler.cc b/content/renderer/media/rtc_peer_connection_handler.cc
index 8112398..d4cf78c 100644
--- a/content/renderer/media/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/rtc_peer_connection_handler.cc
@@ -710,6 +710,10 @@
         UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.CandidatePairType_TCP",
                                   counter, counter_max);
         break;
+      case webrtc::kEnumCounterDtlsHandshakeError:
+        UMA_HISTOGRAM_ENUMERATION("WebRTC.PeerConnection.DtlsHandshakeError",
+                                  counter, counter_max);
+        break;
       default:
         // The default clause is expected to reach when new enum types are
         // added.
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index fbd8279..9136254f 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -131,7 +131,6 @@
 #include "content/renderer/web_frame_utils.h"
 #include "content/renderer/web_ui_extension.h"
 #include "content/renderer/websharedworker_proxy.h"
-#include "content/renderer/websockethandle_impl.h"
 #include "crypto/sha2.h"
 #include "gin/modules/module_registry.h"
 #include "media/audio/audio_output_device.h"
@@ -317,7 +316,7 @@
 
 namespace {
 
-const size_t kExtraCharsBeforeAndAfterSelection = 100;
+const int kExtraCharsBeforeAndAfterSelection = 100;
 
 typedef std::map<int, RenderFrameImpl*> RoutingIDFrameMap;
 static base::LazyInstance<RoutingIDFrameMap> g_routing_id_frame_map =
@@ -1818,26 +1817,22 @@
 
 void RenderFrameImpl::OnAdjustSelectionByCharacterOffset(int start_adjust,
                                                          int end_adjust) {
-  size_t start, length;
-  if (!GetRenderWidget()->webwidget()->caretOrSelectionRange(
-      &start, &length)) {
+  WebRange range = GetRenderWidget()->webwidget()->caretOrSelectionRange();
+  if (range.isNull())
     return;
-  }
 
   // Sanity checks to disallow empty and out of range selections.
-  if (start_adjust - end_adjust > static_cast<int>(length)
-      || static_cast<int>(start) + start_adjust < 0) {
+  if (start_adjust - end_adjust > range.length() ||
+      range.startOffset() + start_adjust < 0)
     return;
-  }
+
+  base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
 
   // A negative adjust amount moves the selection towards the beginning of
   // the document, a positive amount moves the selection towards the end of
   // the document.
-  start += start_adjust;
-  length += end_adjust - start_adjust;
-
-  base::AutoReset<bool> handling_select_range(&handling_select_range_, true);
-  frame_->selectRange(WebRange(start, length));
+  frame_->selectRange(WebRange(range.startOffset() + start_adjust,
+                               range.length() + end_adjust - start_adjust));
 }
 
 void RenderFrameImpl::OnUnselect() {
@@ -4295,15 +4290,6 @@
   return push_messaging_dispatcher_;
 }
 
-void RenderFrameImpl::willOpenWebSocket(blink::WebSocketHandle* handle) {
-  // Initialize the WebSocketHandle with our InterfaceProvider to provide the
-  // WebSocket implementation with context about this frame. This is important
-  // so that the browser can show UI associated with the WebSocket (e.g., for
-  // certificate errors).
-  static_cast<WebSocketHandleImpl*>(handle)->Initialize(
-      blink_interface_provider_.get());
-}
-
 void RenderFrameImpl::willStartUsingPeerConnectionHandler(
     blink::WebRTCPeerConnectionHandler* handler) {
 #if defined(ENABLE_WEBRTC)
@@ -5668,27 +5654,27 @@
   } else
 #endif
   {
-    size_t location, length;
-    if (!GetRenderWidget()->webwidget()->caretOrSelectionRange(
-            &location, &length)) {
+    WebRange selection =
+        GetRenderWidget()->webwidget()->caretOrSelectionRange();
+    if (selection.isNull())
       return;
-    }
 
-    range = gfx::Range(location, location + length);
+    range = gfx::Range(selection.startOffset(), selection.endOffset());
 
     if (GetRenderWidget()->webwidget()->textInputType() !=
         blink::WebTextInputTypeNone) {
       // If current focused element is editable, we will send 100 more chars
       // before and after selection. It is for input method surrounding text
       // feature.
-      if (location > kExtraCharsBeforeAndAfterSelection)
-        offset = location - kExtraCharsBeforeAndAfterSelection;
+      if (selection.startOffset() > kExtraCharsBeforeAndAfterSelection)
+        offset = selection.startOffset() - kExtraCharsBeforeAndAfterSelection;
       else
         offset = 0;
-      length = location + length - offset + kExtraCharsBeforeAndAfterSelection;
+      size_t length =
+          selection.endOffset() - offset + kExtraCharsBeforeAndAfterSelection;
       text = frame_->rangeAsText(WebRange(offset, length));
     } else {
-      offset = location;
+      offset = selection.startOffset();
       text = frame_->selectionAsText();
       // http://crbug.com/101435
       // In some case, frame->selectionAsText() returned text's length is not
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 8632729..1f866b17 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -598,7 +598,6 @@
                            blink::WebStorageQuotaCallbacks callbacks) override;
   blink::WebPushClient* pushClient() override;
   blink::WebPresentationClient* presentationClient() override;
-  void willOpenWebSocket(blink::WebSocketHandle* handle) override;
   void willStartUsingPeerConnectionHandler(
       blink::WebRTCPeerConnectionHandler* handler) override;
   blink::WebUserMediaClient* userMediaClient() override;
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 96316d4..4053b91 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -449,7 +449,7 @@
       blink::WebStringToGURL(
           request.httpHeaderField(blink::WebString::fromUTF8("Referer"))),
       request.referrerPolicy());
-  params.disposition = CURRENT_TAB;
+  params.disposition = WindowOpenDisposition::CURRENT_TAB;
   params.should_replace_current_entry = should_replace_current_entry;
   params.user_gesture =
       blink::WebUserGestureIndicator::isProcessingUserGesture();
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 0fe2dd1..85bfba36 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -308,22 +308,22 @@
     WebNavigationPolicy policy) {
   switch (policy) {
     case blink::WebNavigationPolicyIgnore:
-      return IGNORE_ACTION;
+      return WindowOpenDisposition::IGNORE_ACTION;
     case blink::WebNavigationPolicyDownload:
-      return SAVE_TO_DISK;
+      return WindowOpenDisposition::SAVE_TO_DISK;
     case blink::WebNavigationPolicyCurrentTab:
-      return CURRENT_TAB;
+      return WindowOpenDisposition::CURRENT_TAB;
     case blink::WebNavigationPolicyNewBackgroundTab:
-      return NEW_BACKGROUND_TAB;
+      return WindowOpenDisposition::NEW_BACKGROUND_TAB;
     case blink::WebNavigationPolicyNewForegroundTab:
-      return NEW_FOREGROUND_TAB;
+      return WindowOpenDisposition::NEW_FOREGROUND_TAB;
     case blink::WebNavigationPolicyNewWindow:
-      return NEW_WINDOW;
+      return WindowOpenDisposition::NEW_WINDOW;
     case blink::WebNavigationPolicyNewPopup:
-      return NEW_POPUP;
+      return WindowOpenDisposition::NEW_POPUP;
   default:
     NOTREACHED() << "Unexpected WebNavigationPolicy";
-    return IGNORE_ACTION;
+    return WindowOpenDisposition::IGNORE_ACTION;
   }
 }
 
@@ -1580,7 +1580,8 @@
   view_params.swapped_out = false;
   // WebCore will take care of setting the correct name.
   view_params.replicated_frame_state = FrameReplicationState();
-  view_params.hidden = (params.disposition == NEW_BACKGROUND_TAB);
+  view_params.hidden =
+      (params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB);
   view_params.never_visible = never_visible;
   view_params.next_page_id = 1;
   view_params.initial_size = initial_size;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index d5b61b7..c185258 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -110,6 +110,7 @@
 using blink::WebPagePopup;
 using blink::WebPoint;
 using blink::WebPopupType;
+using blink::WebRange;
 using blink::WebRect;
 using blink::WebScreenInfo;
 using blink::WebSize;
@@ -1881,11 +1882,10 @@
   if (webwidget_->compositionRange(&location, &length)) {
     range->set_start(location);
     range->set_end(location + length);
-  } else if (webwidget_->caretOrSelectionRange(&location, &length)) {
-    range->set_start(location);
-    range->set_end(location + length);
   } else {
-    *range = gfx::Range::InvalidRange();
+    WebRange web_range = webwidget_->caretOrSelectionRange();
+    range->set_start(web_range.startOffset());
+    range->set_end(web_range.endOffset());
   }
 }
 
diff --git a/content/renderer/render_widget_browsertest.cc b/content/renderer/render_widget_browsertest.cc
index bf81972..4972f78 100644
--- a/content/renderer/render_widget_browsertest.cc
+++ b/content/renderer/render_widget_browsertest.cc
@@ -19,6 +19,10 @@
     widget()->OnResize(params);
   }
 
+  void GetCompositionRange(gfx::Range* range) {
+    widget()->GetCompositionRange(range);
+  }
+
   bool next_paint_is_resize_ack() {
     return widget()->next_paint_is_resize_ack();
   }
@@ -101,5 +105,38 @@
   EXPECT_TRUE(next_paint_is_resize_ack());
 }
 
+TEST_F(RenderWidgetTest, GetCompositionRangeValidComposition) {
+  LoadHTML(
+      "<div contenteditable>EDITABLE</div>"
+      "<script> document.querySelector('div').focus(); </script>");
+  blink::WebVector<blink::WebCompositionUnderline> emptyUnderlines;
+  widget()->webwidget()->setComposition("hello", emptyUnderlines, 3, 3);
+  gfx::Range range;
+  GetCompositionRange(&range);
+  EXPECT_TRUE(range.IsValid());
+  EXPECT_EQ(0U, range.start());
+  EXPECT_EQ(5U, range.end());
+}
+
+TEST_F(RenderWidgetTest, GetCompositionRangeValidSelection) {
+  LoadHTML(
+      "<div>NOT EDITABLE</div>"
+      "<script> document.execCommand('selectAll'); </script>");
+  gfx::Range range;
+  GetCompositionRange(&range);
+  EXPECT_TRUE(range.IsValid());
+  EXPECT_EQ(0U, range.start());
+  EXPECT_EQ(12U, range.end());
+}
+
+TEST_F(RenderWidgetTest, GetCompositionRangeInvalid) {
+  LoadHTML("<div>NOT EDITABLE</div>");
+  gfx::Range range;
+  GetCompositionRange(&range);
+  // If this test ever starts failing, one likely outcome is that WebRange
+  // and gfx::Range::InvalidRange are no longer expressed in the same
+  // values of start/end.
+  EXPECT_FALSE(range.IsValid());
+}
 
 }  // namespace content
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 00b53f68..8943ec3 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -71,7 +71,6 @@
 #include "content/renderer/webclipboard_impl.h"
 #include "content/renderer/webgraphicscontext3d_provider_impl.h"
 #include "content/renderer/webpublicsuffixlist_impl.h"
-#include "content/renderer/websockethandle_impl.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/config/gpu_info.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
@@ -399,10 +398,6 @@
       default_task_runner_, channel1, channel2);
 }
 
-blink::WebSocketHandle* RendererBlinkPlatformImpl::createWebSocketHandle() {
-  return new WebSocketHandleImpl(loading_task_runner_);
-}
-
 blink::WebPrescientNetworking*
 RendererBlinkPlatformImpl::prescientNetworking() {
   return GetContentClient()->renderer()->GetPrescientNetworking();
@@ -967,6 +962,7 @@
 void RendererBlinkPlatformImpl::createHTMLAudioElementCapturer(
     WebMediaStream* web_media_stream,
     WebMediaPlayer* web_media_player) {
+#if defined(ENABLE_WEBRTC)
   DCHECK(web_media_stream);
   DCHECK(web_media_player);
 
@@ -989,6 +985,7 @@
 
   media_stream_source->ConnectToTrack(web_media_stream_track);
   web_media_stream->addTrack(web_media_stream_track);
+#endif
 }
 
 //------------------------------------------------------------------------------
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index abf9422..5bee698 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -92,7 +92,6 @@
   bool isLinkVisited(unsigned long long linkHash) override;
   void createMessageChannel(blink::WebMessagePortChannel** channel1,
                             blink::WebMessagePortChannel** channel2) override;
-  blink::WebSocketHandle* createWebSocketHandle() override;
   blink::WebPrescientNetworking* prescientNetworking() override;
   void cacheMetadata(const blink::WebURL&,
                      int64_t,
diff --git a/content/renderer/websockethandle_impl.cc b/content/renderer/websockethandle_impl.cc
deleted file mode 100644
index 5191be9..0000000
--- a/content/renderer/websockethandle_impl.cc
+++ /dev/null
@@ -1,299 +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 "content/renderer/websockethandle_impl.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <string>
-#include <utility>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "third_party/WebKit/public/platform/InterfaceProvider.h"
-#include "third_party/WebKit/public/platform/Platform.h"
-#include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-#include "third_party/WebKit/public/platform/WebURL.h"
-#include "third_party/WebKit/public/platform/WebVector.h"
-#include "third_party/WebKit/public/platform/modules/websockets/WebSocketHandle.h"
-#include "third_party/WebKit/public/platform/modules/websockets/WebSocketHandleClient.h"
-#include "third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h"
-#include "third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h"
-#include "url/gurl.h"
-#include "url/origin.h"
-
-using blink::WebSecurityOrigin;
-using blink::WebSocketHandle;
-using blink::WebSocketHandleClient;
-using blink::WebString;
-using blink::WebURL;
-using blink::WebVector;
-
-namespace content {
-namespace {
-
-const uint16_t kAbnormalShutdownOpCode = 1006;
-
-}  // namespace
-
-WebSocketHandleImpl::WebSocketHandleImpl(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-    : client_(nullptr),
-      client_binding_(this),
-      task_runner_(std::move(task_runner)),
-      did_initialize_(false) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " created";
-}
-
-void WebSocketHandleImpl::Initialize(
-    blink::InterfaceProvider* interface_provider) {
-  DCHECK(!websocket_);
-  DCHECK(!did_initialize_);
-
-  interface_provider->getInterface(mojo::GetProxy(&websocket_));
-
-  websocket_.set_connection_error_handler(
-      base::Bind(&WebSocketHandleImpl::OnConnectionError,
-                 base::Unretained(this)));
-  did_initialize_ = true;
-}
-
-void WebSocketHandleImpl::connect(const WebURL& url,
-                                  const WebVector<WebString>& protocols,
-                                  const WebSecurityOrigin& origin,
-                                  const WebURL& first_party_for_cookies,
-                                  const WebString& user_agent_override,
-                                  WebSocketHandleClient* client) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " Connect(" << url.string().utf8() << ", "
-           << origin.toString().utf8() << ")";
-
-  // It is insufficient to test if websocket_ is non-null as Disconnect() sets
-  // websocket_ to null.
-  if (!did_initialize_)
-    Initialize(blink::Platform::current()->interfaceProvider());
-
-  DCHECK(websocket_);
-
-  DCHECK(!client_);
-  DCHECK(client);
-  client_ = client;
-
-  std::vector<std::string> protocols_to_pass(protocols.size());
-  for (size_t i = 0; i < protocols.size(); ++i)
-    protocols_to_pass[i] = protocols[i].utf8();
-
-  websocket_->AddChannelRequest(
-      url, protocols_to_pass, origin, first_party_for_cookies,
-      user_agent_override.latin1(),
-      client_binding_.CreateInterfacePtrAndBind(task_runner_));
-}
-
-void WebSocketHandleImpl::send(bool fin,
-                               WebSocketHandle::MessageType type,
-                               const char* data,
-                               size_t size) {
-  DCHECK(websocket_);
-
-  mojom::WebSocketMessageType type_to_pass;
-  switch (type) {
-    case WebSocketHandle::MessageTypeContinuation:
-      type_to_pass = mojom::WebSocketMessageType::CONTINUATION;
-      break;
-    case WebSocketHandle::MessageTypeText:
-      type_to_pass = mojom::WebSocketMessageType::TEXT;
-      break;
-    case WebSocketHandle::MessageTypeBinary:
-      type_to_pass = mojom::WebSocketMessageType::BINARY;
-      break;
-    default:
-      NOTREACHED();
-      return;
-  }
-
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " Send(" << fin << ", " << type_to_pass << ", "
-           << "(data size = "  << size << "))";
-
-  std::vector<uint8_t> data_to_pass(size);
-  std::copy(data, data + size, data_to_pass.begin());
-
-  websocket_->SendFrame(fin, type_to_pass, data_to_pass);
-}
-
-void WebSocketHandleImpl::flowControl(int64_t quota) {
-  DCHECK(websocket_);
-
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " FlowControl(" << quota << ")";
-
-  websocket_->SendFlowControl(quota);
-}
-
-void WebSocketHandleImpl::close(unsigned short code, const WebString& reason) {
-  DCHECK(websocket_);
-
-  std::string reason_to_pass = reason.utf8();
-
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " Close(" << code << ", " << reason_to_pass << ")";
-
-  websocket_->StartClosingHandshake(code, reason_to_pass);
-}
-
-WebSocketHandleImpl::~WebSocketHandleImpl() {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " deleted";
-
-  if (websocket_)
-    websocket_->StartClosingHandshake(kAbnormalShutdownOpCode, std::string());
-}
-
-void WebSocketHandleImpl::Disconnect() {
-  websocket_.reset();
-  client_ = nullptr;
-}
-
-void WebSocketHandleImpl::OnConnectionError() {
-  // Our connection to the WebSocket was dropped. This could be due to
-  // exceeding the maximum number of concurrent websockets from this process.
-
-  // TODO(darin): This error message is overly specific. We don't know for sure
-  // that this is the only reason we'd get here. This should be more generic or
-  // we should figure out how to make it more specific.
-  OnFailChannel("Error in connection establishment: "
-                "net::ERR_INSUFFICIENT_RESOURCES");
-}
-
-void WebSocketHandleImpl::OnFailChannel(const std::string& message) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnFailChannel(" << message << ")";
-
-  WebSocketHandleClient* client = client_;
-  Disconnect();
-  if (!client)
-    return;
-
-  client->didFail(this, WebString::fromUTF8(message));
-  // |this| can be deleted here.
-}
-
-void WebSocketHandleImpl::OnStartOpeningHandshake(
-    mojom::WebSocketHandshakeRequestPtr request) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnStartOpeningHandshake(" << request->url << ")";
-  // All strings are already encoded to ASCII in the browser.
-  blink::WebSocketHandshakeRequestInfo request_to_pass;
-  request_to_pass.setURL(WebURL(request->url));
-  for (size_t i = 0; i < request->headers.size(); ++i) {
-    const mojom::HttpHeaderPtr& header = request->headers[i];
-    request_to_pass.addHeaderField(WebString::fromLatin1(header->name),
-                                   WebString::fromLatin1(header->value));
-  }
-  request_to_pass.setHeadersText(WebString::fromLatin1(request->headers_text));
-  client_->didStartOpeningHandshake(this, request_to_pass);
-}
-
-void WebSocketHandleImpl::OnFinishOpeningHandshake(
-    mojom::WebSocketHandshakeResponsePtr response) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnFinishOpeningHandshake(" << response->url << ")";
-
-  // All strings are already encoded to ASCII in the browser.
-  blink::WebSocketHandshakeResponseInfo response_to_pass;
-  response_to_pass.setStatusCode(response->status_code);
-  response_to_pass.setStatusText(WebString::fromLatin1(response->status_text));
-  for (size_t i = 0; i < response->headers.size(); ++i) {
-    const mojom::HttpHeaderPtr& header = response->headers[i];
-    response_to_pass.addHeaderField(WebString::fromLatin1(header->name),
-                                    WebString::fromLatin1(header->value));
-  }
-  response_to_pass.setHeadersText(
-      WebString::fromLatin1(response->headers_text));
-  client_->didFinishOpeningHandshake(this, response_to_pass);
-}
-
-void WebSocketHandleImpl::OnAddChannelResponse(const std::string& protocol,
-                                               const std::string& extensions) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnAddChannelResponse("
-           << protocol << ", " << extensions << ")";
-
-  if (!client_)
-    return;
-
-  client_->didConnect(this,
-                      WebString::fromUTF8(protocol),
-                      WebString::fromUTF8(extensions));
-  // |this| can be deleted here.
-}
-
-void WebSocketHandleImpl::OnDataFrame(bool fin,
-                                      mojom::WebSocketMessageType type,
-                                      const std::vector<uint8_t>& data) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnDataFrame(" << fin << ", " << type << ", "
-           << "(data size = " << data.size() << "))";
-  if (!client_)
-    return;
-
-  WebSocketHandle::MessageType type_to_pass =
-      WebSocketHandle::MessageTypeContinuation;
-  switch (type) {
-    case mojom::WebSocketMessageType::CONTINUATION:
-      type_to_pass = WebSocketHandle::MessageTypeContinuation;
-      break;
-    case mojom::WebSocketMessageType::TEXT:
-      type_to_pass = WebSocketHandle::MessageTypeText;
-      break;
-    case mojom::WebSocketMessageType::BINARY:
-      type_to_pass = WebSocketHandle::MessageTypeBinary;
-      break;
-  }
-  const char* data_to_pass =
-      reinterpret_cast<const char*>(data.empty() ? nullptr : &data[0]);
-  client_->didReceiveData(this, fin, type_to_pass, data_to_pass, data.size());
-  // |this| can be deleted here.
-}
-
-void WebSocketHandleImpl::OnFlowControl(int64_t quota) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnFlowControl(" << quota << ")";
-  if (!client_)
-    return;
-
-  client_->didReceiveFlowControl(this, quota);
-  // |this| can be deleted here.
-}
-
-void WebSocketHandleImpl::OnDropChannel(bool was_clean,
-                                        uint16_t code,
-                                        const std::string& reason) {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnDropChannel(" << was_clean << ", " << code << ", "
-           << reason << ")";
-
-  WebSocketHandleClient* client = client_;
-  Disconnect();
-  if (!client)
-    return;
-
-  client->didClose(this, was_clean, code, WebString::fromUTF8(reason));
-  // |this| can be deleted here.
-}
-
-void WebSocketHandleImpl::OnClosingHandshake() {
-  DVLOG(1) << "WebSocketHandleImpl @" << reinterpret_cast<void*>(this)
-           << " OnClosingHandshake()";
-  if (!client_)
-    return;
-
-  client_->didStartClosingHandshake(this);
-  // |this| can be deleted here.
-}
-
-}  // namespace content
diff --git a/content/renderer/websockethandle_impl.h b/content/renderer/websockethandle_impl.h
deleted file mode 100644
index 9afafce..0000000
--- a/content/renderer/websockethandle_impl.h
+++ /dev/null
@@ -1,86 +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 CONTENT_RENDERER_WEBSOCKETHANDLE_IMPL_H_
-#define CONTENT_RENDERER_WEBSOCKETHANDLE_IMPL_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-#include "base/single_thread_task_runner.h"
-#include "content/common/websocket.mojom.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "third_party/WebKit/public/platform/WebVector.h"
-#include "third_party/WebKit/public/platform/modules/websockets/WebSocketHandle.h"
-
-namespace blink {
-class InterfaceProvider;
-class WebSecurityOrigin;
-class WebString;
-class WebURL;
-}  // namespace blink
-
-namespace content {
-
-class WebSocketHandleImpl : public blink::WebSocketHandle,
-                            public mojom::WebSocketClient {
- public:
-  explicit WebSocketHandleImpl(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
-  // This method may optionally be called before connect() to specify a
-  // specific InterfaceProvider to get a WebSocket instance. By default,
-  // connect() will use blink::Platform::interfaceProvider().
-  void Initialize(blink::InterfaceProvider* interface_provider);
-
-  // blink::WebSocketHandle methods:
-  void connect(const blink::WebURL& url,
-               const blink::WebVector<blink::WebString>& protocols,
-               const blink::WebSecurityOrigin& origin,
-               const blink::WebURL& first_party_for_cookies,
-               const blink::WebString& user_agent_override,
-               blink::WebSocketHandleClient* client) override;
-  void send(bool fin,
-            WebSocketHandle::MessageType type,
-            const char* data,
-            size_t size) override;
-  void flowControl(int64_t quota) override;
-  void close(unsigned short code, const blink::WebString& reason) override;
-
- private:
-  ~WebSocketHandleImpl() override;
-  void Disconnect();
-  void OnConnectionError();
-
-  // mojom::WebSocketClient methods:
-  void OnFailChannel(const std::string& reason) override;
-  void OnStartOpeningHandshake(
-      mojom::WebSocketHandshakeRequestPtr request) override;
-  void OnFinishOpeningHandshake(
-      mojom::WebSocketHandshakeResponsePtr response) override;
-  void OnAddChannelResponse(const std::string& selected_protocol,
-                            const std::string& extensions) override;
-  void OnDataFrame(bool fin,
-                   mojom::WebSocketMessageType type,
-                   const std::vector<uint8_t>& data) override;
-  void OnFlowControl(int64_t quota) override;
-  void OnDropChannel(bool was_clean,
-                     uint16_t code,
-                     const std::string& reason) override;
-  void OnClosingHandshake() override;
-
-  blink::WebSocketHandleClient* client_;
-
-  mojom::WebSocketPtr websocket_;
-  mojo::Binding<mojom::WebSocketClient> client_binding_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  bool did_initialize_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebSocketHandleImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_WEBSOCKETHANDLE_IMPL_H_
diff --git a/content/shell/browser/layout_test/layout_test_devtools_frontend.cc b/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
index daf127b..bd30d22 100644
--- a/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
+++ b/content/shell/browser/layout_test/layout_test_devtools_frontend.cc
@@ -15,6 +15,7 @@
 #include "content/public/browser/web_contents.h"
 #include "content/shell/browser/layout_test/blink_test_controller.h"
 #include "content/shell/browser/shell.h"
+#include "content/shell/common/layout_test/layout_test_switches.h"
 #include "net/base/filename_util.h"
 
 namespace content {
@@ -51,15 +52,17 @@
   // We need to go up 3 directories to get to out/Release.
   dir_exe = dir_exe.AppendASCII("../../..");
 #endif
+  bool is_debug_dev_tools = base::CommandLine::ForCurrentProcess()->HasSwitch(
+      switches::kDebugDevTools);
+  std::string folder = is_debug_dev_tools ? "debug/" : "";
   base::FilePath dev_tools_path =
-      dir_exe.AppendASCII("resources/inspector/inspector.html");
+      dir_exe.AppendASCII("resources/inspector/" + folder + "inspector.html");
 
   GURL result = net::FilePathToFileURL(dev_tools_path);
   std::string url_string =
       base::StringPrintf("%s?experiments=true", result.spec().c_str());
-#if defined(DEBUG_DEVTOOLS)
-  url_string += "&debugFrontend=true";
-#endif  // defined(DEBUG_DEVTOOLS)
+  if (is_debug_dev_tools)
+    url_string += "&debugFrontend=true";
   return GURL(url_string);
 }
 
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index 5c780ab03..a214d2a 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -313,7 +313,7 @@
 WebContents* Shell::OpenURLFromTab(WebContents* source,
                                    const OpenURLParams& params) {
   // This implementation only handles CURRENT_TAB.
-  if (params.disposition != CURRENT_TAB)
+  if (params.disposition != WindowOpenDisposition::CURRENT_TAB)
     return nullptr;
 
   NavigationController::LoadURLParams load_url_params(params.url);
diff --git a/content/shell/common/layout_test/layout_test_switches.cc b/content/shell/common/layout_test/layout_test_switches.cc
index bc879a6d..acd2e44c 100644
--- a/content/shell/common/layout_test/layout_test_switches.cc
+++ b/content/shell/common/layout_test/layout_test_switches.cc
@@ -19,6 +19,9 @@
 // causes the leak detector to cause immediate crash when found leak.
 const char kCrashOnFailure[] = "crash-on-failure";
 
+// Run devtools tests in debug mode (not bundled and minified)
+const char kDebugDevTools[] = "debug-devtools";
+
 // Enable accelerated 2D canvas.
 const char kEnableAccelerated2DCanvas[] = "enable-accelerated-2d-canvas";
 
diff --git a/content/shell/common/layout_test/layout_test_switches.h b/content/shell/common/layout_test/layout_test_switches.h
index 33d5494..d42b86c 100644
--- a/content/shell/common/layout_test/layout_test_switches.h
+++ b/content/shell/common/layout_test/layout_test_switches.h
@@ -15,6 +15,7 @@
 extern const char kAllowExternalPages[];
 extern const char kCheckLayoutTestSysDeps[];
 extern const char kCrashOnFailure[];
+extern const char kDebugDevTools[];
 extern const char kEnableAccelerated2DCanvas[];
 extern const char kEnableFontAntialiasing[];
 extern const char kAlwaysUseComplexText[];
diff --git a/content/test/gpu/PRESUBMIT.py b/content/test/gpu/PRESUBMIT.py
index 4d287f0..90a632a 100644
--- a/content/test/gpu/PRESUBMIT.py
+++ b/content/test/gpu/PRESUBMIT.py
@@ -19,7 +19,7 @@
     input_api.os_path.join(chromium_src_dir,
         'third_party', 'catapult', 'telemetry'),
     input_api.os_path.join(chromium_src_dir,
-        'third_party', 'catapult', 'catapult_base'),
+        'third_party', 'catapult', 'common', 'py_utils'),
   ]
 
 def _GpuUnittestsArePassingCheck(input_api, output_api):
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index 442884b..b357a62 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -600,7 +600,7 @@
         'run_on_optional': True,
         # Run only on the Win7 and Linux Release NVIDIA 32- and 64-bit bots
         # (and trybots) for the time being, at least until more capacity is
-        # added.
+        # added. Also run on the AMD R7 240 bots.
         'build_configs': ['Release', 'Release_x64'],
         'swarming_dimension_sets': [
           {
@@ -608,6 +608,10 @@
             'os': 'Windows-2008ServerR2-SP1'
           },
           {
+            'gpu': '1002:6613',
+            'os': 'Windows-2008ServerR2-SP1'
+          },
+          {
             'gpu': '10de:104a',
             'os': 'Linux'
           }
@@ -628,6 +632,7 @@
         # Run only on the Win7 and Linux Release NVIDIA 32-bit bots
         # (and trybots) for the time being, at least until more capacity is
         # added.
+        # TODO(jmadill): Run on the Win AMD R7 240 bots once they are swarmed.
         'build_configs': ['Release'],
         'swarming_dimension_sets': [
           {
diff --git a/content/test/gpu/gpu_tests/cloud_storage_test_base.py b/content/test/gpu/gpu_tests/cloud_storage_test_base.py
index 1ddf9c34..77d2becf 100644
--- a/content/test/gpu/gpu_tests/cloud_storage_test_base.py
+++ b/content/test/gpu/gpu_tests/cloud_storage_test_base.py
@@ -10,7 +10,7 @@
 import re
 import tempfile
 
-from catapult_base import cloud_storage
+from py_utils import cloud_storage
 from telemetry.page import page_test
 from telemetry.util import image_util
 from telemetry.util import rgba_color
diff --git a/content/test/gpu/gpu_tests/path_util.py b/content/test/gpu/gpu_tests/path_util.py
index e178d76..b9681e0 100644
--- a/content/test/gpu/gpu_tests/path_util.py
+++ b/content/test/gpu/gpu_tests/path_util.py
@@ -34,7 +34,7 @@
   if telemetry_path not in sys.path:
     sys.path.append(telemetry_path)
 
-  catapult_base_path = os.path.join(
-      chromium_src_dir, 'third_party', 'catapult', 'catapult_base')
-  if catapult_base_path not in sys.path:
-    sys.path.append(catapult_base_path)
+  py_utils_path = os.path.join(
+      chromium_src_dir, 'third_party', 'catapult', 'common', 'py_utils')
+  if py_utils_path not in sys.path:
+    sys.path.append(py_utils_path)
diff --git a/content/test/gpu/gpu_tests/pixel.py b/content/test/gpu/gpu_tests/pixel.py
index ddf256e..d569bde 100644
--- a/content/test/gpu/gpu_tests/pixel.py
+++ b/content/test/gpu/gpu_tests/pixel.py
@@ -10,7 +10,7 @@
 from gpu_tests import pixel_expectations
 import page_sets
 
-from catapult_base import cloud_storage
+from py_utils import cloud_storage
 from telemetry.page import page_test
 from telemetry.util import image_util
 
diff --git a/content/test/gpu/page_sets/PRESUBMIT.py b/content/test/gpu/page_sets/PRESUBMIT.py
index 6ff67115..976efc7 100644
--- a/content/test/gpu/page_sets/PRESUBMIT.py
+++ b/content/test/gpu/page_sets/PRESUBMIT.py
@@ -21,11 +21,11 @@
   """Check whether the wpr sha files have matching URLs."""
   old_sys_path = sys.path
   try:
-    catapult_base_path = input_api.os_path.join(
-        _GetChromiumSrcDir(input_api), 'third_party', 'catapult',
-        'catapult_base')
-    sys.path.insert(1, catapult_base_path)
-    from catapult_base import cloud_storage  # pylint: disable=import-error
+    py_utils_path = input_api.os_path.join(
+        _GetChromiumSrcDir(input_api), 'third_party', 'catapult', 'common',
+        'py_utils')
+    sys.path.insert(1, py_utils_path)
+    from py_utils import cloud_storage  # pylint: disable=import-error
   finally:
     sys.path = old_sys_path
 
diff --git a/docs/linux_eclipse_dev.md b/docs/linux_eclipse_dev.md
index 78cee84..09946b53 100644
--- a/docs/linux_eclipse_dev.md
+++ b/docs/linux_eclipse_dev.md
@@ -287,20 +287,13 @@
 After fighting with with a number of approaches, I've found the below to work
 best for me.
 
-*The instrcutions below are out-of-date since it references GYP. Please see
-`gn help gen` for how to generate an Eclipse CDT file in GN. If you use
-Eclipse and make it work, please update this documentation.*
-
 1.  From a shell in your src directory, run
-    `GYP_GENERATORS=ninja,eclipse build/gyp_chromium`
-    1.  This generates <project root>/out/Debug/eclipse-cdt-settings.xml which
+    `gn gen --ide=eclipse out/Debug_gn/' (replacing Debug_gn with the output directory you normally use when building).
+    1.  This generates <project root>/out/Debug_gn/eclipse-cdt-settings.xml which
         is used below.
     1.  This creates a single list of include directories and preprocessor
         definitions to be used for all source files, and so is a little
         inaccurate. Here are some tips for compensating for the limitations:
-        1.  Use `-R <target>` to restrict the output to considering only certain
-            targets (avoiding unnecessary includes that are likely to cause
-            trouble). Eg. for a blink project, use `-R blink`.
         1.  If you care about blink, move 'third\_party/Webkit/Source' to the
             top of the list to better resolve ambiguous include paths (eg.
             `config.h`).
diff --git a/extensions/browser/api/sockets_tcp/OWNERS b/extensions/browser/api/sockets_tcp/OWNERS
index 6ccbbd6..2c82673 100644
--- a/extensions/browser/api/sockets_tcp/OWNERS
+++ b/extensions/browser/api/sockets_tcp/OWNERS
@@ -1 +1,2 @@
-file://apps/OWNERS
+steel@chromium.org
+xiyuan@chromium.org
diff --git a/extensions/browser/api/sockets_tcp_server/OWNERS b/extensions/browser/api/sockets_tcp_server/OWNERS
index 6ccbbd6..2c82673 100644
--- a/extensions/browser/api/sockets_tcp_server/OWNERS
+++ b/extensions/browser/api/sockets_tcp_server/OWNERS
@@ -1 +1,2 @@
-file://apps/OWNERS
+steel@chromium.org
+xiyuan@chromium.org
diff --git a/extensions/browser/api/sockets_udp/OWNERS b/extensions/browser/api/sockets_udp/OWNERS
index 6ccbbd6..2c82673 100644
--- a/extensions/browser/api/sockets_udp/OWNERS
+++ b/extensions/browser/api/sockets_udp/OWNERS
@@ -1 +1,2 @@
-file://apps/OWNERS
+steel@chromium.org
+xiyuan@chromium.org
diff --git a/extensions/browser/app_window/app_web_contents_helper.cc b/extensions/browser/app_window/app_web_contents_helper.cc
index c3fe085..2a64ce7 100644
--- a/extensions/browser/app_window/app_web_contents_helper.cc
+++ b/extensions/browser/app_window/app_web_contents_helper.cc
@@ -45,7 +45,7 @@
   // navigations, which we don't want to allow.
   // TOOD(mihaip): Can we check for user gestures instead?
   WindowOpenDisposition disposition = params.disposition;
-  if (disposition == CURRENT_TAB) {
+  if (disposition == WindowOpenDisposition::CURRENT_TAB) {
     web_contents_->GetMainFrame()->AddMessageToConsole(
         content::CONSOLE_MESSAGE_LEVEL_ERROR,
         base::StringPrintf(
@@ -55,7 +55,8 @@
   }
 
   // These dispositions aren't really navigations.
-  if (disposition == SAVE_TO_DISK || disposition == IGNORE_ACTION)
+  if (disposition == WindowOpenDisposition::SAVE_TO_DISK ||
+      disposition == WindowOpenDisposition::IGNORE_ACTION)
     return NULL;
 
   content::WebContents* contents =
diff --git a/extensions/browser/extension_host.cc b/extensions/browser/extension_host.cc
index 352619a8..63e5c65 100644
--- a/extensions/browser/extension_host.cc
+++ b/extensions/browser/extension_host.cc
@@ -427,7 +427,7 @@
   // vice versa.
   // Note that we don't do this for popup windows, because we need to associate
   // those with their extension_app_id.
-  if (disposition != NEW_POPUP) {
+  if (disposition != WindowOpenDisposition::NEW_POPUP) {
     WebContents* associated_contents = GetAssociatedWebContents();
     if (associated_contents &&
         associated_contents->GetBrowserContext() ==
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.cc b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
index 6c9ff47..c02aace 100644
--- a/extensions/browser/guest_view/extension_options/extension_options_guest.cc
+++ b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
@@ -168,14 +168,12 @@
   // this guest view, change the disposition to NEW_FOREGROUND_TAB.
   if ((!params.url.SchemeIs(extensions::kExtensionScheme) ||
        params.url.host() != options_page_.host()) &&
-      params.disposition == CURRENT_TAB) {
+      params.disposition == WindowOpenDisposition::CURRENT_TAB) {
     return extension_options_guest_delegate_->OpenURLInNewTab(
-        content::OpenURLParams(params.url,
-                               params.referrer,
-                               params.frame_tree_node_id,
-                               NEW_FOREGROUND_TAB,
-                               params.transition,
-                               params.is_renderer_initiated));
+        content::OpenURLParams(
+            params.url, params.referrer, params.frame_tree_node_id,
+            WindowOpenDisposition::NEW_FOREGROUND_TAB, params.transition,
+            params.is_renderer_initiated));
   }
   return extension_options_guest_delegate_->OpenURLInNewTab(params);
 }
@@ -213,11 +211,9 @@
   //   ctrl-click or middle mouse button click
   if (extension_options_guest_delegate_) {
     extension_options_guest_delegate_->OpenURLInNewTab(
-        content::OpenURLParams(target_url,
-                               content::Referrer(),
-                               NEW_FOREGROUND_TAB,
-                               ui::PAGE_TRANSITION_LINK,
-                               false));
+        content::OpenURLParams(target_url, content::Referrer(),
+                               WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                               ui::PAGE_TRANSITION_LINK, false));
   }
   return false;
 }
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc
index 40b36f75..bcb6f69f 100644
--- a/extensions/browser/guest_view/web_view/web_view_guest.cc
+++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -103,19 +103,19 @@
 std::string WindowOpenDispositionToString(
   WindowOpenDisposition window_open_disposition) {
   switch (window_open_disposition) {
-    case IGNORE_ACTION:
+    case WindowOpenDisposition::IGNORE_ACTION:
       return "ignore";
-    case SAVE_TO_DISK:
+    case WindowOpenDisposition::SAVE_TO_DISK:
       return "save_to_disk";
-    case CURRENT_TAB:
+    case WindowOpenDisposition::CURRENT_TAB:
       return "current_tab";
-    case NEW_BACKGROUND_TAB:
+    case WindowOpenDisposition::NEW_BACKGROUND_TAB:
       return "new_background_tab";
-    case NEW_FOREGROUND_TAB:
+    case WindowOpenDisposition::NEW_FOREGROUND_TAB:
       return "new_foreground_tab";
-    case NEW_WINDOW:
+    case WindowOpenDisposition::NEW_WINDOW:
       return "new_window";
-    case NEW_POPUP:
+    case WindowOpenDisposition::NEW_POPUP:
       return "new_popup";
     default:
       NOTREACHED() << "Unknown Window Open Disposition";
@@ -1273,7 +1273,7 @@
   if (!params.is_renderer_initiated &&
       (!content::ChildProcessSecurityPolicy::GetInstance()->IsWebSafeScheme(
            params.url.scheme()) ||
-       params.disposition != CURRENT_TAB)) {
+       params.disposition != WindowOpenDisposition::CURRENT_TAB)) {
     if (!owner_web_contents()->GetDelegate())
       return nullptr;
     return owner_web_contents()->GetDelegate()->OpenURLFromTab(
@@ -1309,7 +1309,7 @@
   // to navigate to a URL that it is not allowed to navigate to, a 'loadabort'
   // event will fire in the embedder, and the guest will be navigated to
   // about:blank.
-  if (params.disposition == CURRENT_TAB) {
+  if (params.disposition == WindowOpenDisposition::CURRENT_TAB) {
     LoadURLWithParams(params.url, params.referrer, params.transition,
                       true /* force_navigation */);
     return web_contents();
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index ab8c2e3..0533984 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -880,8 +880,7 @@
       "event_natives",
       std::unique_ptr<NativeHandler>(new EventBindings(context)));
   module_system->RegisterNativeHandler(
-      "messaging_natives",
-      std::unique_ptr<NativeHandler>(MessagingBindings::Get(context)));
+      "messaging_natives", base::MakeUnique<MessagingBindings>(context));
   module_system->RegisterNativeHandler(
       "apiDefinitions", std::unique_ptr<NativeHandler>(
                             new ApiDefinitionsNatives(dispatcher, context)));
diff --git a/extensions/renderer/messaging_bindings.cc b/extensions/renderer/messaging_bindings.cc
index 79fb716..db61703 100644
--- a/extensions/renderer/messaging_bindings.cc
+++ b/extensions/renderer/messaging_bindings.cc
@@ -12,11 +12,8 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/values.h"
-#include "components/guest_view/common/guest_view_constants.h"
 #include "content/public/child/v8_value_converter.h"
 #include "content/public/common/child_process_host.h"
 #include "content/public/renderer/render_frame.h"
@@ -24,10 +21,8 @@
 #include "extensions/common/api/messaging/message.h"
 #include "extensions/common/extension_messages.h"
 #include "extensions/common/manifest_handlers/externally_connectable.h"
-#include "extensions/renderer/event_bindings.h"
 #include "extensions/renderer/extension_frame_helper.h"
 #include "extensions/renderer/gc_callback.h"
-#include "extensions/renderer/object_backed_native_handler.h"
 #include "extensions/renderer/script_context.h"
 #include "extensions/renderer/script_context_set.h"
 #include "extensions/renderer/v8_helpers.h"
@@ -48,107 +43,13 @@
 //   port.postMessage('I got your reponse');
 // });
 
-using content::RenderThread;
-using content::V8ValueConverter;
-
 namespace extensions {
 
 using v8_helpers::ToV8String;
-using v8_helpers::ToV8StringUnsafe;
 using v8_helpers::IsEmptyOrUndefied;
 
 namespace {
 
-class ExtensionImpl : public ObjectBackedNativeHandler {
- public:
-  explicit ExtensionImpl(ScriptContext* context)
-      : ObjectBackedNativeHandler(context), weak_ptr_factory_(this) {
-    RouteFunction(
-        "CloseChannel",
-        base::Bind(&ExtensionImpl::CloseChannel, base::Unretained(this)));
-    RouteFunction(
-        "PostMessage",
-        base::Bind(&ExtensionImpl::PostMessage, base::Unretained(this)));
-    // TODO(fsamuel, kalman): Move BindToGC out of messaging natives.
-    RouteFunction("BindToGC",
-                  base::Bind(&ExtensionImpl::BindToGC, base::Unretained(this)));
-  }
-
-  ~ExtensionImpl() override {}
-
- private:
-  // Sends a message along the given channel.
-  void PostMessage(const v8::FunctionCallbackInfo<v8::Value>& args) {
-    // Arguments are (int32_t port_id, string message).
-    CHECK(args.Length() == 2 && args[0]->IsInt32() && args[1]->IsString());
-
-    int port_id = args[0].As<v8::Int32>()->Value();
-
-    content::RenderFrame* render_frame = context()->GetRenderFrame();
-    if (render_frame) {
-      render_frame->Send(new ExtensionHostMsg_PostMessage(
-          render_frame->GetRoutingID(), port_id,
-          Message(*v8::String::Utf8Value(args[1]),
-                  blink::WebUserGestureIndicator::isProcessingUserGesture())));
-    }
-  }
-
-  // Close a port, optionally forcefully (i.e. close the whole channel instead
-  // of just the given port).
-  void CloseChannel(const v8::FunctionCallbackInfo<v8::Value>& args) {
-    // Arguments are (int32_t port_id, bool force_close).
-    CHECK_EQ(2, args.Length());
-    CHECK(args[0]->IsInt32());
-    CHECK(args[1]->IsBoolean());
-
-    int port_id = args[0].As<v8::Int32>()->Value();
-    bool force_close = args[1].As<v8::Boolean>()->Value();
-    ClosePort(port_id, force_close);
-  }
-
-  // void BindToGC(object, callback, port_id)
-  //
-  // Binds |callback| to be invoked *sometime after* |object| is garbage
-  // collected. We don't call the method re-entrantly so as to avoid executing
-  // JS in some bizarro undefined mid-GC state, nor do we then call into the
-  // script context if it's been invalidated.
-  //
-  // If the script context *is* invalidated in the meantime, as a slight hack,
-  // release the port with ID |port_id| if it's >= 0.
-  void BindToGC(const v8::FunctionCallbackInfo<v8::Value>& args) {
-    CHECK(args.Length() == 3 && args[0]->IsObject() && args[1]->IsFunction() &&
-          args[2]->IsInt32());
-    int port_id = args[2].As<v8::Int32>()->Value();
-    base::Closure fallback = base::Bind(&base::DoNothing);
-    if (port_id >= 0) {
-      // TODO(robwu): Falling back to closing the port shouldn't be needed. If
-      // the script context is destroyed, then the frame has navigated. But that
-      // is already detected by the browser, so this logic is redundant. Remove
-      // this fallback (and move BindToGC out of messaging because it is also
-      // used in other places that have nothing to do with messaging...).
-      fallback =
-          base::Bind(&ExtensionImpl::ClosePort, weak_ptr_factory_.GetWeakPtr(),
-                     port_id, false /* force_close */);
-    }
-    // Destroys itself when the object is GC'd or context is invalidated.
-    new GCCallback(context(), args[0].As<v8::Object>(),
-                   args[1].As<v8::Function>(), fallback);
-  }
-
-  // See ExtensionImpl::CloseChannel for documentation.
-  // TODO(robwu): Merge this logic with CloseChannel once the TODO in BindToGC
-  // has been addressed.
-  void ClosePort(int port_id, bool force_close) {
-    content::RenderFrame* render_frame = context()->GetRenderFrame();
-    if (render_frame) {
-      render_frame->Send(new ExtensionHostMsg_CloseMessagePort(
-          render_frame->GetRoutingID(), port_id, force_close));
-    }
-  }
-
-  base::WeakPtrFactory<ExtensionImpl> weak_ptr_factory_;
-};
-
 void HasMessagePort(int port_id,
                     bool* has_port,
                     ScriptContext* script_context) {
@@ -181,7 +82,8 @@
   v8::Isolate* isolate = script_context->isolate();
   v8::HandleScope handle_scope(isolate);
 
-  std::unique_ptr<V8ValueConverter> converter(V8ValueConverter::create());
+  std::unique_ptr<content::V8ValueConverter> converter(
+      content::V8ValueConverter::create());
 
   const std::string& source_url_spec = info.source_url.spec();
   std::string target_extension_id = script_context->GetExtensionID();
@@ -328,10 +230,20 @@
 
 }  // namespace
 
-ObjectBackedNativeHandler* MessagingBindings::Get(ScriptContext* context) {
-  return new ExtensionImpl(context);
+MessagingBindings::MessagingBindings(ScriptContext* context)
+    : ObjectBackedNativeHandler(context), weak_ptr_factory_(this) {
+  RouteFunction("CloseChannel", base::Bind(&MessagingBindings::CloseChannel,
+                                           base::Unretained(this)));
+  RouteFunction("PostMessage", base::Bind(&MessagingBindings::PostMessage,
+                                          base::Unretained(this)));
+  // TODO(fsamuel, kalman): Move BindToGC out of messaging natives.
+  RouteFunction("BindToGC", base::Bind(&MessagingBindings::BindToGC,
+                                       base::Unretained(this)));
 }
 
+MessagingBindings::~MessagingBindings() {}
+
+// static
 void MessagingBindings::ValidateMessagePort(
     const ScriptContextSet& context_set,
     int port_id,
@@ -403,4 +315,63 @@
       base::Bind(&DispatchOnDisconnectToScriptContext, port_id, error_message));
 }
 
+void MessagingBindings::PostMessage(
+    const v8::FunctionCallbackInfo<v8::Value>& args) {
+  // Arguments are (int32_t port_id, string message).
+  CHECK(args.Length() == 2 && args[0]->IsInt32() && args[1]->IsString());
+
+  int port_id = args[0].As<v8::Int32>()->Value();
+
+  content::RenderFrame* render_frame = context()->GetRenderFrame();
+  if (render_frame) {
+    render_frame->Send(new ExtensionHostMsg_PostMessage(
+        render_frame->GetRoutingID(), port_id,
+        Message(*v8::String::Utf8Value(args[1]),
+                blink::WebUserGestureIndicator::isProcessingUserGesture())));
+  }
+}
+
+void MessagingBindings::CloseChannel(
+    const v8::FunctionCallbackInfo<v8::Value>& args) {
+  // Arguments are (int32_t port_id, bool force_close).
+  CHECK_EQ(2, args.Length());
+  CHECK(args[0]->IsInt32());
+  CHECK(args[1]->IsBoolean());
+
+  int port_id = args[0].As<v8::Int32>()->Value();
+  bool force_close = args[1].As<v8::Boolean>()->Value();
+  ClosePort(port_id, force_close);
+}
+
+void MessagingBindings::BindToGC(
+    const v8::FunctionCallbackInfo<v8::Value>& args) {
+  CHECK(args.Length() == 3 && args[0]->IsObject() && args[1]->IsFunction() &&
+        args[2]->IsInt32());
+  int port_id = args[2].As<v8::Int32>()->Value();
+  base::Closure fallback = base::Bind(&base::DoNothing);
+  if (port_id >= 0) {
+    // TODO(robwu): Falling back to closing the port shouldn't be needed. If
+    // the script context is destroyed, then the frame has navigated. But that
+    // is already detected by the browser, so this logic is redundant. Remove
+    // this fallback (and move BindToGC out of messaging because it is also
+    // used in other places that have nothing to do with messaging...).
+    fallback = base::Bind(&MessagingBindings::ClosePort,
+                          weak_ptr_factory_.GetWeakPtr(), port_id,
+                          false /* force_close */);
+  }
+  // Destroys itself when the object is GC'd or context is invalidated.
+  new GCCallback(context(), args[0].As<v8::Object>(),
+                 args[1].As<v8::Function>(), fallback);
+}
+
+void MessagingBindings::ClosePort(int port_id, bool force_close) {
+  // TODO(robwu): Merge this logic with CloseChannel once the TODO in BindToGC
+  // has been addressed.
+  content::RenderFrame* render_frame = context()->GetRenderFrame();
+  if (render_frame) {
+    render_frame->Send(new ExtensionHostMsg_CloseMessagePort(
+        render_frame->GetRoutingID(), port_id, force_close));
+  }
+}
+
 }  // namespace extensions
diff --git a/extensions/renderer/messaging_bindings.h b/extensions/renderer/messaging_bindings.h
index 4c52c63..56a9f7f 100644
--- a/extensions/renderer/messaging_bindings.h
+++ b/extensions/renderer/messaging_bindings.h
@@ -7,37 +7,26 @@
 
 #include <string>
 
-#include "extensions/renderer/script_context_set.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "extensions/renderer/object_backed_native_handler.h"
 
 struct ExtensionMsg_ExternalConnectionInfo;
 struct ExtensionMsg_TabConnectionInfo;
 
-namespace base {
-class DictionaryValue;
-}
-
 namespace content {
 class RenderFrame;
 }
 
-namespace v8 {
-class Extension;
-}
-
 namespace extensions {
 struct Message;
-class ObjectBackedNativeHandler;
 class ScriptContextSet;
 
 // Manually implements JavaScript bindings for extension messaging.
-//
-// TODO(aa): This should all get re-implemented using SchemaGeneratedBindings.
-// If anything needs to be manual for some reason, it should be implemented in
-// its own class.
-class MessagingBindings {
+class MessagingBindings : public ObjectBackedNativeHandler {
  public:
-  // Creates an instance of the extension.
-  static ObjectBackedNativeHandler* Get(ScriptContext* context);
+  explicit MessagingBindings(ScriptContext* script_context);
+  ~MessagingBindings() override;
 
   // Checks whether the port exists in the given frame. If it does not, a reply
   // is sent back to the browser.
@@ -70,6 +59,28 @@
       int port_id,
       const std::string& error_message,
       content::RenderFrame* restrict_to_render_frame);
+
+ private:
+  // JS Exposed Function: Sends a message along the given channel.
+  void PostMessage(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+  // JS Exposed Function: Close a port, optionally forcefully (i.e. close the
+  // whole channel instead of just the given port).
+  void CloseChannel(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+  // JS Exposed Function: Binds |callback| to be invoked *sometime after*
+  // |object| is garbage collected. We don't call the method re-entrantly so as
+  // to avoid executing JS in some bizarro undefined mid-GC state, nor do we
+  // then call into the script context if it's been invalidated.
+  void BindToGC(const v8::FunctionCallbackInfo<v8::Value>& args);
+
+  // Helper function to close a port. See CloseChannel() for |force_close|
+  // documentation.
+  void ClosePort(int port_id, bool force_close);
+
+  base::WeakPtrFactory<MessagingBindings> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(MessagingBindings);
 };
 
 }  // namespace extensions
diff --git a/extensions/renderer/resources/guest_view/extension_view/extension_view_api_methods.js b/extensions/renderer/resources/guest_view/extension_view/extension_view_api_methods.js
index d4959730..0c64e633 100644
--- a/extensions/renderer/resources/guest_view/extension_view/extension_view_api_methods.js
+++ b/extensions/renderer/resources/guest_view/extension_view/extension_view_api_methods.js
@@ -32,9 +32,9 @@
     this.pendingLoad = null;
     this.loadNextSrc();
   }.bind(this), function onLoadRejected() {
+    this.pendingLoad.reject('Failed to load.');
     this.pendingLoad = null;
     this.loadNextSrc();
-    reject('Failed to load.');
   }.bind(this));
 };
 
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
index b24c50e5..b920983 100644
--- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
+++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.cc
@@ -14,6 +14,7 @@
 #define SHADER(Src) #Src
 
 namespace gpu {
+namespace gles2 {
 
 ApplyFramebufferAttachmentCMAAINTELResourceManager::
     ApplyFramebufferAttachmentCMAAINTELResourceManager()
@@ -1907,4 +1908,5 @@
     );
 /* clang-format on */
 
+}  // namespace gles2
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h
index 4f5b4833..7f98fbc 100644
--- a/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h
+++ b/gpu/command_buffer/service/gles2_cmd_apply_framebuffer_attachment_cmaa_intel.h
@@ -16,7 +16,6 @@
 namespace gles2 {
 class GLES2Decoder;
 class Framebuffer;
-}
 
 // This class encapsulates the resources required to implement the
 // GL_INTEL_framebuffer_CMAA extension via shaders.
@@ -97,6 +96,7 @@
   DISALLOW_COPY_AND_ASSIGN(ApplyFramebufferAttachmentCMAAINTELResourceManager);
 };
 
+}  // namespace gles2
 }  // namespace gpu
 
 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_APPLY_FRAMEBUFFER_ATTACHMENT_CMAA_INTEL_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc
index 6a21c49fd..b0fcd5f 100644
--- a/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc
+++ b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.cc
@@ -54,6 +54,7 @@
 }  // namespace
 
 namespace gpu {
+namespace gles2 {
 
 ClearFramebufferResourceManager::ClearFramebufferResourceManager(
     const gles2::GLES2Decoder* decoder)
@@ -185,4 +186,5 @@
   decoder->RestoreGlobalState();
 }
 
+}  // namespace gles2
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h
index 750b0d68..1819666 100644
--- a/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h
+++ b/gpu/command_buffer/service/gles2_cmd_clear_framebuffer.h
@@ -16,7 +16,6 @@
 namespace gpu {
 namespace gles2 {
 class GLES2Decoder;
-}
 
 class GPU_EXPORT ClearFramebufferResourceManager {
  public:
@@ -50,6 +49,7 @@
   DISALLOW_COPY_AND_ASSIGN(ClearFramebufferResourceManager);
 };
 
-}  // namespace gpu.
+}  // namespace gles2
+}  // namespace gpu
 
 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_CLEAR_FRAMEBUFFER_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc b/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc
index b26d335..ad4ef20 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc
+++ b/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc
@@ -23,6 +23,7 @@
 }  // anonymous namespace
 
 namespace gpu {
+namespace gles2 {
 
 CopyTexImageResourceManager::CopyTexImageResourceManager(
     const gles2::FeatureInfo* feature_info)
@@ -276,4 +277,5 @@
   return false;
 }
 
+}  // namespace gles2
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_tex_image.h b/gpu/command_buffer/service/gles2_cmd_copy_tex_image.h
index 3b09919..eaf574e 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_tex_image.h
+++ b/gpu/command_buffer/service/gles2_cmd_copy_tex_image.h
@@ -18,8 +18,6 @@
 
 class GLES2Decoder;
 
-}  // namespace gles2.
-
 // This class encapsulates the resources required to implement the
 // glCopyTexImage and glCopyTexSubImage commands.  These commands somtimes
 // require a blit.
@@ -83,6 +81,7 @@
   DISALLOW_COPY_AND_ASSIGN(CopyTexImageResourceManager);
 };
 
-}  // namespace gpu.
+}  // namespace gles2
+}  // namespace gpu
 
 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEX_IMAGE_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
index 91ce24e..62e5413 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
@@ -317,6 +317,7 @@
 }  // namespace
 
 namespace gpu {
+namespace gles2 {
 
 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager()
     : initialized_(false),
@@ -758,4 +759,5 @@
   decoder->RestoreGlobalState();
 }
 
+}  // namespace gles2
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
index 95b25a0..6143ef5 100644
--- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
+++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h
@@ -18,8 +18,6 @@
 
 class GLES2Decoder;
 
-}  // namespace gles2.
-
 // This class encapsulates the resources required to implement the
 // GL_CHROMIUM_copy_texture extension.  The copy operation is performed
 // via glCopyTexImage2D() or a blit to a framebuffer object.
@@ -169,6 +167,7 @@
   DISALLOW_COPY_AND_ASSIGN(CopyTextureCHROMIUMResourceManager);
 };
 
-}  // namespace gpu.
+}  // namespace gles2
+}  // namespace gpu
 
 #endif  // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEXTURE_CHROMIUM_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 5202e1cb..06aaf3db 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3713,8 +3713,6 @@
     resources.HashFunction = NULL;
 
   int driver_bug_workarounds = 0;
-  if (workarounds().needs_glsl_built_in_function_emulation)
-    driver_bug_workarounds |= SH_EMULATE_BUILT_IN_FUNCTIONS;
   if (workarounds().init_gl_position_in_vertex_shader)
     driver_bug_workarounds |= SH_INIT_GL_POSITION;
   if (workarounds().unfold_short_circuit_as_ternary_operation)
diff --git a/gpu/command_buffer/service/shader_translator_unittest.cc b/gpu/command_buffer/service/shader_translator_unittest.cc
index 7d797dc..0059aa0 100644
--- a/gpu/command_buffer/service/shader_translator_unittest.cc
+++ b/gpu/command_buffer/service/shader_translator_unittest.cc
@@ -33,7 +33,7 @@
 
     ASSERT_TRUE(vertex_translator_->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC,
                                          &resources, shader_output_language_,
-                                         SH_EMULATE_BUILT_IN_FUNCTIONS,
+                                         static_cast<ShCompileOptions>(0),
                                          false));
     ASSERT_TRUE(fragment_translator_->Init(GL_FRAGMENT_SHADER, SH_GLES2_SPEC,
                                            &resources, shader_output_language_,
@@ -72,7 +72,8 @@
 
     ASSERT_TRUE(vertex_translator_->Init(GL_VERTEX_SHADER, SH_GLES3_SPEC,
                                          &resources, shader_output_language_,
-                                         SH_EMULATE_BUILT_IN_FUNCTIONS, false));
+                                         static_cast<ShCompileOptions>(0),
+                                         false));
     ASSERT_TRUE(fragment_translator_->Init(GL_FRAGMENT_SHADER, SH_GLES3_SPEC,
                                            &resources, shader_output_language_,
                                            static_cast<ShCompileOptions>(0),
@@ -427,16 +428,16 @@
 
   ASSERT_TRUE(translator_1->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
                                  SH_GLSL_150_CORE_OUTPUT,
-                                 SH_EMULATE_BUILT_IN_FUNCTIONS,
+                                 static_cast<ShCompileOptions>(0),
                                  false));
   ASSERT_TRUE(translator_2->Init(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources,
                                  SH_GLSL_150_CORE_OUTPUT,
-                                 static_cast<ShCompileOptions>(0),
+                                 SH_INIT_OUTPUT_VARIABLES,
                                  false));
   resources.EXT_draw_buffers = 1;
   ASSERT_TRUE(translator_3->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources,
                                  SH_GLSL_150_CORE_OUTPUT,
-                                 SH_EMULATE_BUILT_IN_FUNCTIONS,
+                                 static_cast<ShCompileOptions>(0),
                                  false));
 
   std::string options_1(
@@ -619,4 +620,3 @@
 
 }  // namespace gles2
 }  // namespace gpu
-
diff --git a/gpu/config/gpu_driver_bug_workaround_type.h b/gpu/config/gpu_driver_bug_workaround_type.h
index 3af600cf..6fec8c4 100644
--- a/gpu/config/gpu_driver_bug_workaround_type.h
+++ b/gpu/config/gpu_driver_bug_workaround_type.h
@@ -111,8 +111,6 @@
          max_vertex_uniform_vectors_256)                     \
   GPU_OP(MSAA_IS_SLOW,                                       \
          msaa_is_slow)                                       \
-  GPU_OP(NEEDS_GLSL_BUILT_IN_FUNCTION_EMULATION,             \
-         needs_glsl_built_in_function_emulation)             \
   GPU_OP(NEEDS_OFFSCREEN_BUFFER_WORKAROUND,                  \
          needs_offscreen_buffer_workaround)                  \
   GPU_OP(PACK_PARAMETERS_WORKAROUND_WITH_PACK_BUFFER,        \
diff --git a/infra/config/recipes.cfg b/infra/config/recipes.cfg
index 9c5e8285..3ce56c8a 100644
--- a/infra/config/recipes.cfg
+++ b/infra/config/recipes.cfg
@@ -5,17 +5,17 @@
   project_id: "build"
   url: "https://chromium.googlesource.com/chromium/tools/build.git"
   branch: "master"
-  revision: "3a98a0a38287c090976ffd2f0cd47d12ba21b2d3"
+  revision: "fa5cf81426f1a18b24af9ba4283e6d598435debe"
 }
 deps {
   project_id: "depot_tools"
   url: "https://chromium.googlesource.com/chromium/tools/depot_tools.git"
   branch: "master"
-  revision: "6d3c290164360907fe08784093e36314069e689f"
+  revision: "6911b067504584996204cf0b2535508ac4207106"
 }
 deps {
   project_id: "recipe_engine"
   url: "https://chromium.googlesource.com/external/github.com/luci/recipes-py.git"
   branch: "master"
-  revision: "a93ebc8b69c18bce873f4df1979b6534f3c13e68"
+  revision: "09345f9dcf4d2744f66d64766fd349ddf04f04ce"
 }
diff --git a/ios/chrome/browser/infobars/confirm_infobar_controller.mm b/ios/chrome/browser/infobars/confirm_infobar_controller.mm
index 33cc3bc..686e324 100644
--- a/ios/chrome/browser/infobars/confirm_infobar_controller.mm
+++ b/ios/chrome/browser/infobars/confirm_infobar_controller.mm
@@ -152,7 +152,8 @@
     return;
   }
   if ([tag unsignedIntegerValue] == ConfirmInfoBarUITags::TITLE_LINK) {
-    _confirmInfobarDelegate->LinkClicked(NEW_FOREGROUND_TAB);
+    _confirmInfobarDelegate->LinkClicked(
+        WindowOpenDisposition::NEW_FOREGROUND_TAB);
   }
 }
 
diff --git a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
index 19b5ac8..d221ce2 100644
--- a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
+++ b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
@@ -46,7 +46,8 @@
 
 void IOSChromeControllerClient::OpenUrlInCurrentTab(const GURL& url) {
   web_state_->OpenURL(web::WebState::OpenURLParams(
-      url, web::Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_LINK, false));
+      url, web::Referrer(), WindowOpenDisposition::CURRENT_TAB,
+      ui::PAGE_TRANSITION_LINK, false));
 }
 
 const std::string& IOSChromeControllerClient::GetApplicationLocale() {
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm
index 89df52f..8a7effd 100644
--- a/ios/web/navigation/navigation_manager_impl.mm
+++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -168,7 +168,8 @@
 void NavigationManagerImpl::LoadURL(const GURL& url,
                                     const web::Referrer& referrer,
                                     ui::PageTransition type) {
-  WebState::OpenURLParams params(url, referrer, CURRENT_TAB, type, NO);
+  WebState::OpenURLParams params(url, referrer,
+                                 WindowOpenDisposition::CURRENT_TAB, type, NO);
   delegate_->GetWebState()->OpenURL(params);
 }
 
@@ -310,7 +311,8 @@
   GURL url = item ? item->GetURL() : GURL(url::kAboutBlankURL);
   web::Referrer referrer = item ? item->GetReferrer() : web::Referrer();
 
-  WebState::OpenURLParams params(url, referrer, CURRENT_TAB,
+  WebState::OpenURLParams params(url, referrer,
+                                 WindowOpenDisposition::CURRENT_TAB,
                                  ui::PAGE_TRANSITION_RELOAD, NO);
   delegate_->GetWebState()->OpenURL(params);
 }
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index e709907b..09602242 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -4975,6 +4975,13 @@
     }
   }
 
+  if (!allowLoad && action.targetFrame.isMainFrame) {
+    // WKWebView will stop this navigation without calling any further
+    // callbacks, so change load phase to loaded now.
+    _loadPhase = web::PAGE_LOADED;
+    _webStateImpl->SetIsLoading(false);
+  }
+
   decisionHandler(allowLoad ? WKNavigationActionPolicyAllow
                             : WKNavigationActionPolicyCancel);
 }
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index a496106..8937a93 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -144,21 +144,25 @@
 const base::Feature kNewAudioRenderingMixingStrategy{
     "NewAudioRenderingMixingStrategy", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Only used for disabling overlay fullscreen (aka SurfaceView) in Clank.
+const base::Feature kOverlayFullscreenVideo{"overlay-fullscreen-video",
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Let videos be resumed via remote controls (for example, the notification)
 // when in background.
 const base::Feature kResumeBackgroundVideo {
   "resume-background-video",
 #if defined(OS_ANDROID)
       base::FEATURE_ENABLED_BY_DEFAULT
-};
 #else
       base::FEATURE_DISABLED_BY_DEFAULT
-};
 #endif
+};
 
 // Use shared block-based buffering for media.
 const base::Feature kUseNewMediaCache{"use-new-media-cache",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Correct video colors based on output display?
 const base::Feature kVideoColorManagement{"video-color-management",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index d4b47cc..e6df871 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -84,6 +84,7 @@
 #endif  // defined(ENABLE_PLUGINS)
 
 MEDIA_EXPORT extern const base::Feature kNewAudioRenderingMixingStrategy;
+MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo;
 MEDIA_EXPORT extern const base::Feature kResumeBackgroundVideo;
 MEDIA_EXPORT extern const base::Feature kUseNewMediaCache;
 MEDIA_EXPORT extern const base::Feature kVideoColorManagement;
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index cde7e38e..32522ff9 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -235,6 +235,9 @@
   force_video_overlays_ = base::CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kForceVideoOverlays);
 
+  disable_fullscreen_video_overlays_ =
+      !base::FeatureList::IsEnabled(media::kOverlayFullscreenVideo);
+
   if (delegate_)
     delegate_id_ = delegate_->AddObserver(this);
 
@@ -332,12 +335,12 @@
 }
 
 void WebMediaPlayerImpl::enteredFullscreen() {
-  if (!force_video_overlays_)
+  if (!force_video_overlays_ && !disable_fullscreen_video_overlays_)
     EnableOverlay();
 }
 
 void WebMediaPlayerImpl::exitedFullscreen() {
-  if (!force_video_overlays_)
+  if (!force_video_overlays_ && !disable_fullscreen_video_overlays_)
     DisableOverlay();
 }
 
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h
index 3cfa2b7..3cea3df 100644
--- a/media/blink/webmediaplayer_impl.h
+++ b/media/blink/webmediaplayer_impl.h
@@ -522,6 +522,10 @@
   // Force to use SurfaceView instead of SurfaceTexture on Android.
   bool force_video_overlays_;
 
+  // Prevent use of SurfaceView on Android. (Ignored when
+  // |force_video_overlays_| is true.)
+  bool disable_fullscreen_video_overlays_;
+
   // Suppresses calls to OnPipelineError() after destruction / shutdown has been
   // started; prevents us from spuriously logging errors that are transient or
   // unimportant.
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 648f7f4..7caec89 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -207,15 +207,12 @@
 
   if (is_android) {
     sources += [
-      "android_copying_backing_strategy.cc",
-      "android_copying_backing_strategy.h",
-      "android_deferred_rendering_backing_strategy.cc",
-      "android_deferred_rendering_backing_strategy.h",
       "android_video_decode_accelerator.cc",
       "android_video_decode_accelerator.h",
       "avda_codec_image.cc",
       "avda_codec_image.h",
-      "avda_return_on_failure.h",
+      "avda_picture_buffer_manager.cc",
+      "avda_picture_buffer_manager.h",
       "avda_shared_state.cc",
       "avda_shared_state.h",
       "avda_state_provider.h",
diff --git a/media/gpu/android_copying_backing_strategy.cc b/media/gpu/android_copying_backing_strategy.cc
deleted file mode 100644
index f043498..0000000
--- a/media/gpu/android_copying_backing_strategy.cc
+++ /dev/null
@@ -1,179 +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 "media/gpu/android_copying_backing_strategy.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/trace_event/trace_event.h"
-#include "gpu/command_buffer/service/context_group.h"
-#include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
-#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
-#include "media/base/limits.h"
-#include "media/gpu/avda_return_on_failure.h"
-#include "media/video/picture.h"
-#include "ui/gl/android/surface_texture.h"
-#include "ui/gl/gl_bindings.h"
-
-namespace media {
-
-AndroidCopyingBackingStrategy::AndroidCopyingBackingStrategy(
-    AVDAStateProvider* state_provider)
-    : state_provider_(state_provider),
-      surface_texture_id_(0),
-      media_codec_(nullptr) {}
-
-AndroidCopyingBackingStrategy::~AndroidCopyingBackingStrategy() {}
-
-gl::ScopedJavaSurface AndroidCopyingBackingStrategy::Initialize(
-    int surface_view_id) {
-  if (surface_view_id != VideoDecodeAccelerator::Config::kNoSurfaceID) {
-    LOG(ERROR) << "The copying strategy should not be initialized with a "
-                  "surface id.";
-    return gl::ScopedJavaSurface();
-  }
-
-  surface_texture_ =
-      state_provider_->CreateAttachedSurfaceTexture(&surface_texture_id_);
-  return gl::ScopedJavaSurface(surface_texture_.get());
-}
-
-void AndroidCopyingBackingStrategy::BeginCleanup(
-    bool have_context,
-    const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
-  DCHECK(state_provider_->ThreadChecker().CalledOnValidThread());
-
-  if (copier_)
-    copier_->Destroy();
-
-  if (surface_texture_id_ && have_context)
-    glDeleteTextures(1, &surface_texture_id_);
-}
-
-void AndroidCopyingBackingStrategy::EndCleanup() {}
-
-scoped_refptr<gl::SurfaceTexture>
-AndroidCopyingBackingStrategy::GetSurfaceTexture() const {
-  return surface_texture_;
-}
-
-uint32_t AndroidCopyingBackingStrategy::GetTextureTarget() const {
-  return GL_TEXTURE_2D;
-}
-
-gfx::Size AndroidCopyingBackingStrategy::GetPictureBufferSize() const {
-  return state_provider_->GetSize();
-}
-
-void AndroidCopyingBackingStrategy::UseCodecBufferForPictureBuffer(
-    int32_t codec_buf_index,
-    const PictureBuffer& picture_buffer) {
-  // Make sure that the decoder is available.
-  RETURN_ON_FAILURE(state_provider_, state_provider_->GetGlDecoder().get(),
-                    "Failed to get gles2 decoder instance.", ILLEGAL_STATE);
-
-  // Render the codec buffer into |surface_texture_|, and switch it to be
-  // the front buffer.
-  // This ignores the emitted ByteBuffer and instead relies on rendering to
-  // the codec's SurfaceTexture and then copying from that texture to the
-  // client's PictureBuffer's texture.  This means that each picture's data
-  // is written three times: once to the ByteBuffer, once to the
-  // SurfaceTexture, and once to the client's texture.  It would be nicer to
-  // either:
-  // 1) Render directly to the client's texture from MediaCodec (one write);
-  //    or
-  // 2) Upload the ByteBuffer to the client's texture (two writes).
-  // Unfortunately neither is possible:
-  // 1) MediaCodec's use of SurfaceTexture is a singleton, and the texture
-  //    written to can't change during the codec's lifetime.  b/11990461
-  // 2) The ByteBuffer is likely to contain the pixels in a vendor-specific,
-  //    opaque/non-standard format.  It's not possible to negotiate the
-  //    decoder to emit a specific colorspace, even using HW CSC.  b/10706245
-  // So, we live with these two extra copies per picture :(
-  {
-    TRACE_EVENT0("media", "AVDA::ReleaseOutputBuffer");
-    media_codec_->ReleaseOutputBuffer(codec_buf_index, true);
-  }
-
-  {
-    TRACE_EVENT0("media", "AVDA::UpdateTexImage");
-    surface_texture_->UpdateTexImage();
-  }
-
-  float transform_matrix[16];
-  surface_texture_->GetTransformMatrix(transform_matrix);
-
-  DCHECK_LE(1u, picture_buffer.texture_ids().size());
-  uint32_t picture_buffer_texture_id = picture_buffer.texture_ids()[0];
-
-  // Defer initializing the CopyTextureCHROMIUMResourceManager until it is
-  // needed because it takes 10s of milliseconds to initialize.
-  if (!copier_) {
-    copier_.reset(new gpu::CopyTextureCHROMIUMResourceManager());
-    copier_->Initialize(state_provider_->GetGlDecoder().get(),
-                        state_provider_->GetGlDecoder()
-                            ->GetContextGroup()
-                            ->feature_info()
-                            ->feature_flags());
-  }
-
-  // Here, we copy |surface_texture_id_| to the picture buffer instead of
-  // setting new texture to |surface_texture_| by calling attachToGLContext()
-  // because:
-  // 1. Once we call detachFrameGLContext(), it deletes the texture previously
-  //    attached.
-  // 2. SurfaceTexture requires us to apply a transform matrix when we show
-  //    the texture.
-  copier_->DoCopyTextureWithTransform(
-      state_provider_->GetGlDecoder().get(), GL_TEXTURE_EXTERNAL_OES,
-      surface_texture_id_, GL_TEXTURE_2D, picture_buffer_texture_id,
-      state_provider_->GetSize().width(), state_provider_->GetSize().height(),
-      true, false, false, transform_matrix);
-}
-
-void AndroidCopyingBackingStrategy::CodecChanged(VideoCodecBridge* codec) {
-  media_codec_ = codec;
-}
-
-void AndroidCopyingBackingStrategy::OnFrameAvailable() {
-  // TODO(liberato): crbug.com/574948 .  The OnFrameAvailable logic can be
-  // moved into AVDA, and we should wait for it before doing the copy.
-  // Because there were some test failures, we don't do this now but
-  // instead preserve the old behavior.
-}
-
-bool AndroidCopyingBackingStrategy::ArePicturesOverlayable() {
-  return false;
-}
-
-void AndroidCopyingBackingStrategy::UpdatePictureBufferSize(
-    PictureBuffer* picture_buffer,
-    const gfx::Size& new_size) {
-  // This strategy uses 2D textures who's allocated memory is dependent on the
-  // size. To update size in all places, we must:
-  // 1) Update the PictureBuffer meta-data
-  picture_buffer->set_size(new_size);
-
-  // 2) Update the GL texture via glTexImage2D. This step assumes the caller
-  // has made our GL context current.
-  DCHECK_LE(1u, picture_buffer->texture_ids().size());
-  glBindTexture(GL_TEXTURE_2D, picture_buffer->texture_ids()[0]);
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, new_size.width(), new_size.height(),
-               0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-  state_provider_->GetGlDecoder()->RestoreActiveTextureUnitBinding(
-      GL_TEXTURE_2D);
-
-  // 3) Update the CHROMIUM Texture's size.
-  gpu::gles2::TextureRef* texture_ref =
-      state_provider_->GetTextureForPicture(*picture_buffer);
-  RETURN_IF_NULL(texture_ref);
-  gpu::gles2::TextureManager* texture_manager =
-      state_provider_->GetGlDecoder()->GetContextGroup()->texture_manager();
-  RETURN_IF_NULL(texture_manager);
-  texture_manager->SetLevelInfo(texture_ref, GetTextureTarget(), 0, GL_RGBA,
-                                new_size.width(), new_size.height(), 1, 0,
-                                GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect(new_size));
-}
-
-}  // namespace media
diff --git a/media/gpu/android_copying_backing_strategy.h b/media/gpu/android_copying_backing_strategy.h
deleted file mode 100644
index d716e80..0000000
--- a/media/gpu/android_copying_backing_strategy.h
+++ /dev/null
@@ -1,71 +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 MEDIA_GPU_ANDROID_COPYING_BACKING_STRATEGY_H_
-#define MEDIA_GPU_ANDROID_COPYING_BACKING_STRATEGY_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "media/gpu/android_video_decode_accelerator.h"
-#include "media/gpu/media_gpu_export.h"
-
-namespace gpu {
-class CopyTextureCHROMIUMResourceManager;
-}
-
-namespace media {
-class PictureBuffer;
-}
-
-namespace media {
-
-class AVDAStateProvider;
-
-// A BackingStrategy implementation that copies images to PictureBuffer
-// textures via gpu texture copy.
-class MEDIA_GPU_EXPORT AndroidCopyingBackingStrategy
-    : public AndroidVideoDecodeAccelerator::BackingStrategy {
- public:
-  explicit AndroidCopyingBackingStrategy(AVDAStateProvider* state_provider);
-  ~AndroidCopyingBackingStrategy() override;
-
-  // AndroidVideoDecodeAccelerator::BackingStrategy
-  gl::ScopedJavaSurface Initialize(int surface_view_id) override;
-  void BeginCleanup(
-      bool have_context,
-      const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) override;
-  void EndCleanup() override;
-  scoped_refptr<gl::SurfaceTexture> GetSurfaceTexture() const override;
-  uint32_t GetTextureTarget() const override;
-  gfx::Size GetPictureBufferSize() const override;
-  void UseCodecBufferForPictureBuffer(
-      int32_t codec_buffer_index,
-      const PictureBuffer& picture_buffer) override;
-  void CodecChanged(VideoCodecBridge* codec) override;
-  void OnFrameAvailable() override;
-  bool ArePicturesOverlayable() override;
-  void UpdatePictureBufferSize(PictureBuffer* picture_buffer,
-                               const gfx::Size& new_size) override;
-
- private:
-  // Used for copy the texture from surface texture to picture buffers.
-  std::unique_ptr<gpu::CopyTextureCHROMIUMResourceManager> copier_;
-
-  AVDAStateProvider* state_provider_;
-
-  // A container of texture. Used to set a texture to |media_codec_|.
-  scoped_refptr<gl::SurfaceTexture> surface_texture_;
-
-  // The texture id which is set to |surface_texture_|.
-  uint32_t surface_texture_id_;
-
-  VideoCodecBridge* media_codec_;
-};
-
-}  // namespace media
-
-#endif  // MEDIA_GPU_ANDROID_COPYING_BACKING_STRATEGY_H_
diff --git a/media/gpu/android_deferred_rendering_backing_strategy.h b/media/gpu/android_deferred_rendering_backing_strategy.h
deleted file mode 100644
index 948ff95..0000000
--- a/media/gpu/android_deferred_rendering_backing_strategy.h
+++ /dev/null
@@ -1,107 +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 MEDIA_GPU_ANDROID_DEFERRED_RENDERING_BACKING_STRATEGY_H_
-#define MEDIA_GPU_ANDROID_DEFERRED_RENDERING_BACKING_STRATEGY_H_
-
-#include <stdint.h>
-#include <vector>
-
-#include "base/macros.h"
-#include "media/gpu/android_video_decode_accelerator.h"
-#include "media/gpu/media_gpu_export.h"
-
-namespace gl {
-class GLImage;
-}
-
-namespace gpu {
-namespace gles2 {
-class GLStreamTextureImage;
-class TextureRef;
-}
-}
-
-namespace media {
-
-class AVDACodecImage;
-class AVDASharedState;
-
-// A BackingStrategy implementation that defers releasing codec buffers until
-// a PictureBuffer's texture is used to draw, then draws using the surface
-// texture's front buffer rather than a copy.  To do this, it uses a GLImage
-// implementation to talk to MediaCodec.
-class MEDIA_GPU_EXPORT AndroidDeferredRenderingBackingStrategy
-    : public AndroidVideoDecodeAccelerator::BackingStrategy {
- public:
-  explicit AndroidDeferredRenderingBackingStrategy(
-      AVDAStateProvider* state_provider);
-  ~AndroidDeferredRenderingBackingStrategy() override;
-
-  // AndroidVideoDecodeAccelerator::BackingStrategy
-  gl::ScopedJavaSurface Initialize(int surface_view_id) override;
-  void BeginCleanup(
-      bool have_context,
-      const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) override;
-  void EndCleanup() override;
-  scoped_refptr<gl::SurfaceTexture> GetSurfaceTexture() const override;
-  uint32_t GetTextureTarget() const override;
-  gfx::Size GetPictureBufferSize() const override;
-  void UseCodecBufferForPictureBuffer(
-      int32_t codec_buffer_index,
-      const PictureBuffer& picture_buffer) override;
-  void AssignOnePictureBuffer(const PictureBuffer&, bool) override;
-  void ReuseOnePictureBuffer(const PictureBuffer& picture_buffer) override;
-  void MaybeRenderEarly() override;
-  void CodecChanged(VideoCodecBridge* codec) override;
-  void ReleaseCodecBuffers(
-      const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) override;
-  void OnFrameAvailable() override;
-  bool ArePicturesOverlayable() override;
-  void UpdatePictureBufferSize(PictureBuffer* picture_buffer,
-                               const gfx::Size& new_size) override;
-
- private:
-  // Release any codec buffer that is associated with the given picture buffer
-  // back to the codec.  It is okay if there is no such buffer.
-  void ReleaseCodecBufferForPicture(const PictureBuffer& picture_buffer);
-
-  // Sets up the texture references (as found by |picture_buffer|), for the
-  // specified |image|. If |image| is null, clears any ref on the texture
-  // associated with |picture_buffer|.
-  void SetImageForPicture(
-      const PictureBuffer& picture_buffer,
-      const scoped_refptr<gpu::gles2::GLStreamTextureImage>& image);
-
-  // Make a copy of the SurfaceTexture's front buffer and associate all given
-  // picture buffer textures with it. The picture buffer textures will not
-  // dependend on |this|, the SurfaceTexture, the MediaCodec or the VDA, so it's
-  // used to back the picture buffers when the VDA is being destroyed.
-  void CopySurfaceTextureToPictures(
-      const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers);
-
-  // Return true if and only if CopySurfaceTextureToPictures is expected to work
-  // on this device.
-  bool ShouldCopyPictures() const;
-
-  scoped_refptr<AVDASharedState> shared_state_;
-
-  AVDAStateProvider* state_provider_;
-
-  // The SurfaceTexture to render to. Non-null after Initialize() if
-  // we're not rendering to a SurfaceView.
-  scoped_refptr<gl::SurfaceTexture> surface_texture_;
-
-  VideoCodecBridge* media_codec_;
-
-  // Picture buffer IDs that are out for display. Stored in order of frames as
-  // they are returned from the decoder.
-  std::vector<int32_t> pictures_out_for_display_;
-
-  DISALLOW_COPY_AND_ASSIGN(AndroidDeferredRenderingBackingStrategy);
-};
-
-}  // namespace media
-
-#endif  // MEDIA_GPU_ANDROID_DEFERRED_RENDERING_BACKING_STRATEGY_H_
diff --git a/media/gpu/android_video_decode_accelerator.cc b/media/gpu/android_video_decode_accelerator.cc
index fcc40220..8ea23a0 100644
--- a/media/gpu/android_video_decode_accelerator.cc
+++ b/media/gpu/android_video_decode_accelerator.cc
@@ -33,9 +33,7 @@
 #include "media/base/media.h"
 #include "media/base/timestamp_constants.h"
 #include "media/base/video_decoder_config.h"
-#include "media/gpu/android_copying_backing_strategy.h"
-#include "media/gpu/android_deferred_rendering_backing_strategy.h"
-#include "media/gpu/avda_return_on_failure.h"
+#include "media/gpu/avda_picture_buffer_manager.h"
 #include "media/gpu/shared_memory_region.h"
 #include "media/video/picture.h"
 #include "ui/gl/android/scoped_java_surface.h"
@@ -126,57 +124,6 @@
 
 }  // namespace
 
-// Handle OnFrameAvailable callbacks safely.  Since they occur asynchronously,
-// we take care that the AVDA that wants them still exists.  A WeakPtr to
-// the AVDA would be preferable, except that OnFrameAvailable callbacks can
-// occur off the gpu main thread.  We also can't guarantee when the
-// SurfaceTexture will quit sending callbacks to coordinate with the
-// destruction of the AVDA, so we have a separate object that the cb can own.
-class AndroidVideoDecodeAccelerator::OnFrameAvailableHandler
-    : public base::RefCountedThreadSafe<OnFrameAvailableHandler> {
- public:
-  // We do not retain ownership of |owner|.  It must remain valid until
-  // after ClearOwner() is called.  This will register with
-  // |surface_texture| to receive OnFrameAvailable callbacks.
-  OnFrameAvailableHandler(
-      AndroidVideoDecodeAccelerator* owner,
-      const scoped_refptr<gl::SurfaceTexture>& surface_texture)
-      : owner_(owner) {
-    // Note that the callback owns a strong ref to us.
-    surface_texture->SetFrameAvailableCallbackOnAnyThread(
-        base::Bind(&OnFrameAvailableHandler::OnFrameAvailable,
-                   scoped_refptr<OnFrameAvailableHandler>(this)));
-  }
-
-  // Forget about our owner, which is required before one deletes it.
-  // No further callbacks will happen once this completes.
-  void ClearOwner() {
-    base::AutoLock lock(lock_);
-    // No callback can happen until we release the lock.
-    owner_ = nullptr;
-  }
-
-  // Call back into our owner if it hasn't been deleted.
-  void OnFrameAvailable() {
-    base::AutoLock auto_lock(lock_);
-    // |owner_| can't be deleted while we have the lock.
-    if (owner_)
-      owner_->OnFrameAvailable();
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<OnFrameAvailableHandler>;
-  virtual ~OnFrameAvailableHandler() {}
-
-  // Protects changes to owner_.
-  base::Lock lock_;
-
-  // AVDA that wants the OnFrameAvailable callback.
-  AndroidVideoDecodeAccelerator* owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(OnFrameAvailableHandler);
-};
-
 // AVDAManager manages shared resources for a number of AVDA instances.
 // Its responsibilities include:
 //  - Starting and stopping a shared "construction" thread for instantiating and
@@ -552,17 +499,6 @@
     return false;
   }
 
-  const gpu::GpuPreferences& gpu_preferences =
-      gles_decoder->GetContextGroup()->gpu_preferences();
-
-  if (UseDeferredRenderingStrategy(gpu_preferences)) {
-    DVLOG(1) << __FUNCTION__ << ", using deferred rendering strategy.";
-    strategy_.reset(new AndroidDeferredRenderingBackingStrategy(this));
-  } else {
-    DVLOG(1) << __FUNCTION__ << ", using copy back strategy.";
-    strategy_.reset(new AndroidCopyingBackingStrategy(this));
-  }
-
   if (!make_context_current_cb_.Run()) {
     LOG(ERROR) << "Failed to make this decoder's GL context current.";
     return false;
@@ -570,7 +506,7 @@
 
   if (g_avda_manager.Get().AllocateSurface(config_.surface_id, this)) {
     // We have succesfully owned the surface, so finish initialization now.
-    return InitializeStrategy();
+    return InitializePictureBufferManager();
   }
 
   // We have to wait for some other AVDA instance to free up the surface.
@@ -581,19 +517,17 @@
 void AndroidVideoDecodeAccelerator::OnSurfaceAvailable(bool success) {
   DCHECK(deferred_initialization_pending_);
 
-  if (!success || !InitializeStrategy()) {
+  if (!success || !InitializePictureBufferManager()) {
     NotifyInitializationComplete(false);
     deferred_initialization_pending_ = false;
   }
 }
 
-bool AndroidVideoDecodeAccelerator::InitializeStrategy() {
-  codec_config_->surface_ = strategy_->Initialize(config_.surface_id);
-  if (codec_config_->surface_.IsEmpty()) {
-    LOG(ERROR) << "Failed to initialize the backing strategy. The returned "
-                  "Java surface is empty.";
+bool AndroidVideoDecodeAccelerator::InitializePictureBufferManager() {
+  codec_config_->surface_ =
+      picture_buffer_manager_.Initialize(this, config_.surface_id);
+  if (codec_config_->surface_.IsEmpty())
     return false;
-  }
 
   on_destroying_surface_cb_ =
       base::Bind(&AndroidVideoDecodeAccelerator::OnDestroyingSurface,
@@ -601,14 +535,6 @@
   AVDASurfaceTracker::GetInstance()->RegisterOnDestroyingSurfaceCallback(
       on_destroying_surface_cb_);
 
-  // TODO(watk,liberato): move this into the strategy.
-  scoped_refptr<gl::SurfaceTexture> surface_texture =
-      strategy_->GetSurfaceTexture();
-  if (surface_texture) {
-    on_frame_available_handler_ =
-        new OnFrameAvailableHandler(this, surface_texture);
-  }
-
   if (!g_avda_manager.Get().StartThread(this))
     return false;
 
@@ -640,7 +566,7 @@
     return;
   }
 
-  strategy_->MaybeRenderEarly();
+  picture_buffer_manager_.MaybeRenderEarly();
   bool did_work = false, did_input = false, did_output = false;
   do {
     did_input = QueueInput();
@@ -953,22 +879,19 @@
   free_picture_ids_.pop();
   TRACE_COUNTER1("media", "AVDA::FreePictureIds", free_picture_ids_.size());
 
-  const auto& i = output_picture_buffers_.find(picture_buffer_id);
-  if (i == output_picture_buffers_.end()) {
+  const auto it = output_picture_buffers_.find(picture_buffer_id);
+  if (it == output_picture_buffers_.end()) {
     POST_ERROR(PLATFORM_FAILURE,
                "Can't find PictureBuffer id: " << picture_buffer_id);
     return;
   }
 
-  bool size_changed = false;
-  if (i->second.size() != size_) {
-    // Size may have changed due to resolution change since the last time this
-    // PictureBuffer was used.
-    strategy_->UpdatePictureBufferSize(&i->second, size_);
-    size_changed = true;
-  }
+  PictureBuffer& picture_buffer = it->second;
+  const bool size_changed = picture_buffer.size() != size_;
+  if (size_changed)
+    picture_buffer.set_size(size_);
 
-  const bool allow_overlay = strategy_->ArePicturesOverlayable();
+  const bool allow_overlay = picture_buffer_manager_.ArePicturesOverlayable();
   UMA_HISTOGRAM_BOOLEAN("Media.AVDA.FrameSentAsOverlay", allow_overlay);
   Picture picture(picture_buffer_id, bitstream_id, gfx::Rect(size_),
                   allow_overlay);
@@ -980,9 +903,9 @@
   // called, so it is safe to do this.
   NotifyPictureReady(picture);
 
-  // Connect the PictureBuffer to the decoded frame, via whatever mechanism the
-  // strategy likes.
-  strategy_->UseCodecBufferForPictureBuffer(codec_buffer_index, i->second);
+  // Connect the PictureBuffer to the decoded frame.
+  picture_buffer_manager_.UseCodecBufferForPictureBuffer(codec_buffer_index,
+                                                         picture_buffer);
 }
 
 void AndroidVideoDecodeAccelerator::Decode(
@@ -1026,9 +949,10 @@
 
 void AndroidVideoDecodeAccelerator::RequestPictureBuffers() {
   if (client_) {
-    client_->ProvidePictureBuffers(kNumPictureBuffers, PIXEL_FORMAT_UNKNOWN, 1,
-                                   strategy_->GetPictureBufferSize(),
-                                   strategy_->GetTextureTarget());
+    client_->ProvidePictureBuffers(
+        kNumPictureBuffers, PIXEL_FORMAT_UNKNOWN, 1,
+        picture_buffer_manager_.GetPictureBufferSize(),
+        picture_buffer_manager_.GetTextureTarget());
   }
 }
 
@@ -1048,7 +972,7 @@
       << "Failed to make GL context current for Assign, continuing.";
 
   for (size_t i = 0; i < buffers.size(); ++i) {
-    if (buffers[i].size() != strategy_->GetPictureBufferSize()) {
+    if (buffers[i].size() != picture_buffer_manager_.GetPictureBufferSize()) {
       POST_ERROR(INVALID_ARGUMENT,
                  "Invalid picture buffer size assigned. Wanted "
                      << size_.ToString() << ", but got "
@@ -1059,7 +983,7 @@
     output_picture_buffers_.insert(std::make_pair(id, buffers[i]));
     free_picture_ids_.push(id);
 
-    strategy_->AssignOnePictureBuffer(buffers[i], have_context);
+    picture_buffer_manager_.AssignOnePictureBuffer(buffers[i], have_context);
   }
   TRACE_COUNTER1("media", "AVDA::FreePictureIds", free_picture_ids_.size());
   DoIOTask(true);
@@ -1072,15 +996,14 @@
   free_picture_ids_.push(picture_buffer_id);
   TRACE_COUNTER1("media", "AVDA::FreePictureIds", free_picture_ids_.size());
 
-  OutputBufferMap::const_iterator i =
-      output_picture_buffers_.find(picture_buffer_id);
-  if (i == output_picture_buffers_.end()) {
+  auto it = output_picture_buffers_.find(picture_buffer_id);
+  if (it == output_picture_buffers_.end()) {
     POST_ERROR(PLATFORM_FAILURE, "Can't find PictureBuffer id "
                                      << picture_buffer_id);
     return;
   }
 
-  strategy_->ReuseOnePictureBuffer(i->second);
+  picture_buffer_manager_.ReuseOnePictureBuffer(it->second);
   DoIOTask(true);
 }
 
@@ -1105,14 +1028,14 @@
 
   state_ = WAITING_FOR_CODEC;
 
-  // Tell the strategy that we're changing codecs.  The codec itself could be
-  // used normally, since we don't replace it until we're back on the main
-  // thread.  However, if we're using an output surface, then the incoming codec
-  // might access that surface while the main thread is drawing.  Telling the
-  // strategy to forget the codec avoids this.
+  // Tell the picture buffer manager that we're changing codecs.  The codec
+  // itself could be used normally, since we don't replace it until we're back
+  // on the main thread.  However, if we're using an output surface, then the
+  // incoming codec might access that surface while the main thread is drawing.
+  // Telling the manager to forget the codec avoids this.
   if (media_codec_) {
     ReleaseMediaCodec();
-    strategy_->CodecChanged(nullptr);
+    picture_buffer_manager_.CodecChanged(nullptr);
   }
 
   // Choose whether to autodetect the codec type.  Note that we do this after
@@ -1205,7 +1128,7 @@
 
   DCHECK(!media_codec_);
   media_codec_ = std::move(media_codec);
-  strategy_->CodecChanged(media_codec_.get());
+  picture_buffer_manager_.CodecChanged(media_codec_.get());
   if (!media_codec_) {
     POST_ERROR(PLATFORM_FAILURE, "Failed to create MediaCodec.");
     return;
@@ -1324,7 +1247,7 @@
     media_codec_->Flush();
     // Since we just flushed all the output buffers, make sure that nothing is
     // using them.
-    strategy_->CodecChanged(media_codec_.get());
+    picture_buffer_manager_.CodecChanged(media_codec_.get());
   } else {
     DVLOG(3) << __FUNCTION__
              << " Deleting the MediaCodec and creating a new one.";
@@ -1356,8 +1279,7 @@
   // Any error that is waiting to post can be ignored.
   error_sequence_token_++;
 
-  DCHECK(strategy_);
-  strategy_->ReleaseCodecBuffers(output_picture_buffers_);
+  picture_buffer_manager_.ReleaseCodecBuffers(output_picture_buffers_);
 
   // Some VP8 files require complete MediaCodec drain before we can call
   // MediaCodec.flush() or MediaCodec.reset(). http://crbug.com/598963.
@@ -1377,29 +1299,18 @@
   DVLOG(1) << __FUNCTION__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  bool have_context = make_context_current_cb_.Run();
-  if (!have_context)
-    LOG(WARNING) << "Failed make GL context current for Destroy, continuing.";
-
-  if (strategy_)
-    strategy_->BeginCleanup(have_context, output_picture_buffers_);
-
-  // If we have an OnFrameAvailable handler, tell it that we're going away.
-  if (on_frame_available_handler_) {
-    on_frame_available_handler_->ClearOwner();
-    on_frame_available_handler_ = nullptr;
-  }
+  picture_buffer_manager_.Destroy(output_picture_buffers_);
 
   client_ = nullptr;
 
-  // Some VP8 files require complete MediaCodec drain before we can call
-  // MediaCodec.flush() or MediaCodec.reset(). http://crbug.com/598963.
+  // Some VP8 files require a complete MediaCodec drain before we can call
+  // MediaCodec.flush() or MediaCodec.release(). http://crbug.com/598963. In
+  // that case, postpone ActualDestroy() until after the drain.
   if (media_codec_ && codec_config_->codec_ == kCodecVP8) {
-    // Clear pending_bitstream_records_.
+    // Clear |pending_bitstream_records_|.
     while (!pending_bitstream_records_.empty())
       pending_bitstream_records_.pop();
 
-    // Postpone ActualDestroy after the drain.
     StartCodecDrain(DRAIN_FOR_DESTROY);
   } else {
     ActualDestroy();
@@ -1415,9 +1326,6 @@
         on_destroying_surface_cb_);
   }
 
-  if (strategy_)
-    strategy_->EndCleanup();
-
   // We no longer care about |surface_id|, in case we did before.  It's okay
   // if we have no surface and/or weren't the owner or a waiter.
   g_avda_manager.Get().DeallocateSurface(config_.surface_id, this);
@@ -1430,6 +1338,7 @@
     g_avda_manager.Get().StopTimer(this);
     ReleaseMediaCodec();
   }
+
   delete this;
 }
 
@@ -1443,66 +1352,11 @@
   return size_;
 }
 
-const base::ThreadChecker& AndroidVideoDecodeAccelerator::ThreadChecker()
-    const {
-  return thread_checker_;
-}
-
 base::WeakPtr<gpu::gles2::GLES2Decoder>
 AndroidVideoDecodeAccelerator::GetGlDecoder() const {
   return get_gles2_decoder_cb_.Run();
 }
 
-gpu::gles2::TextureRef* AndroidVideoDecodeAccelerator::GetTextureForPicture(
-    const PictureBuffer& picture_buffer) {
-  auto gles_decoder = GetGlDecoder();
-  RETURN_ON_FAILURE(this, gles_decoder, "Failed to get GL decoder",
-                    ILLEGAL_STATE, nullptr);
-  RETURN_ON_FAILURE(this, gles_decoder->GetContextGroup(),
-                    "Null gles_decoder->GetContextGroup()", ILLEGAL_STATE,
-                    nullptr);
-  gpu::gles2::TextureManager* texture_manager =
-      gles_decoder->GetContextGroup()->texture_manager();
-  RETURN_ON_FAILURE(this, texture_manager, "Null texture_manager",
-                    ILLEGAL_STATE, nullptr);
-
-  DCHECK_LE(1u, picture_buffer.internal_texture_ids().size());
-  gpu::gles2::TextureRef* texture_ref =
-      texture_manager->GetTexture(picture_buffer.internal_texture_ids()[0]);
-  RETURN_ON_FAILURE(this, texture_manager, "Null texture_ref", ILLEGAL_STATE,
-                    nullptr);
-
-  return texture_ref;
-}
-
-scoped_refptr<gl::SurfaceTexture>
-AndroidVideoDecodeAccelerator::CreateAttachedSurfaceTexture(
-    GLuint* service_id) {
-  GLuint texture_id;
-  glGenTextures(1, &texture_id);
-
-  glActiveTexture(GL_TEXTURE0);
-  glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
-  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-  auto gl_decoder = GetGlDecoder();
-  gl_decoder->RestoreTextureUnitBindings(0);
-  gl_decoder->RestoreActiveTexture();
-  DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
-
-  *service_id = texture_id;
-  // Previously, to reduce context switching, we used to create an unattached
-  // SurfaceTexture and attach it lazily in the compositor's context. But that
-  // was flaky because SurfaceTexture#detachFromGLContext() is buggy on a lot of
-  // devices. Now we attach it to the current context, which means we might have
-  // to context switch later to call updateTexImage(). Fortunately, if virtual
-  // contexts are in use, we won't have to context switch.
-  return gl::SurfaceTexture::Create(texture_id);
-}
-
 void AndroidVideoDecodeAccelerator::OnDestroyingSurface(int surface_id) {
   DCHECK(thread_checker_.CalledOnValidThread());
   TRACE_EVENT0("media", "AVDA::OnDestroyingSurface");
@@ -1517,7 +1371,7 @@
   state_ = SURFACE_DESTROYED;
   if (media_codec_) {
     ReleaseMediaCodec();
-    strategy_->CodecChanged(media_codec_.get());
+    picture_buffer_manager_.CodecChanged(media_codec_.get());
   }
   // If we're draining, signal completion now because the drain can no longer
   // proceed.
@@ -1525,12 +1379,6 @@
     OnDrainCompleted();
 }
 
-void AndroidVideoDecodeAccelerator::OnFrameAvailable() {
-  // Remember: this may be on any thread.
-  DCHECK(strategy_);
-  strategy_->OnFrameAvailable();
-}
-
 void AndroidVideoDecodeAccelerator::PostError(
     const ::tracked_objects::Location& from_here,
     VideoDecodeAccelerator::Error error) {
@@ -1693,12 +1541,6 @@
 }
 
 // static
-bool AndroidVideoDecodeAccelerator::UseDeferredRenderingStrategy(
-    const gpu::GpuPreferences& gpu_preferences) {
-  return true;
-}
-
-// static
 VideoDecodeAccelerator::Capabilities
 AndroidVideoDecodeAccelerator::GetCapabilities(
     const gpu::GpuPreferences& gpu_preferences) {
@@ -1759,20 +1601,18 @@
 
   capabilities.flags =
       VideoDecodeAccelerator::Capabilities::SUPPORTS_DEFERRED_INITIALIZATION;
-  if (UseDeferredRenderingStrategy(gpu_preferences)) {
-    capabilities.flags |= VideoDecodeAccelerator::Capabilities::
-        NEEDS_ALL_PICTURE_BUFFERS_TO_DECODE;
+  capabilities.flags |=
+      VideoDecodeAccelerator::Capabilities::NEEDS_ALL_PICTURE_BUFFERS_TO_DECODE;
 
-    // If we're using threaded texture mailboxes the COPY_REQUIRED flag must be
-    // set on deferred strategy frames (http://crbug.com/582170), and
-    // SurfaceView output is disabled (http://crbug.com/582170).
-    if (gpu_preferences.enable_threaded_texture_mailboxes) {
-      capabilities.flags |=
-          media::VideoDecodeAccelerator::Capabilities::REQUIRES_TEXTURE_COPY;
-    } else if (media::MediaCodecUtil::IsSurfaceViewOutputSupported()) {
-      capabilities.flags |= media::VideoDecodeAccelerator::Capabilities::
-          SUPPORTS_EXTERNAL_OUTPUT_SURFACE;
-    }
+  // If we're using threaded texture mailboxes the COPY_REQUIRED flag must be
+  // set on the video frames (http://crbug.com/582170), and SurfaceView output
+  // is disabled (http://crbug.com/582170).
+  if (gpu_preferences.enable_threaded_texture_mailboxes) {
+    capabilities.flags |=
+        media::VideoDecodeAccelerator::Capabilities::REQUIRES_TEXTURE_COPY;
+  } else if (media::MediaCodecUtil::IsSurfaceViewOutputSupported()) {
+    capabilities.flags |= media::VideoDecodeAccelerator::Capabilities::
+        SUPPORTS_EXTERNAL_OUTPUT_SURFACE;
   }
 
   return capabilities;
diff --git a/media/gpu/android_video_decode_accelerator.h b/media/gpu/android_video_decode_accelerator.h
index 0cf5918b..8470efa 100644
--- a/media/gpu/android_video_decode_accelerator.h
+++ b/media/gpu/android_video_decode_accelerator.h
@@ -9,9 +9,7 @@
 
 #include <list>
 #include <map>
-#include <memory>
 #include <queue>
-#include <string>
 #include <vector>
 
 #include "base/compiler_specific.h"
@@ -22,6 +20,7 @@
 #include "media/base/android/media_drm_bridge_cdm_context.h"
 #include "media/base/android/sdk_media_codec_bridge.h"
 #include "media/base/media_keys.h"
+#include "media/gpu/avda_picture_buffer_manager.h"
 #include "media/gpu/avda_state_provider.h"
 #include "media/gpu/avda_surface_tracker.h"
 #include "media/gpu/gpu_video_decode_accelerator_helpers.h"
@@ -34,92 +33,16 @@
 }
 
 namespace media {
-
 class SharedMemoryRegion;
 
-// A VideoDecodeAccelerator implementation for Android.
-// This class decodes the input encoded stream by using Android's MediaCodec
-// class. http://developer.android.com/reference/android/media/MediaCodec.html
-// It delegates attaching pictures to PictureBuffers to a BackingStrategy, but
-// otherwise handles the work of transferring data to / from MediaCodec.
+// A VideoDecodeAccelerator implementation for Android. This class decodes the
+// encded input stream using Android's MediaCodec. It handles the work of
+// transferring data to and from MediaCodec, and delegates attaching MediaCodec
+// output buffers to PictureBuffers to AVDAPictureBufferManager.
 class MEDIA_GPU_EXPORT AndroidVideoDecodeAccelerator
     : public VideoDecodeAccelerator,
       public AVDAStateProvider {
  public:
-  using OutputBufferMap = std::map<int32_t, PictureBuffer>;
-
-  // A BackingStrategy is responsible for making a PictureBuffer's texture
-  // contain the image that a MediaCodec decoder buffer tells it to.
-  class BackingStrategy {
-   public:
-    virtual ~BackingStrategy() {}
-
-    // Must be called before anything else. If surface_view_id is not equal to
-    // |kNoSurfaceID| it refers to a SurfaceView that the strategy must render
-    // to.
-    // Returns the Java surface to configure MediaCodec with.
-    virtual gl::ScopedJavaSurface Initialize(int surface_view_id) = 0;
-
-    // Called before the AVDA does any Destroy() work.  The strategy should
-    // release any pending codec buffers, for example.
-    virtual void BeginCleanup(bool have_context,
-                              const OutputBufferMap& buffer_map) = 0;
-
-    // Called before the AVDA closes up entirely.  This will be
-    // the last call that the BackingStrategy receives.
-    virtual void EndCleanup() = 0;
-
-    // This returns the SurfaceTexture created by Initialize, or nullptr if
-    // the strategy was initialized with a SurfaceView.
-    virtual scoped_refptr<gl::SurfaceTexture> GetSurfaceTexture() const = 0;
-
-    // Return the GL texture target that the PictureBuffer textures use.
-    virtual uint32_t GetTextureTarget() const = 0;
-
-    // Return the size to use when requesting picture buffers.
-    virtual gfx::Size GetPictureBufferSize() const = 0;
-
-    // Make the provided PictureBuffer draw the image that is represented by
-    // the decoded output buffer at codec_buffer_index.
-    virtual void UseCodecBufferForPictureBuffer(
-        int32_t codec_buffer_index,
-        const PictureBuffer& picture_buffer) = 0;
-
-    // Notify strategy that a picture buffer has been assigned.
-    virtual void AssignOnePictureBuffer(const PictureBuffer& picture_buffer,
-                                        bool have_context) {}
-
-    // Notify strategy that a picture buffer has been reused.
-    virtual void ReuseOnePictureBuffer(const PictureBuffer& picture_buffer) {}
-
-    // Release MediaCodec buffers.
-    virtual void ReleaseCodecBuffers(
-        const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {}
-
-    // Attempts to free up codec output buffers by rendering early.
-    virtual void MaybeRenderEarly() {}
-
-    // Notify strategy that we have a new android MediaCodec instance.  This
-    // happens when we're starting up or re-configuring mid-stream.  Any
-    // previously provided codec should no longer be referenced.
-    virtual void CodecChanged(VideoCodecBridge* codec) = 0;
-
-    // Notify the strategy that a frame is available.  This callback can happen
-    // on any thread at any time.
-    virtual void OnFrameAvailable() = 0;
-
-    // Whether the pictures produced by this backing strategy are overlayable.
-    virtual bool ArePicturesOverlayable() = 0;
-
-    // Size may have changed due to resolution change since the last time this
-    // PictureBuffer was used. Update the size of the picture buffer to
-    // |new_size| and also update any size-dependent state (e.g. size of
-    // associated texture). Callers should set the correct GL context prior to
-    // calling.
-    virtual void UpdatePictureBufferSize(PictureBuffer* picture_buffer,
-                                         const gfx::Size& new_size) = 0;
-  };
-
   AndroidVideoDecodeAccelerator(
       const MakeGLContextCurrentCallback& make_context_current_cb,
       const GetGLES2DecoderCallback& get_gles2_decoder_cb);
@@ -141,22 +64,13 @@
 
   // AVDAStateProvider implementation:
   const gfx::Size& GetSize() const override;
-  const base::ThreadChecker& ThreadChecker() const override;
   base::WeakPtr<gpu::gles2::GLES2Decoder> GetGlDecoder() const override;
-  gpu::gles2::TextureRef* GetTextureForPicture(
-      const PictureBuffer& picture_buffer) override;
-  scoped_refptr<gl::SurfaceTexture> CreateAttachedSurfaceTexture(
-      GLuint* service_id) override;
   void PostError(const ::tracked_objects::Location& from_here,
                  VideoDecodeAccelerator::Error error) override;
 
   static VideoDecodeAccelerator::Capabilities GetCapabilities(
       const gpu::GpuPreferences& gpu_preferences);
 
-  // Notifies about SurfaceTexture::OnFrameAvailable.  This can happen on any
-  // thread at any time!
-  void OnFrameAvailable();
-
  private:
   friend class AVDAManager;
 
@@ -195,8 +109,7 @@
     // Whether encryption scheme requires to use protected surface.
     bool needs_protected_surface_ = false;
 
-    // The surface that MediaCodec is configured to output to. It's created by
-    // the backing strategy.
+    // The surface that MediaCodec is configured to output to.
     gl::ScopedJavaSurface surface_;
 
     // The MediaCrypto object is used in the MediaCodec.configure() in case of
@@ -225,12 +138,12 @@
   // if initialization should stop.
   void OnSurfaceAvailable(bool success);
 
-  // Finish initialization of the strategy.  This is to be called when the
+  // Initialize of the picture buffer manager.  This is to be called when the
   // SurfaceView in |surface_id_|, if any, is no longer busy.  It will return
   // false on failure, and true if initialization was successful.  This includes
   // synchronous and asynchronous init; the AVDA might not yet have a codec on
   // success, but async init will at least be in progress.
-  bool InitializeStrategy();
+  bool InitializePictureBufferManager();
 
   // A part of destruction process that is sometimes postponed after the drain.
   void ActualDestroy();
@@ -355,10 +268,6 @@
   // this.
   void OnDestroyingSurface(int surface_id);
 
-  // Returns true if and only if we should use deferred rendering.
-  static bool UseDeferredRenderingStrategy(
-      const gpu::GpuPreferences& gpu_preferences);
-
   // Indicates if MediaCodec should not be used for software decoding since we
   // have safer versions elsewhere.
   bool IsMediaCodecSoftwareDecodingForbidden() const;
@@ -379,9 +288,8 @@
   // error state.
   State state_;
 
-  // This map maintains the picture buffers passed to the client for decoding.
-  // The key is the picture buffer id.
-  OutputBufferMap output_picture_buffers_;
+  // The assigned picture buffers by picture buffer id.
+  AVDAPictureBufferManager::PictureBufferMap output_picture_buffers_;
 
   // This keeps the free picture buffer ids which can be used for sending
   // decoded frames to the client.
@@ -424,12 +332,7 @@
   // NotifyEndOfBitstreamBuffer() before getting output from the bitstream.
   std::list<int32_t> bitstreams_notified_in_advance_;
 
-  // Backing strategy that we'll use to connect PictureBuffers to frames.
-  std::unique_ptr<BackingStrategy> strategy_;
-
-  // Helper class that manages asynchronous OnFrameAvailable callbacks.
-  class OnFrameAvailableHandler;
-  scoped_refptr<OnFrameAvailableHandler> on_frame_available_handler_;
+  AVDAPictureBufferManager picture_buffer_manager_;
 
   // Time at which we last did useful work on io_timer_.
   base::TimeTicks most_recent_work_;
diff --git a/media/gpu/android_video_decode_accelerator_unittest.cc b/media/gpu/android_video_decode_accelerator_unittest.cc
index aaa7afc..e5e60ad 100644
--- a/media/gpu/android_video_decode_accelerator_unittest.cc
+++ b/media/gpu/android_video_decode_accelerator_unittest.cc
@@ -15,20 +15,21 @@
 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
 #include "media/base/android/media_codec_util.h"
 #include "media/base/android/media_jni_registrar.h"
-#include "media/gpu/android_copying_backing_strategy.h"
 #include "media/gpu/android_video_decode_accelerator.h"
 #include "media/video/picture.h"
 #include "media/video/video_decode_accelerator.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gl/android/surface_texture.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_surface.h"
+#include "ui/gl/init/gl_factory.h"
 
 namespace {
 
-bool MockMakeContextCurrent() {
+bool MakeContextCurrent() {
   return true;
 }
 
-static base::WeakPtr<gpu::gles2::GLES2Decoder> MockGetGLES2Decoder(
+base::WeakPtr<gpu::gles2::GLES2Decoder> GetGLES2Decoder(
     const base::WeakPtr<gpu::gles2::GLES2Decoder>& decoder) {
   return decoder;
 }
@@ -65,43 +66,48 @@
     JNIEnv* env = base::android::AttachCurrentThread();
     RegisterJni(env);
 
-    // Start message loop because
-    // AndroidVideoDecodeAccelerator::ConfigureMediaCodec() starts a timer task.
-    message_loop_.reset(new base::MessageLoop());
+    gl::init::ClearGLBindings();
+    ASSERT_TRUE(gl::init::InitializeGLOneOff());
+    surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size(1024, 1024));
+    context_ = gl::init::CreateGLContext(nullptr, surface_.get(),
+                                         gl::PreferDiscreteGpu);
+    context_->MakeCurrent(surface_.get());
 
-    std::unique_ptr<gpu::gles2::MockGLES2Decoder> decoder(
-        new gpu::gles2::MockGLES2Decoder());
-    std::unique_ptr<MockVideoDecodeAcceleratorClient> client(
-        new MockVideoDecodeAcceleratorClient());
-    accelerator_.reset(new AndroidVideoDecodeAccelerator(
-        base::Bind(&MockMakeContextCurrent),
-        base::Bind(&MockGetGLES2Decoder, decoder->AsWeakPtr())));
+    // Start a message loop because AVDA starts a timer task.
+    message_loop_.reset(new base::MessageLoop());
+    gl_decoder_.reset(new testing::NiceMock<gpu::gles2::MockGLES2Decoder>());
+    client_.reset(new MockVideoDecodeAcceleratorClient());
+
+    vda_.reset(new AndroidVideoDecodeAccelerator(
+        base::Bind(&MakeContextCurrent),
+        base::Bind(&GetGLES2Decoder, gl_decoder_->AsWeakPtr())));
   }
 
-  bool Configure(VideoCodec codec) {
-    AndroidVideoDecodeAccelerator* accelerator =
-        static_cast<AndroidVideoDecodeAccelerator*>(accelerator_.get());
-    scoped_refptr<gl::SurfaceTexture> surface_texture =
-        gl::SurfaceTexture::Create(0);
-    accelerator->codec_config_->surface_ =
-        gl::ScopedJavaSurface(surface_texture.get());
-    accelerator->codec_config_->codec_ = codec;
-    return accelerator->ConfigureMediaCodecSynchronously();
+  bool Initialize(VideoCodecProfile profile) {
+    return vda_->Initialize(VideoDecodeAccelerator::Config(profile),
+                            client_.get());
   }
 
  private:
-  std::unique_ptr<VideoDecodeAccelerator> accelerator_;
   std::unique_ptr<base::MessageLoop> message_loop_;
+  scoped_refptr<gl::GLSurface> surface_;
+  scoped_refptr<gl::GLContext> context_;
+  std::unique_ptr<gpu::gles2::MockGLES2Decoder> gl_decoder_;
+  std::unique_ptr<MockVideoDecodeAcceleratorClient> client_;
+
+  // This must be a unique pointer to a VDA and not an AVDA to ensure the
+  // the default_delete specialization that calls Destroy() will be used.
+  std::unique_ptr<VideoDecodeAccelerator> vda_;
 };
 
 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureUnsupportedCodec) {
-  EXPECT_FALSE(Configure(kUnknownVideoCodec));
+  ASSERT_FALSE(Initialize(VIDEO_CODEC_PROFILE_UNKNOWN));
 }
 
 TEST_F(AndroidVideoDecodeAcceleratorTest, ConfigureSupportedCodec) {
   if (!MediaCodecUtil::IsMediaCodecAvailable())
     return;
-  EXPECT_TRUE(Configure(kCodecVP8));
+  ASSERT_TRUE(Initialize(VP8PROFILE_ANY));
 }
 
 }  // namespace media
diff --git a/media/gpu/android_deferred_rendering_backing_strategy.cc b/media/gpu/avda_picture_buffer_manager.cc
similarity index 61%
rename from media/gpu/android_deferred_rendering_backing_strategy.cc
rename to media/gpu/avda_picture_buffer_manager.cc
index 53105fd4..7d6b5d0 100644
--- a/media/gpu/android_deferred_rendering_backing_strategy.cc
+++ b/media/gpu/avda_picture_buffer_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/gpu/android_deferred_rendering_backing_strategy.h"
+#include "media/gpu/avda_picture_buffer_manager.h"
 
 #include <EGL/egl.h>
 #include <EGL/eglext.h>
@@ -18,8 +18,8 @@
 #include "gpu/command_buffer/service/texture_manager.h"
 #include "gpu/ipc/common/gpu_surface_lookup.h"
 #include "gpu/ipc/service/gpu_channel.h"
+#include "media/base/android/sdk_media_codec_bridge.h"
 #include "media/gpu/avda_codec_image.h"
-#include "media/gpu/avda_return_on_failure.h"
 #include "media/gpu/avda_shared_state.h"
 #include "ui/gl/android/surface_texture.h"
 #include "ui/gl/egl_util.h"
@@ -28,17 +28,112 @@
 #include "ui/gl/scoped_binders.h"
 #include "ui/gl/scoped_make_current.h"
 
+// If !|ptr|, log a message, post an error to |state_provider_|, and
+// return an optional value.
+#define RETURN_IF_NULL(ptr, ...)                                         \
+  do {                                                                   \
+    if (!(ptr)) {                                                        \
+      DLOG(ERROR) << "Got null for " << #ptr;                            \
+      state_provider_->PostError(FROM_HERE,                              \
+                                 VideoDecodeAccelerator::ILLEGAL_STATE); \
+      return __VA_ARGS__;                                                \
+    }                                                                    \
+  } while (0)
+
+// Return nullptr if !|ptr|.
+#define RETURN_NULL_IF_NULL(ptr) RETURN_IF_NULL(ptr, nullptr)
+
 namespace media {
+namespace {
 
-AndroidDeferredRenderingBackingStrategy::
-    AndroidDeferredRenderingBackingStrategy(AVDAStateProvider* state_provider)
-    : state_provider_(state_provider), media_codec_(nullptr) {}
+// Creates a SurfaceTexture and attaches a new gl texture to it. |*service_id|
+// is set to the new texture id.
+scoped_refptr<gl::SurfaceTexture> CreateAttachedSurfaceTexture(
+    base::WeakPtr<gpu::gles2::GLES2Decoder> gl_decoder,
+    GLuint* service_id) {
+  GLuint texture_id;
+  glGenTextures(1, &texture_id);
 
-AndroidDeferredRenderingBackingStrategy::
-    ~AndroidDeferredRenderingBackingStrategy() {}
+  glActiveTexture(GL_TEXTURE0);
+  glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
+  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+  glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-gl::ScopedJavaSurface AndroidDeferredRenderingBackingStrategy::Initialize(
+  gl_decoder->RestoreTextureUnitBindings(0);
+  gl_decoder->RestoreActiveTexture();
+  DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError());
+
+  *service_id = texture_id;
+  // Previously, to reduce context switching, we used to create an unattached
+  // SurfaceTexture and attach it lazily in the compositor's context. But that
+  // was flaky because SurfaceTexture#detachFromGLContext() is buggy on a lot of
+  // devices. Now we attach it to the current context, which means we might have
+  // to context switch later to call updateTexImage(). Fortunately, if virtual
+  // contexts are in use, we won't have to context switch.
+  return gl::SurfaceTexture::Create(texture_id);
+}
+
+}  // namespace
+
+// Handle OnFrameAvailable callbacks safely.  Since they occur asynchronously,
+// we take care that the object that wants them still exists.  WeakPtrs cannot
+// be used because OnFrameAvailable callbacks can occur on any thread. We also
+// can't guarantee when the SurfaceTexture will quit sending callbacks to
+// coordinate with the destruction of the AVDA and PictureBufferManager, so we
+// have a separate object that the callback can own.
+class AVDAPictureBufferManager::OnFrameAvailableHandler
+    : public base::RefCountedThreadSafe<OnFrameAvailableHandler> {
+ public:
+  // We do not retain ownership of |listener|.  It must remain valid until after
+  // ClearListener() is called.  This will register with |surface_texture| to
+  // receive OnFrameAvailable callbacks.
+  OnFrameAvailableHandler(AVDASharedState* listener,
+                          gl::SurfaceTexture* surface_texture)
+      : listener_(listener) {
+    surface_texture->SetFrameAvailableCallbackOnAnyThread(
+        base::Bind(&OnFrameAvailableHandler::OnFrameAvailable,
+                   scoped_refptr<OnFrameAvailableHandler>(this)));
+  }
+
+  // Forget about |listener_|, which is required before one deletes it.
+  // No further callbacks will happen once this completes.
+  void ClearListener() {
+    base::AutoLock lock(lock_);
+    listener_ = nullptr;
+  }
+
+  // Notify the listener if there is one.
+  void OnFrameAvailable() {
+    base::AutoLock auto_lock(lock_);
+    if (listener_)
+      listener_->SignalFrameAvailable();
+  }
+
+ private:
+  friend class base::RefCountedThreadSafe<OnFrameAvailableHandler>;
+
+  ~OnFrameAvailableHandler() { DCHECK(!listener_); }
+
+  // Protects changes to listener_.
+  base::Lock lock_;
+
+  // The AVDASharedState that wants the OnFrameAvailable callback.
+  AVDASharedState* listener_;
+
+  DISALLOW_COPY_AND_ASSIGN(OnFrameAvailableHandler);
+};
+
+AVDAPictureBufferManager::AVDAPictureBufferManager()
+    : state_provider_(nullptr), media_codec_(nullptr) {}
+
+AVDAPictureBufferManager::~AVDAPictureBufferManager() {}
+
+gl::ScopedJavaSurface AVDAPictureBufferManager::Initialize(
+    AVDAStateProvider* state_provider,
     int surface_view_id) {
+  state_provider_ = state_provider;
   shared_state_ = new AVDASharedState();
 
   bool using_virtual_context = false;
@@ -54,41 +149,38 @@
         surface_view_id);
   }
 
-  // Create a SurfaceTexture.
+  // Otherwise create a SurfaceTexture.
   GLuint service_id = 0;
-  surface_texture_ = state_provider_->CreateAttachedSurfaceTexture(&service_id);
+  surface_texture_ = CreateAttachedSurfaceTexture(
+      state_provider_->GetGlDecoder(), &service_id);
+  if (surface_texture_) {
+    on_frame_available_handler_ = new OnFrameAvailableHandler(
+        shared_state_.get(), surface_texture_.get());
+  }
   shared_state_->SetSurfaceTexture(surface_texture_, service_id);
   return gl::ScopedJavaSurface(surface_texture_.get());
 }
 
-void AndroidDeferredRenderingBackingStrategy::BeginCleanup(
-    bool have_context,
-    const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
-  // If we failed before Initialize, then do nothing.
+void AVDAPictureBufferManager::Destroy(const PictureBufferMap& buffers) {
+  // Do nothing if Initialize() has not been called.
   if (!shared_state_)
     return;
 
-  // TODO(liberato): we should release all codec buffers here without rendering.
-  // CodecChanged() will drop them, but is expected to be called after the codec
-  // is no longer accessible.  It's unclear that VP8 flush in AVDA can't hang
-  // waiting for our buffers.
+  // If we have an OnFrameAvailable handler, tell it that we no longer want
+  // callbacks.
+  if (on_frame_available_handler_)
+    on_frame_available_handler_->ClearListener();
 
+  ReleaseCodecBuffers(buffers);
   CodecChanged(nullptr);
-}
 
-void AndroidDeferredRenderingBackingStrategy::EndCleanup() {
   // Release the surface texture and any back buffers.  This will preserve the
   // front buffer, if any.
   if (surface_texture_)
     surface_texture_->ReleaseSurfaceTexture();
 }
 
-scoped_refptr<gl::SurfaceTexture>
-AndroidDeferredRenderingBackingStrategy::GetSurfaceTexture() const {
-  return surface_texture_;
-}
-
-uint32_t AndroidDeferredRenderingBackingStrategy::GetTextureTarget() const {
+uint32_t AVDAPictureBufferManager::GetTextureTarget() const {
   // If we're using a surface texture, then we need an external texture target
   // to sample from it.  If not, then we'll use 2D transparent textures to draw
   // a transparent hole through which to see the SurfaceView.  This is normally
@@ -97,8 +189,7 @@
   return surface_texture_ ? GL_TEXTURE_EXTERNAL_OES : GL_TEXTURE_2D;
 }
 
-gfx::Size AndroidDeferredRenderingBackingStrategy::GetPictureBufferSize()
-    const {
+gfx::Size AVDAPictureBufferManager::GetPictureBufferSize() const {
   // For SurfaceView, request a 1x1 2D texture to reduce memory during
   // initialization.  For SurfaceTexture, allocate a picture buffer that is the
   // actual frame size.  Note that it will be an external texture anyway, so it
@@ -108,11 +199,28 @@
   return surface_texture_ ? state_provider_->GetSize() : gfx::Size(1, 1);
 }
 
-void AndroidDeferredRenderingBackingStrategy::SetImageForPicture(
+gpu::gles2::TextureRef* AVDAPictureBufferManager::GetTextureForPicture(
+    const PictureBuffer& picture_buffer) {
+  auto gles_decoder = state_provider_->GetGlDecoder();
+  RETURN_NULL_IF_NULL(gles_decoder);
+  RETURN_NULL_IF_NULL(gles_decoder->GetContextGroup());
+
+  gpu::gles2::TextureManager* texture_manager =
+      gles_decoder->GetContextGroup()->texture_manager();
+  RETURN_NULL_IF_NULL(texture_manager);
+
+  DCHECK_LE(1u, picture_buffer.internal_texture_ids().size());
+  gpu::gles2::TextureRef* texture_ref =
+      texture_manager->GetTexture(picture_buffer.internal_texture_ids()[0]);
+  RETURN_NULL_IF_NULL(texture_ref);
+
+  return texture_ref;
+}
+
+void AVDAPictureBufferManager::SetImageForPicture(
     const PictureBuffer& picture_buffer,
     const scoped_refptr<gpu::gles2::GLStreamTextureImage>& image) {
-  gpu::gles2::TextureRef* texture_ref =
-      state_provider_->GetTextureForPicture(picture_buffer);
+  gpu::gles2::TextureRef* texture_ref = GetTextureForPicture(picture_buffer);
   RETURN_IF_NULL(texture_ref);
 
   gpu::gles2::TextureManager* texture_manager =
@@ -155,7 +263,7 @@
                                               stream_texture_service_id);
 }
 
-void AndroidDeferredRenderingBackingStrategy::UseCodecBufferForPictureBuffer(
+void AVDAPictureBufferManager::UseCodecBufferForPictureBuffer(
     int32_t codec_buf_index,
     const PictureBuffer& picture_buffer) {
   // Make sure that the decoder is available.
@@ -176,7 +284,7 @@
   MaybeRenderEarly();
 }
 
-void AndroidDeferredRenderingBackingStrategy::AssignOnePictureBuffer(
+void AVDAPictureBufferManager::AssignOnePictureBuffer(
     const PictureBuffer& picture_buffer,
     bool have_context) {
   // Attach a GLImage to each texture that will use the surface texture.
@@ -203,7 +311,7 @@
   }
 }
 
-void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBufferForPicture(
+void AVDAPictureBufferManager::ReleaseCodecBufferForPicture(
     const PictureBuffer& picture_buffer) {
   AVDACodecImage* avda_image =
       shared_state_->GetImageForPicture(picture_buffer.id());
@@ -211,7 +319,7 @@
   avda_image->UpdateSurface(AVDACodecImage::UpdateMode::DISCARD_CODEC_BUFFER);
 }
 
-void AndroidDeferredRenderingBackingStrategy::ReuseOnePictureBuffer(
+void AVDAPictureBufferManager::ReuseOnePictureBuffer(
     const PictureBuffer& picture_buffer) {
   pictures_out_for_display_.erase(
       std::remove(pictures_out_for_display_.begin(),
@@ -226,13 +334,13 @@
   MaybeRenderEarly();
 }
 
-void AndroidDeferredRenderingBackingStrategy::ReleaseCodecBuffers(
-    const AndroidVideoDecodeAccelerator::OutputBufferMap& buffers) {
+void AVDAPictureBufferManager::ReleaseCodecBuffers(
+    const PictureBufferMap& buffers) {
   for (const std::pair<int, PictureBuffer>& entry : buffers)
     ReleaseCodecBufferForPicture(entry.second);
 }
 
-void AndroidDeferredRenderingBackingStrategy::MaybeRenderEarly() {
+void AVDAPictureBufferManager::MaybeRenderEarly() {
   if (pictures_out_for_display_.empty())
     return;
 
@@ -287,28 +395,15 @@
       AVDACodecImage::UpdateMode::RENDER_TO_BACK_BUFFER);
 }
 
-void AndroidDeferredRenderingBackingStrategy::CodecChanged(
-    VideoCodecBridge* codec) {
+void AVDAPictureBufferManager::CodecChanged(VideoCodecBridge* codec) {
   media_codec_ = codec;
   shared_state_->CodecChanged(codec);
 }
 
-void AndroidDeferredRenderingBackingStrategy::OnFrameAvailable() {
-  shared_state_->SignalFrameAvailable();
-}
-
-bool AndroidDeferredRenderingBackingStrategy::ArePicturesOverlayable() {
+bool AVDAPictureBufferManager::ArePicturesOverlayable() {
   // SurfaceView frames are always overlayable because that's the only way to
   // display them.
   return !surface_texture_;
 }
 
-void AndroidDeferredRenderingBackingStrategy::UpdatePictureBufferSize(
-    PictureBuffer* picture_buffer,
-    const gfx::Size& new_size) {
-  // This strategy uses EGL images which manage the texture size for us.  We
-  // simply update the PictureBuffer meta-data and leave the texture as-is.
-  picture_buffer->set_size(new_size);
-}
-
 }  // namespace media
diff --git a/media/gpu/avda_picture_buffer_manager.h b/media/gpu/avda_picture_buffer_manager.h
new file mode 100644
index 0000000..3c156fd
--- /dev/null
+++ b/media/gpu/avda_picture_buffer_manager.h
@@ -0,0 +1,121 @@
+// 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 MEDIA_GPU_AVDA_PICTURE_BUFFER_MANAGER_H_
+#define MEDIA_GPU_AVDA_PICTURE_BUFFER_MANAGER_H_
+
+#include <stdint.h>
+#include <vector>
+
+#include "base/macros.h"
+#include "media/gpu/avda_state_provider.h"
+#include "media/gpu/media_gpu_export.h"
+
+namespace gpu {
+namespace gles2 {
+class GLStreamTextureImage;
+}
+}
+
+namespace gl {
+class ScopedJavaSurface;
+class SurfaceTexture;
+}
+
+namespace media {
+class AVDASharedState;
+class VideoCodecBridge;
+
+// AVDAPictureBufferManager is used by AVDA to associate its PictureBuffers with
+// MediaCodec output buffers. It attaches AVDACodecImages to the PictureBuffer
+// textures so that when they're used to draw the AVDACodecImage can release the
+// MediaCodec buffer to the backing Surface. If the Surface is a SurfaceTexture,
+// the front buffer can then be used to draw without needing to copy the pixels.
+// If the Surface is a SurfaceView, the release causes the frame to be displayed
+// immediately.
+class MEDIA_GPU_EXPORT AVDAPictureBufferManager {
+ public:
+  using PictureBufferMap = std::map<int32_t, PictureBuffer>;
+
+  AVDAPictureBufferManager();
+  virtual ~AVDAPictureBufferManager();
+
+  // Must be called before anything else. If |surface_view_id| is |kNoSurfaceID|
+  // then a new SurfaceTexture will be returned. Otherwise, the corresponding
+  // SurfaceView will be returned.
+  gl::ScopedJavaSurface Initialize(AVDAStateProvider* state_provider,
+                                   int surface_view_id);
+
+  void Destroy(const PictureBufferMap& buffers);
+
+  // Returns the GL texture target that the PictureBuffer textures use.
+  uint32_t GetTextureTarget() const;
+
+  // Returns the size to use when requesting picture buffers.
+  gfx::Size GetPictureBufferSize() const;
+
+  // Sets up |picture_buffer| so that its texture will refer to the image that
+  // is represented by the decoded output buffer at codec_buffer_index.
+  void UseCodecBufferForPictureBuffer(int32_t codec_buffer_index,
+                                      const PictureBuffer& picture_buffer);
+
+  // Assigns a picture buffer and attaches an image to its texture.
+  void AssignOnePictureBuffer(const PictureBuffer& picture_buffer,
+                              bool have_context);
+
+  // Reuses a picture buffer to hold a new frame.
+  void ReuseOnePictureBuffer(const PictureBuffer& picture_buffer);
+
+  // Release MediaCodec buffers.
+  void ReleaseCodecBuffers(const PictureBufferMap& buffers);
+
+  // Attempts to free up codec output buffers by rendering early.
+  void MaybeRenderEarly();
+
+  // Called when the MediaCodec instance changes. If |codec| is nullptr the
+  // MediaCodec is being destroyed. Previously provided codecs should no longer
+  // be referenced.
+  void CodecChanged(VideoCodecBridge* codec);
+
+  // Whether the pictures buffers are overlayable.
+  bool ArePicturesOverlayable();
+
+ private:
+  // Release any codec buffer that is associated with the given picture buffer
+  // back to the codec.  It is okay if there is no such buffer.
+  void ReleaseCodecBufferForPicture(const PictureBuffer& picture_buffer);
+
+  gpu::gles2::TextureRef* GetTextureForPicture(
+      const PictureBuffer& picture_buffer);
+
+  // Sets up the texture references (as found by |picture_buffer|), for the
+  // specified |image|. If |image| is null, clears any ref on the texture
+  // associated with |picture_buffer|.
+  void SetImageForPicture(
+      const PictureBuffer& picture_buffer,
+      const scoped_refptr<gpu::gles2::GLStreamTextureImage>& image);
+
+  scoped_refptr<AVDASharedState> shared_state_;
+
+  AVDAStateProvider* state_provider_;
+
+  // The SurfaceTexture to render to. Non-null after Initialize() if
+  // we're not rendering to a SurfaceView.
+  scoped_refptr<gl::SurfaceTexture> surface_texture_;
+
+  class OnFrameAvailableHandler;
+  scoped_refptr<OnFrameAvailableHandler> on_frame_available_handler_;
+
+  VideoCodecBridge* media_codec_;
+
+  // Picture buffer IDs that are out for display. Stored in order of frames as
+  // they are returned from the decoder.
+  std::vector<int32_t> pictures_out_for_display_;
+
+  DISALLOW_COPY_AND_ASSIGN(AVDAPictureBufferManager);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_GPU_AVDA_PICTURE_BUFFER_MANAGER_H_
diff --git a/media/gpu/avda_return_on_failure.h b/media/gpu/avda_return_on_failure.h
deleted file mode 100644
index 7826ca19..0000000
--- a/media/gpu/avda_return_on_failure.h
+++ /dev/null
@@ -1,34 +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 MEDIA_GPU_AVDA_RETURN_ON_FAILURE_H_
-#define MEDIA_GPU_AVDA_RETURN_ON_FAILURE_H_
-
-#include "media/video/video_decode_accelerator.h"
-
-// Helper macros for dealing with failure.  If |result| evaluates false, emit
-// |log| to ERROR, register |error| with the decoder, and return.  This will
-// also transition to the error state, stopping further decoding.
-// This is meant to be used only within AndroidVideoDecoder and the various
-// backing strategies.  |provider| must support PostError.  The varargs
-// can be used for the return value.
-#define RETURN_ON_FAILURE(provider, result, log, error, ...)         \
-  do {                                                               \
-    if (!(result)) {                                                 \
-      DLOG(ERROR) << log;                                            \
-      provider->PostError(FROM_HERE, VideoDecodeAccelerator::error); \
-      return __VA_ARGS__;                                            \
-    }                                                                \
-  } while (0)
-
-// Similar to the above, with some handy boilerplate savings.  The varargs
-// can be used for the return value.
-#define RETURN_IF_NULL(ptr, ...)                                   \
-  RETURN_ON_FAILURE(state_provider_, ptr, "Got null for " << #ptr, \
-                    ILLEGAL_STATE, ##__VA_ARGS__);
-
-// Return null if !ptr.
-#define RETURN_NULL_IF_NULL(ptr) RETURN_IF_NULL(ptr, 0)
-
-#endif  // MEDIA_GPU_AVDA_RETURN_ON_FAILURE_H_
diff --git a/media/gpu/avda_state_provider.h b/media/gpu/avda_state_provider.h
index 2657c32..06498f7 100644
--- a/media/gpu/avda_state_provider.h
+++ b/media/gpu/avda_state_provider.h
@@ -10,10 +10,6 @@
 #include "gpu/command_buffer/service/texture_manager.h"
 #include "media/video/video_decode_accelerator.h"
 
-namespace gl {
-class SurfaceTexture;
-}
-
 namespace gpu {
 namespace gles2 {
 class GLES2Decoder;
@@ -22,21 +18,13 @@
 
 namespace media {
 
-// Helper class that provides the BackingStrategy with enough state
+// Helper class that provides AVDAPictureBufferManager with enough state
 // to do useful work.
 class AVDAStateProvider {
  public:
   // Various handy getters.
   virtual const gfx::Size& GetSize() const = 0;
-  virtual const base::ThreadChecker& ThreadChecker() const = 0;
   virtual base::WeakPtr<gpu::gles2::GLES2Decoder> GetGlDecoder() const = 0;
-  virtual gpu::gles2::TextureRef* GetTextureForPicture(
-      const PictureBuffer& picture_buffer) = 0;
-
-  // Create a SurfaceTexture and attach a new gl texture to it. |*service_id|
-  // is set to the created texture id.
-  virtual scoped_refptr<gl::SurfaceTexture> CreateAttachedSurfaceTexture(
-      GLuint* service_id) = 0;
 
   // Helper function to report an error condition and stop decoding.
   // This will post NotifyError(), and transition to the error state.
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index 07a8b1c..ae28ea81 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -570,9 +570,6 @@
 void H264Validator::ProcessStreamBuffer(const uint8_t* stream, size_t size) {
   h264_parser_.SetStream(stream, static_cast<off_t>(size));
 
-  // Run |frame_cb_| for only first nalu.
-  bool frame_cb_called = false;
-
   while (1) {
     H264NALU nalu;
     H264Parser::Result result;
@@ -593,14 +590,10 @@
         keyframe = true;
       // fallthrough
       case H264NALU::kNonIDRSlice: {
-        // Stream may contain at most one frame.
         ASSERT_TRUE(seen_idr_);
         seen_sps_ = seen_pps_ = false;
-        if (!frame_cb_called) {
-          frame_cb_called = true;
-          if (!frame_cb_.Run(keyframe))
-            return;
-        }
+        if (!frame_cb_.Run(keyframe))
+          return;
         break;
       }
 
@@ -1850,15 +1843,6 @@
                                                           false,
                                                           false,
                                                           false)));
-
-#if defined(OS_MACOSX)
-INSTANTIATE_TEST_CASE_P(
-    VerifyTimestamp,
-    VideoEncodeAcceleratorTest,
-    ::testing::Values(
-        std::make_tuple(1, false, 0, false, false, false, false, false, true)));
-#endif  // defined(OS_MACOSX)
-
 #if defined(OS_WIN)
 INSTANTIATE_TEST_CASE_P(
     ForceBitrate,
diff --git a/media/mojo/services/mojo_media_application.cc b/media/mojo/services/mojo_media_application.cc
index 3e49190e..8c2ea41 100644
--- a/media/mojo/services/mojo_media_application.cc
+++ b/media/mojo/services/mojo_media_application.cc
@@ -37,7 +37,7 @@
 }
 
 bool MojoMediaApplication::OnStop() {
-  mojo_media_client_->WillQuit();
+  mojo_media_client_.reset();
   return true;
 }
 
@@ -49,6 +49,10 @@
 void MojoMediaApplication::CreateServiceFactory(
     mojom::ServiceFactoryRequest request,
     shell::mojom::InterfaceProviderPtr remote_interfaces) {
+  // Ignore request if service has already stopped.
+  if (!mojo_media_client_)
+    return;
+
   // The created object is owned by the pipe.
   new ServiceFactoryImpl(std::move(request), std::move(remote_interfaces),
                          media_log_, ref_factory_.CreateRef(),
diff --git a/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc
index fea7860..7d4de00 100644
--- a/media/mojo/services/mojo_media_client.cc
+++ b/media/mojo/services/mojo_media_client.cc
@@ -21,8 +21,6 @@
 
 void MojoMediaClient::Initialize() {}
 
-void MojoMediaClient::WillQuit() {}
-
 std::unique_ptr<AudioDecoder> MojoMediaClient::CreateAudioDecoder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   return nullptr;
diff --git a/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h
index caf813e..f07d4c4 100644
--- a/media/mojo/services/mojo_media_client.h
+++ b/media/mojo/services/mojo_media_client.h
@@ -33,16 +33,14 @@
 
 class MEDIA_MOJO_EXPORT MojoMediaClient {
  public:
+  // Called before the host application is scheduled to quit.
+  // The application message loop is still valid at this point, so all clean
+  // up tasks requiring the message loop must be completed before returning.
   virtual ~MojoMediaClient();
 
   // Called exactly once before any other method.
   virtual void Initialize();
 
-  // Called before the host application is scheduled to quit.
-  // The application message loop is still valid at this point, so all clean
-  // up tasks requiring the message loop must be completed before returning.
-  virtual void WillQuit();
-
   virtual std::unique_ptr<AudioDecoder> CreateAudioDecoder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
diff --git a/media/mojo/services/test_mojo_media_client.cc b/media/mojo/services/test_mojo_media_client.cc
index a9b1a31..4b11fd7 100644
--- a/media/mojo/services/test_mojo_media_client.cc
+++ b/media/mojo/services/test_mojo_media_client.cc
@@ -24,7 +24,14 @@
 
 TestMojoMediaClient::TestMojoMediaClient() {}
 
-TestMojoMediaClient::~TestMojoMediaClient() {}
+TestMojoMediaClient::~TestMojoMediaClient() {
+  DVLOG(1) << __FUNCTION__;
+  // AudioManager destructor requires MessageLoop.
+  // Destroy it before the message loop goes away.
+  audio_manager_.reset();
+  // Flush the message loop to ensure that the audio manager is destroyed.
+  base::RunLoop().RunUntilIdle();
+}
 
 void TestMojoMediaClient::Initialize() {
   InitializeMediaLibrary();
@@ -39,16 +46,6 @@
     // Flush the message loop to ensure that the audio manager is initialized.
     base::RunLoop().RunUntilIdle();
   }
-
-}
-
-void TestMojoMediaClient::WillQuit() {
-  DVLOG(1) << __FUNCTION__;
-  // AudioManager destructor requires MessageLoop.
-  // Destroy it before the message loop goes away.
-  audio_manager_.reset();
-  // Flush the message loop to ensure that the audio manager is destroyed.
-  base::RunLoop().RunUntilIdle();
 }
 
 scoped_refptr<AudioRendererSink> TestMojoMediaClient::CreateAudioRendererSink(
diff --git a/media/mojo/services/test_mojo_media_client.h b/media/mojo/services/test_mojo_media_client.h
index 78c63dc2..b19f37c 100644
--- a/media/mojo/services/test_mojo_media_client.h
+++ b/media/mojo/services/test_mojo_media_client.h
@@ -31,7 +31,6 @@
 
   // MojoMediaClient implementation.
   void Initialize() final;
-  void WillQuit() final;
   scoped_refptr<AudioRendererSink> CreateAudioRendererSink(
       const std::string& audio_device_id) final;
   std::unique_ptr<VideoRendererSink> CreateVideoRendererSink(
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index 027b5ba..1f6d4b6 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -2510,6 +2510,10 @@
 }
 
 TEST_P(QuicNetworkTransactionTest, QuicForceHolBlocking) {
+  ValueRestore<bool> old_v35_flag(&FLAGS_quic_enable_version_35,
+                                  FLAGS_quic_enable_version_35);
+  ValueRestore<bool> old_v36_flag(&FLAGS_quic_enable_version_36,
+                                  FLAGS_quic_enable_version_36);
   FLAGS_quic_enable_version_35 = true;
   FLAGS_quic_enable_version_36 = true;
   params_.quic_force_hol_blocking = true;
diff --git a/net/quic/core/quic_protocol_test.cc b/net/quic/core/quic_protocol_test.cc
index b2bc2bb..21ea85f 100644
--- a/net/quic/core/quic_protocol_test.cc
+++ b/net/quic/core/quic_protocol_test.cc
@@ -9,6 +9,7 @@
 #include "base/stl_util.h"
 #include "net/quic/core/quic_flags.h"
 #include "net/quic/core/quic_utils.h"
+#include "net/quic/test_tools/quic_test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace net {
@@ -284,6 +285,12 @@
 }
 
 TEST(QuicProtocolTest, FilterSupportedVersions) {
+  ValueRestore<bool> old_v35_flag(&FLAGS_quic_enable_version_35,
+                                  FLAGS_quic_enable_version_35);
+  ValueRestore<bool> old_v36_flag(&FLAGS_quic_enable_version_36,
+                                  FLAGS_quic_enable_version_36);
+  ValueRestore<bool> old_v36_2_flag(&FLAGS_quic_enable_version_36_v2,
+                                    FLAGS_quic_enable_version_36_v2);
   QuicVersionVector all_versions = {
       QUIC_VERSION_30, QUIC_VERSION_31, QUIC_VERSION_32, QUIC_VERSION_33,
       QUIC_VERSION_34, QUIC_VERSION_35, QUIC_VERSION_36};
@@ -300,6 +307,10 @@
 }
 
 TEST(QuicProtocolTest, QuicVersionManager) {
+  ValueRestore<bool> old_v35_flag(&FLAGS_quic_enable_version_35,
+                                  FLAGS_quic_enable_version_35);
+  ValueRestore<bool> old_v36_2_flag(&FLAGS_quic_enable_version_36_v2,
+                                    FLAGS_quic_enable_version_36_v2);
   FLAGS_quic_enable_version_35 = false;
   FLAGS_quic_enable_version_36_v2 = false;
   QuicVersionManager manager(AllSupportedVersions());
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc
index af5d1a5..42eceb1 100644
--- a/pdf/out_of_process_instance.cc
+++ b/pdf/out_of_process_instance.cc
@@ -980,7 +980,8 @@
   pp::VarDictionary message;
   message.Set(kType, kJSNavigateType);
   message.Set(kJSNavigateUrl, url);
-  message.Set(kJSNavigateWindowOpenDisposition, pp::Var(disposition));
+  message.Set(kJSNavigateWindowOpenDisposition,
+              pp::Var(static_cast<int32_t>(disposition)));
   PostMessage(message);
 }
 
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index fffb198..281b1d5 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -3557,7 +3557,8 @@
 void PDFiumEngine::Form_DoURIAction(FPDF_FORMFILLINFO* param,
                                     FPDF_BYTESTRING uri) {
   PDFiumEngine* engine = static_cast<PDFiumEngine*>(param);
-  engine->client_->NavigateTo(std::string(uri), CURRENT_TAB);
+  engine->client_->NavigateTo(std::string(uri),
+                              WindowOpenDisposition::CURRENT_TAB);
 }
 
 void PDFiumEngine::Form_DoGoToAction(FPDF_FORMFILLINFO* param,
diff --git a/remoting/android/client_java_tmpl.gni b/remoting/android/client_java_tmpl.gni
index 1296ac1..72042d649 100644
--- a/remoting/android/client_java_tmpl.gni
+++ b/remoting/android/client_java_tmpl.gni
@@ -31,6 +31,7 @@
       "HostListAdapter.java",
       "HostListManager.java",
       "InputEventSender.java",
+      "InputFeedbackRadiusMapper.java",
       "InputModeChangedEventParameter.java",
       "InputMonitor.java",
       "InputState.java",
diff --git a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
index 43e3907..997ee6f6 100644
--- a/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
+++ b/remoting/android/java/src/org/chromium/chromoting/DesktopView.java
@@ -48,10 +48,6 @@
      */
     protected final Event.Raisable<Void> mOnCanvasRendered = new Event.Raisable<>();
 
-    private final int mTinyFeedbackPixelRadius;
-    private final int mSmallFeedbackPixelRadius;
-    private final int mLargeFeedbackPixelRadius;
-
     /** The parent Desktop activity. */
     private final Desktop mDesktop;
 
@@ -67,15 +63,6 @@
 
         // Give this view keyboard focus, allowing us to customize the soft keyboard's settings.
         setFocusableInTouchMode(true);
-
-        mTinyFeedbackPixelRadius =
-                getResources().getDimensionPixelSize(R.dimen.feedback_animation_radius_tiny);
-
-        mSmallFeedbackPixelRadius =
-                getResources().getDimensionPixelSize(R.dimen.feedback_animation_radius_small);
-
-        mLargeFeedbackPixelRadius =
-                getResources().getDimensionPixelSize(R.dimen.feedback_animation_radius_large);
     }
 
     // TODO(yuweih): move showActionBar and showKeyboard out of this abstract class.
@@ -138,30 +125,6 @@
         return parameter.handled;
     }
 
-    /**
-     * Returns the radius of the given feedback type.
-     * 0.0f will be returned if no feedback should be shown.
-     */
-    protected final float getFeedbackRadius(InputFeedbackType feedbackToShow, float scaleFactor) {
-        switch (feedbackToShow) {
-            case NONE:
-                return 0.0f;
-            case SHORT_TOUCH_ANIMATION:
-                return mSmallFeedbackPixelRadius / scaleFactor;
-            case LONG_TOUCH_ANIMATION:
-                return mLargeFeedbackPixelRadius / scaleFactor;
-            case LONG_TRACKPAD_ANIMATION:
-                // The size of the longpress trackpad animation is supposed to be close to the size
-                // of the cursor so it doesn't need to be normalized and should be scaled with the
-                // canvas.
-                return mTinyFeedbackPixelRadius;
-            default:
-                // Unreachable, but required by Google Java style and findbugs.
-                assert false : "Unreached";
-                return 0.0f;
-        }
-    }
-
     /** Triggers a brief animation to indicate the existence and location of an input event. */
     public abstract void showInputFeedback(InputFeedbackType feedbackToShow, PointF pos);
 
diff --git a/remoting/android/java/src/org/chromium/chromoting/GlDesktopView.java b/remoting/android/java/src/org/chromium/chromoting/GlDesktopView.java
index 4f47e92..458ffb41 100644
--- a/remoting/android/java/src/org/chromium/chromoting/GlDesktopView.java
+++ b/remoting/android/java/src/org/chromium/chromoting/GlDesktopView.java
@@ -17,6 +17,7 @@
  */
 public class GlDesktopView extends DesktopView implements SurfaceHolder.Callback {
     private final GlDisplay mDisplay;
+    private final InputFeedbackRadiusMapper mInputFeedbackMapper;
 
     private Object mOnHostSizeChangedListenerKey;
     private Object mOnCanvasRenderedListenerKey;
@@ -28,14 +29,15 @@
         Preconditions.notNull(display);
         mDisplay = display;
 
-        mScaleFactor = 0;
+        mInputFeedbackMapper = new InputFeedbackRadiusMapper(this);
 
         getHolder().addCallback(this);
     }
 
     @Override
     public void showInputFeedback(InputFeedbackType feedbackToShow, PointF pos) {
-        float diameter = getFeedbackRadius(feedbackToShow, mScaleFactor) * 2.0f;
+        float diameter =
+                mInputFeedbackMapper.getFeedbackRadius(feedbackToShow, mScaleFactor) * 2.0f;
         if (diameter <= 0.0f) {
             return;
         }
diff --git a/remoting/android/java/src/org/chromium/chromoting/InputFeedbackRadiusMapper.java b/remoting/android/java/src/org/chromium/chromoting/InputFeedbackRadiusMapper.java
new file mode 100644
index 0000000..b4908a8
--- /dev/null
+++ b/remoting/android/java/src/org/chromium/chromoting/InputFeedbackRadiusMapper.java
@@ -0,0 +1,54 @@
+// 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.
+
+package org.chromium.chromoting;
+
+import android.view.View;
+
+/**
+ * Helper class for mapping a feedback type to the max radius of the feedback animation circle.
+ */
+public final class InputFeedbackRadiusMapper {
+    private final int mTinyFeedbackPixelRadius;
+    private final int mSmallFeedbackPixelRadius;
+    private final int mLargeFeedbackPixelRadius;
+
+    public InputFeedbackRadiusMapper(View view) {
+        mTinyFeedbackPixelRadius = view.getResources()
+                .getDimensionPixelSize(R.dimen.feedback_animation_radius_tiny);
+
+        mSmallFeedbackPixelRadius = view.getResources()
+                .getDimensionPixelSize(R.dimen.feedback_animation_radius_small);
+
+        mLargeFeedbackPixelRadius = view.getResources()
+                .getDimensionPixelSize(R.dimen.feedback_animation_radius_large);
+    }
+
+    /**
+     * @param feedbackToShow the feedback type to be mapped to the radius of the feedback circle.
+     * @param scaleFactor Current scale factor of the desktop canvas.
+     * @return the radius of the given feedback type. It may be 0, in which case nothing needs to
+     *         be shown.
+     */
+    public float getFeedbackRadius(DesktopView.InputFeedbackType feedbackToShow,
+                                   float scaleFactor) {
+        switch (feedbackToShow) {
+            case NONE:
+                return 0.0f;
+            case SHORT_TOUCH_ANIMATION:
+                return mSmallFeedbackPixelRadius / scaleFactor;
+            case LONG_TOUCH_ANIMATION:
+                return mLargeFeedbackPixelRadius / scaleFactor;
+            case LONG_TRACKPAD_ANIMATION:
+                // The size of the longpress trackpad animation is supposed to be close to the
+                // size of the cursor so it doesn't need to be normalized and should be scaled
+                // with the canvas.
+                return mTinyFeedbackPixelRadius;
+            default:
+                // Unreachable, but required by Google Java style and findbugs.
+                assert false : "Unreached";
+                return 0.0f;
+        }
+    }
+}
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 934571db..167faa8 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -626,6 +626,7 @@
     "host_status_logger_unittest.cc",
     "ipc_desktop_environment_unittest.cc",
     "it2me/it2me_confirmation_dialog_proxy_unittest.cc",
+    "it2me/it2me_host_unittest.cc",
     "it2me/it2me_native_messaging_host_unittest.cc",
     "linux/audio_pipe_reader_unittest.cc",
     "linux/certificate_watcher_unittest.cc",
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc
index d286c09..64fb58a2 100644
--- a/remoting/host/it2me/it2me_host.cc
+++ b/remoting/host/it2me/it2me_host.cc
@@ -4,8 +4,9 @@
 
 #include "remoting/host/it2me/it2me_host.h"
 
-#include <stddef.h>
-
+#include <cstdint>
+#include <memory>
+#include <string>
 #include <utility>
 
 #include "base/bind.h"
@@ -37,6 +38,8 @@
 #include "remoting/protocol/jingle_session_manager.h"
 #include "remoting/protocol/network_settings.h"
 #include "remoting/protocol/transport_context.h"
+#include "remoting/protocol/validating_authenticator.h"
+#include "remoting/signaling/jid_util.h"
 #include "remoting/signaling/server_log_entry.h"
 
 namespace remoting {
@@ -47,6 +50,10 @@
 const char kApplicationName[] = "chromoting";
 const int kMaxLoginAttempts = 5;
 
+using protocol::ValidatingAuthenticator;
+typedef ValidatingAuthenticator::Result ValidationResult;
+typedef ValidatingAuthenticator::ValidationCallback ValidationCallback;
+
 }  // namespace
 
 It2MeHost::It2MeHost(
@@ -70,6 +77,12 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
 }
 
+It2MeHost::~It2MeHost() {
+  // Check that resources that need to be torn down on the UI thread are gone.
+  DCHECK(!desktop_environment_factory_.get());
+  DCHECK(!policy_watcher_.get());
+}
+
 void It2MeHost::Connect() {
   if (!host_context_->ui_task_runner()->BelongsToCurrentThread()) {
     DCHECK(task_runner_->BelongsToCurrentThread());
@@ -323,6 +336,20 @@
   DisconnectOnNetworkThread();
 }
 
+void It2MeHost::SetPolicyForTesting(
+    std::unique_ptr<base::DictionaryValue> policies,
+    const base::Closure& done_callback) {
+  host_context_->network_task_runner()->PostTaskAndReply(
+      FROM_HERE,
+      base::Bind(&It2MeHost::OnPolicyUpdate, this, base::Passed(&policies)),
+      done_callback);
+}
+
+ValidationCallback It2MeHost::GetValidationCallbackForTesting() {
+  return base::Bind(&It2MeHost::ValidateConnectionDetails,
+                    base::Unretained(this));
+}
+
 void It2MeHost::OnPolicyUpdate(
     std::unique_ptr<base::DictionaryValue> policies) {
   // The policy watcher runs on the |ui_task_runner|.
@@ -405,12 +432,6 @@
   required_client_domain_ = client_domain;
 }
 
-It2MeHost::~It2MeHost() {
-  // Check that resources that need to be torn down on the UI thread are gone.
-  DCHECK(!desktop_environment_factory_.get());
-  DCHECK(!policy_watcher_.get());
-}
-
 void It2MeHost::SetState(It2MeHostState state,
                          const std::string& error_message) {
   DCHECK(host_context_->network_task_runner()->BelongsToCurrentThread());
@@ -490,7 +511,8 @@
   std::unique_ptr<protocol::AuthenticatorFactory> factory(
       new protocol::It2MeHostAuthenticatorFactory(
           local_certificate, host_key_pair_, access_code_hash,
-          required_client_domain_));
+          base::Bind(&It2MeHost::ValidateConnectionDetails,
+                     base::Unretained(this))));
   host_->SetAuthenticatorFactory(std::move(factory));
 
   // Pass the Access Code to the script object before changing state.
@@ -501,6 +523,31 @@
   SetState(kReceivedAccessCode, "");
 }
 
+void It2MeHost::ValidateConnectionDetails(
+    const std::string& remote_jid,
+    const protocol::ValidatingAuthenticator::ResultCallback& result_callback) {
+  // Check the client domain policy.
+  if (!required_client_domain_.empty()) {
+    std::string client_username;
+    if (!SplitJidResource(remote_jid, &client_username, /*resource=*/nullptr)) {
+      LOG(ERROR) << "Rejecting incoming connection from " << remote_jid
+                 << ": Invalid JID.";
+      result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT);
+      return;
+    }
+    if (!base::EndsWith(client_username,
+                        std::string("@") + required_client_domain_,
+                        base::CompareCase::INSENSITIVE_ASCII)) {
+      LOG(ERROR) << "Rejecting incoming connection from " << remote_jid
+                 << ": Domain mismatch.";
+      result_callback.Run(ValidationResult::ERROR_INVALID_ACCOUNT);
+      return;
+    }
+  }
+
+  result_callback.Run(ValidationResult::SUCCESS);
+}
+
 It2MeHostFactory::It2MeHostFactory() : policy_service_(nullptr) {
 }
 
diff --git a/remoting/host/it2me/it2me_host.h b/remoting/host/it2me/it2me_host.h
index ba48cac..953beff6 100644
--- a/remoting/host/it2me/it2me_host.h
+++ b/remoting/host/it2me/it2me_host.h
@@ -14,6 +14,7 @@
 #include "remoting/host/host_status_observer.h"
 #include "remoting/host/it2me/it2me_confirmation_dialog.h"
 #include "remoting/host/it2me/it2me_confirmation_dialog_proxy.h"
+#include "remoting/protocol/validating_authenticator.h"
 #include "remoting/signaling/xmpp_signal_strategy.h"
 
 namespace base {
@@ -92,6 +93,16 @@
     SetState(state, error_message);
   }
 
+  // Updates the current policies based on |policies|.  Runs |done_callback| on
+  // the calling thread once the policies have been updated.
+  void SetPolicyForTesting(std::unique_ptr<base::DictionaryValue> policies,
+                           const base::Closure& done_callback);
+
+  // Returns the callback used for validating the connection.  Do not run the
+  // returned callback after this object has been destroyed.
+  protocol::ValidatingAuthenticator::ValidationCallback
+  GetValidationCallbackForTesting();
+
  protected:
   friend class base::RefCountedThreadSafe<It2MeHost>;
 
@@ -141,6 +152,12 @@
 
   void DisconnectOnNetworkThread();
 
+  // Uses details of the connection and current policies to determine if the
+  // connection should be accepted or rejected.
+  void ValidateConnectionDetails(
+      const std::string& remote_jid,
+      const protocol::ValidatingAuthenticator::ResultCallback& result_callback);
+
   // Caller supplied fields.
   std::unique_ptr<ChromotingHostContext> host_context_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
@@ -182,6 +199,10 @@
   // variable contains the thunk if it is necessary.
   base::Closure pending_connect_;
 
+  // Called after the client machine initiates the connection process and
+  // determines whether to reject the connection or allow it to continue.
+  protocol::ValidatingAuthenticator::ValidationCallback validation_callback_;
+
   DISALLOW_COPY_AND_ASSIGN(It2MeHost);
 };
 
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc
new file mode 100644
index 0000000..d3919f6b
--- /dev/null
+++ b/remoting/host/it2me/it2me_host_unittest.cc
@@ -0,0 +1,168 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "remoting/host/it2me/it2me_host.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "components/policy/policy_constants.h"
+#include "remoting/base/auto_thread_task_runner.h"
+#include "remoting/host/chromoting_host_context.h"
+#include "remoting/host/policy_watcher.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace remoting {
+
+namespace {
+
+typedef protocol::ValidatingAuthenticator::Result ValidationResult;
+
+const char kTestClientJid[] = "ficticious_user@gmail.com/jid_resource";
+const char kTestClientUsernameNoJid[] = "completely_ficticious_user@gmail.com";
+const char kTestClientJidWithSlash[] = "fake/user@gmail.com/jid_resource";
+const char kMatchingDomain[] = "gmail.com";
+const char kMismatchedDomain1[] = "similar_to_gmail.com";
+const char kMismatchedDomain2[] = "gmail_at_the_beginning.com";
+const char kMismatchedDomain3[] = "not_even_close.com";
+
+}  // namespace
+
+class It2MeHostTest : public testing::Test {
+ public:
+  It2MeHostTest() {}
+  ~It2MeHostTest() override {}
+
+  // testing::Test interface.
+  void SetUp() override;
+  void TearDown() override;
+
+  void OnValidationComplete(const base::Closure& resume_callback,
+                            ValidationResult validation_result);
+
+ protected:
+  void SetClientDomainPolicy(const std::string& policy_value);
+
+  void RunValidationCallback(const std::string& remote_jid);
+
+  ValidationResult validation_result_ = ValidationResult::SUCCESS;
+
+ private:
+  std::unique_ptr<base::MessageLoop> message_loop_;
+  std::unique_ptr<base::RunLoop> run_loop_;
+
+  scoped_refptr<It2MeHost> it2me_host_;
+
+  std::string directory_bot_jid_;
+  XmppSignalStrategy::XmppServerConfig xmpp_server_config_;
+
+  DISALLOW_COPY_AND_ASSIGN(It2MeHostTest);
+};
+
+void It2MeHostTest::SetUp() {
+  message_loop_.reset(new base::MessageLoop());
+  run_loop_.reset(new base::RunLoop());
+
+  scoped_refptr<AutoThreadTaskRunner> auto_thread_task_runner =
+      new AutoThreadTaskRunner(base::ThreadTaskRunnerHandle::Get(),
+                               run_loop_->QuitClosure());
+  it2me_host_ = new It2MeHost(
+      ChromotingHostContext::Create(auto_thread_task_runner),
+      /*policy_watcher=*/nullptr,
+      /*confirmation_dialog_factory=*/nullptr,
+      /*observer=*/nullptr, xmpp_server_config_, directory_bot_jid_);
+}
+
+void It2MeHostTest::TearDown() {
+  it2me_host_ = nullptr;
+  run_loop_->Run();
+}
+
+void It2MeHostTest::OnValidationComplete(const base::Closure& resume_callback,
+                                         ValidationResult validation_result) {
+  validation_result_ = validation_result;
+  resume_callback.Run();
+}
+
+void It2MeHostTest::SetClientDomainPolicy(const std::string& policy_value) {
+  std::unique_ptr<base::DictionaryValue> policies(new base::DictionaryValue());
+  policies->SetString(policy::key::kRemoteAccessHostClientDomain, policy_value);
+
+  base::RunLoop run_loop;
+  it2me_host_->SetPolicyForTesting(std::move(policies), run_loop.QuitClosure());
+  run_loop.Run();
+}
+
+void It2MeHostTest::RunValidationCallback(const std::string& remote_jid) {
+  base::RunLoop run_loop;
+
+  it2me_host_->GetValidationCallbackForTesting().Run(
+      remote_jid, base::Bind(&It2MeHostTest::OnValidationComplete,
+                             base::Unretained(this), run_loop.QuitClosure()));
+
+  run_loop.Run();
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_NoClientDomainPolicy_ValidJid) {
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::SUCCESS, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_NoClientDomainPolicy_InvalidJid) {
+  RunValidationCallback(kTestClientUsernameNoJid);
+  ASSERT_EQ(ValidationResult::SUCCESS, validation_result_);
+}
+
+TEST_F(It2MeHostTest,
+       ConnectionValidation_NoClientDomainPolicy_InvalidUsername) {
+  RunValidationCallback(kTestClientJidWithSlash);
+  ASSERT_EQ(ValidationResult::SUCCESS, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_MatchingDomain) {
+  SetClientDomainPolicy(kMatchingDomain);
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::SUCCESS, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_InvalidUserName) {
+  SetClientDomainPolicy(kMatchingDomain);
+  RunValidationCallback(kTestClientJidWithSlash);
+  ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_ClientDomainPolicy_NoJid) {
+  SetClientDomainPolicy(kMatchingDomain);
+  RunValidationCallback(kTestClientUsernameNoJid);
+  ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_NoMatch) {
+  SetClientDomainPolicy(kMismatchedDomain3);
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_MatchStart) {
+  SetClientDomainPolicy(kMismatchedDomain2);
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_);
+}
+
+TEST_F(It2MeHostTest, ConnectionValidation_WrongClientDomain_MatchEnd) {
+  SetClientDomainPolicy(kMismatchedDomain1);
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::ERROR_INVALID_ACCOUNT, validation_result_);
+}
+
+}  // namespace remoting
diff --git a/remoting/host/it2me/it2me_native_messaging_host_unittest.cc b/remoting/host/it2me/it2me_native_messaging_host_unittest.cc
index 04273a1d..af68edc3 100644
--- a/remoting/host/it2me/it2me_native_messaging_host_unittest.cc
+++ b/remoting/host/it2me/it2me_native_messaging_host_unittest.cc
@@ -4,8 +4,9 @@
 
 #include "remoting/host/it2me/it2me_native_messaging_host.h"
 
-#include <stdint.h>
-
+#include <cstdint>
+#include <memory>
+#include <string>
 #include <utility>
 
 #include "base/compiler_specific.h"
@@ -81,7 +82,7 @@
                 const std::string& directory_bot_jid)
       : It2MeHost(std::move(context),
                   std::move(policy_watcher),
-                  nullptr,
+                  /*confirmation_dialog_factory=*/nullptr,
                   observer,
                   xmpp_server_config,
                   directory_bot_jid) {}
@@ -161,7 +162,8 @@
       base::WeakPtr<It2MeHost::Observer> observer,
       const XmppSignalStrategy::XmppServerConfig& xmpp_server_config,
       const std::string& directory_bot_jid) override {
-    return new MockIt2MeHost(std::move(context), nullptr, observer,
+    return new MockIt2MeHost(std::move(context),
+                             /*confirmation_dialog_factory=*/nullptr, observer,
                              xmpp_server_config, directory_bot_jid);
   }
 
diff --git a/remoting/protocol/BUILD.gn b/remoting/protocol/BUILD.gn
index ac9dae0..a80cd84 100644
--- a/remoting/protocol/BUILD.gn
+++ b/remoting/protocol/BUILD.gn
@@ -159,6 +159,8 @@
     "transport_context.h",
     "v2_authenticator.cc",
     "v2_authenticator.h",
+    "validating_authenticator.cc",
+    "validating_authenticator.h",
     "video_renderer.h",
     "video_stats_stub.h",
     "video_stub.h",
@@ -299,6 +301,7 @@
     "ssl_hmac_channel_authenticator_unittest.cc",
     "third_party_authenticator_unittest.cc",
     "v2_authenticator_unittest.cc",
+    "validating_authenticator_unittest.cc",
     "video_frame_pump_unittest.cc",
     "webrtc_transport_unittest.cc",
   ]
diff --git a/remoting/protocol/authenticator.h b/remoting/protocol/authenticator.h
index 7a7436d..93ecfd72 100644
--- a/remoting/protocol/authenticator.h
+++ b/remoting/protocol/authenticator.h
@@ -67,6 +67,7 @@
     INVALID_CREDENTIALS,
     INVALID_ACCOUNT,
     PROTOCOL_ERROR,
+    REJECTED_BY_USER,
   };
 
   // Callback used for layered Authenticator implementations, particularly
diff --git a/remoting/protocol/it2me_host_authenticator_factory.cc b/remoting/protocol/it2me_host_authenticator_factory.cc
index aad9f63d..87f09a1a 100644
--- a/remoting/protocol/it2me_host_authenticator_factory.cc
+++ b/remoting/protocol/it2me_host_authenticator_factory.cc
@@ -4,12 +4,15 @@
 
 #include "remoting/protocol/it2me_host_authenticator_factory.h"
 
+#include <memory>
+#include <string>
+#include <utility>
+
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/strings/string_util.h"
 #include "remoting/base/rsa_key_pair.h"
 #include "remoting/protocol/negotiating_host_authenticator.h"
-#include "remoting/protocol/rejecting_authenticator.h"
+#include "remoting/protocol/validating_authenticator.h"
 
 namespace remoting {
 namespace protocol {
@@ -18,11 +21,11 @@
     const std::string& local_cert,
     scoped_refptr<RsaKeyPair> key_pair,
     const std::string& access_code_hash,
-    const std::string& required_client_domain)
+    const ValidatingAuthenticator::ValidationCallback& callback)
     : local_cert_(local_cert),
       key_pair_(key_pair),
       access_code_hash_(access_code_hash),
-      required_client_domain_(required_client_domain) {}
+      validation_callback_(callback) {}
 
 It2MeHostAuthenticatorFactory::~It2MeHostAuthenticatorFactory() {}
 
@@ -30,26 +33,13 @@
 It2MeHostAuthenticatorFactory::CreateAuthenticator(
     const std::string& local_jid,
     const std::string& remote_jid) {
-  // Check the client domain policy.
-  if (!required_client_domain_.empty()) {
-    std::string client_username = remote_jid;
-    size_t pos = client_username.find('/');
-    if (pos != std::string::npos) {
-      client_username.replace(pos, std::string::npos, "");
-    }
-    if (!base::EndsWith(client_username,
-                        std::string("@") + required_client_domain_,
-                        base::CompareCase::INSENSITIVE_ASCII)) {
-      LOG(ERROR) << "Rejecting incoming connection from " << remote_jid
-                 << ": Domain mismatch.";
-      return base::WrapUnique(
-          new RejectingAuthenticator(Authenticator::INVALID_ACCOUNT));
-    }
-  }
+  std::unique_ptr<Authenticator> authenticator(
+      NegotiatingHostAuthenticator::CreateWithSharedSecret(
+          local_jid, remote_jid, local_cert_, key_pair_, access_code_hash_,
+          nullptr));
 
-  return NegotiatingHostAuthenticator::CreateWithSharedSecret(
-      local_jid, remote_jid, local_cert_, key_pair_, access_code_hash_,
-      nullptr);
+  return base::MakeUnique<ValidatingAuthenticator>(
+      remote_jid, validation_callback_, std::move(authenticator));
 }
 
 }  // namespace protocol
diff --git a/remoting/protocol/it2me_host_authenticator_factory.h b/remoting/protocol/it2me_host_authenticator_factory.h
index fe244c2f..1be5683 100644
--- a/remoting/protocol/it2me_host_authenticator_factory.h
+++ b/remoting/protocol/it2me_host_authenticator_factory.h
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "remoting/protocol/authenticator.h"
+#include "remoting/protocol/validating_authenticator.h"
 
 namespace remoting {
 
@@ -23,10 +24,11 @@
 // understands both the V2 and legacy V1 authentication mechanisms.
 class It2MeHostAuthenticatorFactory : public AuthenticatorFactory {
  public:
-  It2MeHostAuthenticatorFactory(const std::string& local_cert,
-                                scoped_refptr<RsaKeyPair> key_pair,
-                                const std::string& access_code,
-                                const std::string& required_client_domain);
+  It2MeHostAuthenticatorFactory(
+      const std::string& local_cert,
+      scoped_refptr<RsaKeyPair> key_pair,
+      const std::string& access_code,
+      const ValidatingAuthenticator::ValidationCallback& callback);
   ~It2MeHostAuthenticatorFactory() override;
 
   // AuthenticatorFactory interface.
@@ -38,7 +40,7 @@
   std::string local_cert_;
   scoped_refptr<RsaKeyPair> key_pair_;
   std::string access_code_hash_;
-  std::string required_client_domain_;
+  ValidatingAuthenticator::ValidationCallback validation_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(It2MeHostAuthenticatorFactory);
 };
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc
index ddef7589..90f7e9e 100644
--- a/remoting/protocol/jingle_session.cc
+++ b/remoting/protocol/jingle_session.cc
@@ -56,6 +56,8 @@
       return INCOMPATIBLE_PROTOCOL;
     case Authenticator::INVALID_ACCOUNT:
       return INVALID_ACCOUNT;
+    case Authenticator::REJECTED_BY_USER:
+      return SESSION_REJECTED;
   }
   NOTREACHED();
   return UNKNOWN_ERROR;
diff --git a/remoting/protocol/protocol_mock_objects.cc b/remoting/protocol/protocol_mock_objects.cc
index 3450cf919..8782368 100644
--- a/remoting/protocol/protocol_mock_objects.cc
+++ b/remoting/protocol/protocol_mock_objects.cc
@@ -13,6 +13,10 @@
 namespace remoting {
 namespace protocol {
 
+MockAuthenticator::MockAuthenticator() {}
+
+MockAuthenticator::~MockAuthenticator() {}
+
 MockConnectionToClientEventHandler::MockConnectionToClientEventHandler() {}
 
 MockConnectionToClientEventHandler::~MockConnectionToClientEventHandler() {}
diff --git a/remoting/protocol/protocol_mock_objects.h b/remoting/protocol/protocol_mock_objects.h
index 4d03025..0150866 100644
--- a/remoting/protocol/protocol_mock_objects.h
+++ b/remoting/protocol/protocol_mock_objects.h
@@ -5,9 +5,9 @@
 #ifndef REMOTING_PROTOCOL_PROTOCOL_MOCK_OBJECTS_H_
 #define REMOTING_PROTOCOL_PROTOCOL_MOCK_OBJECTS_H_
 
-#include <stdint.h>
-
+#include <cstdint>
 #include <map>
+#include <memory>
 #include <string>
 
 #include "base/location.h"
@@ -19,6 +19,7 @@
 #include "remoting/proto/internal.pb.h"
 #include "remoting/proto/video.pb.h"
 #include "remoting/protocol/authenticator.h"
+#include "remoting/protocol/channel_authenticator.h"
 #include "remoting/protocol/client_stub.h"
 #include "remoting/protocol/clipboard_stub.h"
 #include "remoting/protocol/connection_to_client.h"
@@ -30,10 +31,39 @@
 #include "remoting/protocol/transport.h"
 #include "remoting/protocol/video_stub.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
 
 namespace remoting {
 namespace protocol {
 
+class MockAuthenticator : public Authenticator {
+ public:
+  MockAuthenticator();
+  ~MockAuthenticator() override;
+
+  MOCK_CONST_METHOD0(state, Authenticator::State());
+  MOCK_CONST_METHOD0(started, bool());
+  MOCK_CONST_METHOD0(rejection_reason, Authenticator::RejectionReason());
+  MOCK_CONST_METHOD0(GetAuthKey, const std::string&());
+  MOCK_CONST_METHOD0(CreateChannelAuthenticatorPtr, ChannelAuthenticator*());
+  MOCK_METHOD2(ProcessMessage,
+               void(const buzz::XmlElement* message,
+                    const base::Closure& resume_callback));
+  MOCK_METHOD0(GetNextMessagePtr, buzz::XmlElement*());
+
+  std::unique_ptr<ChannelAuthenticator> CreateChannelAuthenticator()
+      const override {
+    return base::WrapUnique(CreateChannelAuthenticatorPtr());
+  }
+
+  std::unique_ptr<buzz::XmlElement> GetNextMessage() override {
+    return base::WrapUnique(GetNextMessagePtr());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockAuthenticator);
+};
+
 class MockConnectionToClientEventHandler
     : public ConnectionToClient::EventHandler {
  public:
diff --git a/remoting/protocol/validating_authenticator.cc b/remoting/protocol/validating_authenticator.cc
new file mode 100644
index 0000000..d3da78d
--- /dev/null
+++ b/remoting/protocol/validating_authenticator.cc
@@ -0,0 +1,141 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "remoting/protocol/validating_authenticator.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "remoting/protocol/authenticator.h"
+#include "remoting/protocol/channel_authenticator.h"
+#include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
+
+namespace remoting {
+namespace protocol {
+
+ValidatingAuthenticator::ValidatingAuthenticator(
+    const std::string& remote_jid,
+    const ValidationCallback& validation_callback,
+    std::unique_ptr<Authenticator> current_authenticator)
+    : remote_jid_(remote_jid),
+      validation_callback_(validation_callback),
+      current_authenticator_(std::move(current_authenticator)),
+      weak_factory_(this) {
+  DCHECK(!remote_jid_.empty());
+  DCHECK(!validation_callback_.is_null());
+  DCHECK(current_authenticator_);
+}
+
+ValidatingAuthenticator::~ValidatingAuthenticator() {}
+
+Authenticator::State ValidatingAuthenticator::state() const {
+  return state_;
+}
+
+bool ValidatingAuthenticator::started() const {
+  return current_authenticator_->started();
+}
+
+Authenticator::RejectionReason ValidatingAuthenticator::rejection_reason()
+    const {
+  return rejection_reason_;
+}
+
+const std::string& ValidatingAuthenticator::GetAuthKey() const {
+  return current_authenticator_->GetAuthKey();
+}
+
+std::unique_ptr<ChannelAuthenticator>
+ValidatingAuthenticator::CreateChannelAuthenticator() const {
+  return current_authenticator_->CreateChannelAuthenticator();
+}
+
+void ValidatingAuthenticator::ProcessMessage(
+    const buzz::XmlElement* message,
+    const base::Closure& resume_callback) {
+  DCHECK_EQ(state_, WAITING_MESSAGE);
+  state_ = PROCESSING_MESSAGE;
+
+  if (first_message_received_) {
+    current_authenticator_->ProcessMessage(
+        message, base::Bind(&ValidatingAuthenticator::UpdateState,
+                            weak_factory_.GetWeakPtr(), resume_callback));
+  } else {
+    first_message_received_ = true;
+    validation_callback_.Run(
+        remote_jid_, base::Bind(&ValidatingAuthenticator::OnValidateComplete,
+                                weak_factory_.GetWeakPtr(),
+                                base::Owned(new buzz::XmlElement(*message)),
+                                resume_callback));
+  }
+}
+
+std::unique_ptr<buzz::XmlElement> ValidatingAuthenticator::GetNextMessage() {
+  std::unique_ptr<buzz::XmlElement> result(
+      current_authenticator_->GetNextMessage());
+  state_ = current_authenticator_->state();
+  DCHECK(state_ == ACCEPTED || state_ == WAITING_MESSAGE);
+
+  return result;
+}
+
+void ValidatingAuthenticator::OnValidateComplete(
+    const buzz::XmlElement* message,
+    const base::Closure& resume_callback,
+    Result validation_result) {
+  if (validation_result == Result::SUCCESS) {
+    current_authenticator_->ProcessMessage(
+        message, base::Bind(&ValidatingAuthenticator::UpdateState,
+                            weak_factory_.GetWeakPtr(), resume_callback));
+    return;
+  }
+
+  // |validation_result| represents a rejected state so map the result to a
+  // rejection reason and call the callback to let the caller know the result.
+  state_ = Authenticator::REJECTED;
+
+  switch (validation_result) {
+    case Result::ERROR_INVALID_CREDENTIALS:
+      rejection_reason_ = Authenticator::INVALID_CREDENTIALS;
+      break;
+
+    case Result::ERROR_INVALID_ACCOUNT:
+      rejection_reason_ = Authenticator::INVALID_ACCOUNT;
+      break;
+
+    case Result::ERROR_REJECTED_BY_USER:
+      rejection_reason_ = Authenticator::REJECTED_BY_USER;
+      break;
+
+    default:
+      // Log an error and fail to prevent logging a misleading error value.
+      CHECK(false) << "Unknown validation result value: "
+                   << static_cast<unsigned int>(validation_result);
+  }
+
+  resume_callback.Run();
+}
+
+void ValidatingAuthenticator::UpdateState(
+    const base::Closure& resume_callback) {
+  DCHECK_EQ(state_, PROCESSING_MESSAGE);
+
+  // Update our current state before running |resume_callback|.
+  state_ = current_authenticator_->state();
+  if (state_ == REJECTED) {
+    rejection_reason_ = current_authenticator_->rejection_reason();
+  }
+
+  resume_callback.Run();
+}
+
+}  // namespace protocol
+}  // namespace remoting
diff --git a/remoting/protocol/validating_authenticator.h b/remoting/protocol/validating_authenticator.h
new file mode 100644
index 0000000..73f5d953
--- /dev/null
+++ b/remoting/protocol/validating_authenticator.h
@@ -0,0 +1,92 @@
+// 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 REMOTING_PROTOCOL_VALIDATING_AUTHENTICATOR_H_
+#define REMOTING_PROTOCOL_VALIDATING_AUTHENTICATOR_H_
+
+#include <memory>
+#include <string>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "remoting/protocol/authenticator.h"
+
+namespace remoting {
+namespace protocol {
+
+// This authenticator class provides a way to check the validity of a connection
+// as it is being established through an asynchronous callback.  The validation
+// logic supplied by the caller is run when the first message is received from
+// the client.  If the connection details are valid (e.g. conform to the current
+// policies), then the initial message, and all subsequent messages, are passed
+// to the underlying authenticator instance for processing.
+class ValidatingAuthenticator : public Authenticator {
+ public:
+  enum class Result {
+    SUCCESS,
+    ERROR_INVALID_CREDENTIALS,
+    ERROR_INVALID_ACCOUNT,
+    ERROR_REJECTED_BY_USER
+  };
+
+  typedef base::Callback<void(Result validation_result)> ResultCallback;
+
+  typedef base::Callback<void(const std::string& remote_jid,
+                              const ResultCallback& callback)>
+      ValidationCallback;
+
+  ValidatingAuthenticator(const std::string& remote_jid,
+                          const ValidationCallback& validation_callback,
+                          std::unique_ptr<Authenticator> current_authenticator);
+  ~ValidatingAuthenticator() override;
+
+  // Authenticator interface.
+  State state() const override;
+  bool started() const override;
+  RejectionReason rejection_reason() const override;
+  const std::string& GetAuthKey() const override;
+  std::unique_ptr<ChannelAuthenticator> CreateChannelAuthenticator()
+      const override;
+  void ProcessMessage(const buzz::XmlElement* message,
+                      const base::Closure& resume_callback) override;
+  std::unique_ptr<buzz::XmlElement> GetNextMessage() override;
+
+ private:
+  // Checks |validation_result|.  On success, |message| and |resume_callback|
+  // are passed on to |current_authenticator_|.  If the connection was rejected,
+  // |state_| and |rejection_reason_| are updated and |resume_callback| is run.
+  void OnValidateComplete(const buzz::XmlElement* message,
+                          const base::Closure& resume_callback,
+                          Result validation_result);
+
+  // Updates |state_| to reflect the current underlying authenticator state.
+  // |resume_callback| is called after the state is updated.
+  void UpdateState(const base::Closure& resume_callback);
+
+  bool first_message_received_ = false;
+
+  // The JID of the remote user.
+  std::string remote_jid_;
+
+  ValidationCallback validation_callback_;
+
+  // Returns the current state of the authenticator.
+  State state_ = Authenticator::WAITING_MESSAGE;
+
+  // Returns the rejection reason. Can be called only when in REJECTED state.
+  RejectionReason rejection_reason_ = Authenticator::INVALID_CREDENTIALS;
+
+  std::unique_ptr<Authenticator> current_authenticator_;
+
+  base::WeakPtrFactory<ValidatingAuthenticator> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ValidatingAuthenticator);
+};
+
+}  // namespace protocol
+}  // namespace remoting
+
+#endif  // REMOTING_PROTOCOL_VALIDATING_AUTHENTICATOR_H_
diff --git a/remoting/protocol/validating_authenticator_unittest.cc b/remoting/protocol/validating_authenticator_unittest.cc
new file mode 100644
index 0000000..32bed4c
--- /dev/null
+++ b/remoting/protocol/validating_authenticator_unittest.cc
@@ -0,0 +1,269 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
+#include "base/run_loop.h"
+#include "remoting/protocol/authenticator.h"
+#include "remoting/protocol/protocol_mock_objects.h"
+#include "remoting/protocol/validating_authenticator.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
+
+namespace remoting {
+namespace protocol {
+
+namespace {
+
+using testing::_;
+using testing::Return;
+
+typedef ValidatingAuthenticator::Result ValidationResult;
+
+const char kRemoteTestJid[] = "ficticious_jid_for_testing";
+
+// testing::InvokeArgument<N> does not work with base::Callback, fortunately
+// gmock makes it simple to create action templates that do for the various
+// possible numbers of arguments.
+ACTION_TEMPLATE(InvokeCallbackArgument,
+                HAS_1_TEMPLATE_PARAMS(int, k),
+                AND_0_VALUE_PARAMS()) {
+  ::std::tr1::get<k>(args).Run();
+}
+
+}  // namespace
+
+class ValidatingAuthenticatorTest : public testing::Test {
+ public:
+  ValidatingAuthenticatorTest();
+  ~ValidatingAuthenticatorTest() override;
+
+  void ValidateCallback(
+      const std::string& remote_jid,
+      const ValidatingAuthenticator::ResultCallback& callback);
+
+ protected:
+  // testing::Test overrides.
+  void SetUp() override;
+
+  // Calls ProcessMessage() on |validating_authenticator_| and blocks until
+  // the result callback is called.
+  void SendMessageAndWaitForCallback();
+
+  // Used to set up our mock behaviors on the MockAuthenticator object passed
+  // to |validating_authenticator_|.  Lifetime of the object is controlled by
+  // |validating_authenticator_| so this pointer is no longer valid once
+  // the owner is destroyed.
+  MockAuthenticator* mock_authenticator_ = nullptr;
+
+  // This member is used to drive behavior in |validating_authenticator_| when
+  // it's validation complete callback is run.
+  ValidationResult validation_result_ = ValidationResult::SUCCESS;
+
+  // Tracks whether our ValidateCallback has been called or not.
+  bool validate_complete_called_ = false;
+
+  // The object under test.
+  std::unique_ptr<ValidatingAuthenticator> validating_authenticator_;
+
+ private:
+  base::MessageLoop message_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(ValidatingAuthenticatorTest);
+};
+
+ValidatingAuthenticatorTest::ValidatingAuthenticatorTest() {}
+
+ValidatingAuthenticatorTest::~ValidatingAuthenticatorTest() {}
+
+void ValidatingAuthenticatorTest::ValidateCallback(
+    const std::string& remote_jid,
+    const ValidatingAuthenticator::ResultCallback& callback) {
+  validate_complete_called_ = true;
+  callback.Run(validation_result_);
+}
+
+void ValidatingAuthenticatorTest::SetUp() {
+  mock_authenticator_ = new MockAuthenticator();
+  std::unique_ptr<Authenticator> authenticator(mock_authenticator_);
+
+  validating_authenticator_.reset(new ValidatingAuthenticator(
+      kRemoteTestJid, base::Bind(&ValidatingAuthenticatorTest::ValidateCallback,
+                                 base::Unretained(this)),
+      std::move(authenticator)));
+}
+
+void ValidatingAuthenticatorTest::SendMessageAndWaitForCallback() {
+  base::RunLoop run_loop;
+  std::unique_ptr<buzz::XmlElement> first_message(
+      Authenticator::CreateEmptyAuthenticatorMessage());
+  validating_authenticator_->ProcessMessage(first_message.get(),
+                                            run_loop.QuitClosure());
+  run_loop.Run();
+}
+
+TEST_F(ValidatingAuthenticatorTest, ValidConnection_SingleMessage) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
+      .Times(1)
+      .WillOnce(InvokeCallbackArgument<1>());
+
+  ON_CALL(*mock_authenticator_, state())
+      .WillByDefault(Return(Authenticator::ACCEPTED));
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::ACCEPTED);
+}
+
+TEST_F(ValidatingAuthenticatorTest, ValidConnection_TwoMessages) {
+  // Send the first message to the authenticator, set the mock up to act
+  // like it is waiting for a second message.
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
+      .Times(2)
+      .WillRepeatedly(InvokeCallbackArgument<1>());
+
+  EXPECT_CALL(*mock_authenticator_, state())
+      .WillRepeatedly(Return(Authenticator::MESSAGE_READY));
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::MESSAGE_READY);
+
+  // Now 'retrieve' the message for the client which resets the state.
+  EXPECT_CALL(*mock_authenticator_, state())
+      .WillRepeatedly(Return(Authenticator::WAITING_MESSAGE));
+
+  // This dance is needed because GMock doesn't handle unique_ptrs very well.
+  // The mock method receives a raw pointer which it wraps and returns when
+  // GetNextMessage() is called.
+  std::unique_ptr<buzz::XmlElement> next_message(
+      Authenticator::CreateEmptyAuthenticatorMessage());
+  EXPECT_CALL(*mock_authenticator_, GetNextMessagePtr())
+      .Times(1)
+      .WillOnce(Return(next_message.release()));
+
+  validating_authenticator_->GetNextMessage();
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::WAITING_MESSAGE);
+
+  // Now send the second message for processing.
+  EXPECT_CALL(*mock_authenticator_, state())
+      .WillRepeatedly(Return(Authenticator::ACCEPTED));
+
+  // Reset the callback state, we don't expect the validate function to be
+  // called for the second message.
+  validate_complete_called_ = false;
+  SendMessageAndWaitForCallback();
+  ASSERT_FALSE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::ACCEPTED);
+}
+
+TEST_F(ValidatingAuthenticatorTest, InvalidConnection_RejectedByUser) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _)).Times(0);
+  EXPECT_CALL(*mock_authenticator_, state()).Times(0);
+  EXPECT_CALL(*mock_authenticator_, rejection_reason()).Times(0);
+
+  validation_result_ = ValidationResult::ERROR_REJECTED_BY_USER;
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::REJECTED_BY_USER);
+}
+
+TEST_F(ValidatingAuthenticatorTest, InvalidConnection_InvalidCredentials) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _)).Times(0);
+  EXPECT_CALL(*mock_authenticator_, state()).Times(0);
+  EXPECT_CALL(*mock_authenticator_, rejection_reason()).Times(0);
+
+  validation_result_ = ValidationResult::ERROR_INVALID_CREDENTIALS;
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::INVALID_CREDENTIALS);
+}
+
+TEST_F(ValidatingAuthenticatorTest, InvalidConnection_InvalidAccount) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _)).Times(0);
+  EXPECT_CALL(*mock_authenticator_, state()).Times(0);
+  EXPECT_CALL(*mock_authenticator_, rejection_reason()).Times(0);
+
+  validation_result_ = ValidationResult::ERROR_INVALID_ACCOUNT;
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::INVALID_ACCOUNT);
+}
+
+TEST_F(ValidatingAuthenticatorTest,
+       WrappedAuthenticatorRejectsConnection_InvalidCredentials) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
+      .Times(1)
+      .WillOnce(InvokeCallbackArgument<1>());
+
+  ON_CALL(*mock_authenticator_, state())
+      .WillByDefault(Return(Authenticator::REJECTED));
+
+  ON_CALL(*mock_authenticator_, rejection_reason())
+      .WillByDefault(Return(Authenticator::REJECTED_BY_USER));
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::REJECTED_BY_USER);
+}
+
+TEST_F(ValidatingAuthenticatorTest,
+       WrappedAuthenticatorRejectsConnection_InvalidAccount) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
+      .Times(1)
+      .WillOnce(InvokeCallbackArgument<1>());
+
+  ON_CALL(*mock_authenticator_, state())
+      .WillByDefault(Return(Authenticator::REJECTED));
+
+  ON_CALL(*mock_authenticator_, rejection_reason())
+      .WillByDefault(Return(Authenticator::INVALID_CREDENTIALS));
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::INVALID_CREDENTIALS);
+}
+
+TEST_F(ValidatingAuthenticatorTest,
+       WrappedAuthenticatorRejectsConnection_PROTOCOL_ERROR) {
+  EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
+      .Times(1)
+      .WillOnce(InvokeCallbackArgument<1>());
+
+  ON_CALL(*mock_authenticator_, state())
+      .WillByDefault(Return(Authenticator::REJECTED));
+
+  ON_CALL(*mock_authenticator_, rejection_reason())
+      .WillByDefault(Return(Authenticator::PROTOCOL_ERROR));
+
+  SendMessageAndWaitForCallback();
+  ASSERT_TRUE(validate_complete_called_);
+  ASSERT_EQ(validating_authenticator_->state(), Authenticator::REJECTED);
+  ASSERT_EQ(validating_authenticator_->rejection_reason(),
+            Authenticator::PROTOCOL_ERROR);
+}
+
+}  // namespace protocol
+}  // namespace remoting
diff --git a/remoting/remoting_srcs.gypi b/remoting/remoting_srcs.gypi
index 3ab8cc64..c5952be 100644
--- a/remoting/remoting_srcs.gypi
+++ b/remoting/remoting_srcs.gypi
@@ -227,6 +227,8 @@
       'protocol/transport_context.h',
       'protocol/v2_authenticator.cc',
       'protocol/v2_authenticator.h',
+      'protocol/validating_authenticator.cc',
+      'protocol/validating_authenticator.h',
       'protocol/video_renderer.h',
       'protocol/video_stats_stub.h',
       'protocol/video_stub.h',
@@ -360,7 +362,7 @@
       'client/plugin/pepper_video_renderer_3d.cc',
       'client/plugin/pepper_video_renderer_3d.h',
     ],
-    
+
     'remoting_opengl_renderer_sources': [
       'client/gl_canvas.cc',
       'client/gl_canvas.h',
diff --git a/remoting/signaling/jid_util.h b/remoting/signaling/jid_util.h
index 7660ae3..9348f88 100644
--- a/remoting/signaling/jid_util.h
+++ b/remoting/signaling/jid_util.h
@@ -13,9 +13,9 @@
 // to lower-case.
 std::string NormalizeJid(const std::string& jid);
 
-// Splits a JID into a bare JID and a resource suffix.  Either or both
-// of |full_jid| and |resource| may be null.  If |full_jid| is already
-// a bare JID, |resource| is set to the empty string.  Returns true of
+// Splits a JID into a bare JID and a resource suffix.  Either |full_jid|,
+// |resource|, or both may be null.  If |full_jid| is already
+// a bare JID, |resource| is set to the empty string.  Returns true if
 // |full_jid| has a resource, false if not.
 //
 // e.g. "user@domain/resource" -> "user@domain", "resource", true
diff --git a/services/navigation/view_impl.cc b/services/navigation/view_impl.cc
index a6451d1..22999a8 100644
--- a/services/navigation/view_impl.cc
+++ b/services/navigation/view_impl.cc
@@ -144,7 +144,8 @@
   mojom::ViewPtr view;
   mojom::ViewRequest view_request = GetProxy(&view);
   client_->ViewCreated(std::move(view), GetProxy(&client),
-                       disposition == NEW_POPUP, initial_rect, user_gesture);
+                       disposition == WindowOpenDisposition::NEW_POPUP,
+                       initial_rect, user_gesture);
 
   const std::string new_user_id =
       content::BrowserContext::GetShellUserIdFor(
diff --git a/services/ui/gpu/gpu_service_internal.cc b/services/ui/gpu/gpu_service_internal.cc
index 4be564d..f68197d 100644
--- a/services/ui/gpu/gpu_service_internal.cc
+++ b/services/ui/gpu/gpu_service_internal.cc
@@ -63,6 +63,7 @@
 }
 
 void GpuServiceInternal::Add(mojom::GpuServiceInternalRequest request) {
+  binding_.Close();
   binding_.Bind(std::move(request));
 }
 
diff --git a/services/ui/gpu/gpu_service_internal.h b/services/ui/gpu/gpu_service_internal.h
index 9a453e0..50d029d 100644
--- a/services/ui/gpu/gpu_service_internal.h
+++ b/services/ui/gpu/gpu_service_internal.h
@@ -18,7 +18,7 @@
 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
 #include "gpu/ipc/service/gpu_config.h"
 #include "gpu/ipc/service/x_util.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/binding.h"
 #include "services/ui/gpu/interfaces/gpu_service_internal.mojom.h"
 #include "ui/gfx/native_widget_types.h"
 
@@ -153,7 +153,7 @@
   // Information about the GPU, such as device and vendor ID.
   gpu::GPUInfo gpu_info_;
 
-  mojo::StrongBinding<mojom::GpuServiceInternal> binding_;
+  mojo::Binding<mojom::GpuServiceInternal> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuServiceInternal);
 };
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 52ba4d8..534236d1 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -786,6 +786,7 @@
       }
     ]
   },
+  "Android VR Tests": {},
   "Browser Side Navigation Linux": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 35e3fe9..021639a1 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10165,6 +10165,20 @@
   "Win7 Release (AMD R7 240)": {
     "gtest_tests": [
       {
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ],
+          "shards": 4
+        },
+        "test": "angle_deqp_gles2_tests",
+        "use_xvfb": false
+      },
+      {
         "args": [
           "--use-gpu-in-tests"
         ],
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index b9abaf1..182ba41 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -145,7 +145,7 @@
     "type": "console_test_launcher",
   },
   "blink_heap_unittests": {
-    "label": "//third_party/WebKit/Source/platform:blink_heap_unittests",
+    "label": "//third_party/WebKit/Source/platform/heap:blink_heap_unittests",
     "type": "console_test_launcher",
   },
   "blink_platform_unittests": {
diff --git a/testing/variations/fieldtrial_testing_config_android.json b/testing/variations/fieldtrial_testing_config_android.json
index b64448e2..12612e87 100644
--- a/testing/variations/fieldtrial_testing_config_android.json
+++ b/testing/variations/fieldtrial_testing_config_android.json
@@ -206,14 +206,6 @@
             "group_name": "Enabled"
         }
     ],
-    "MinidumpDirectoryObserver": [
-        {
-            "group_name": "ObserverExperimentGroup",
-            "params": {
-                "Enabled": "true"
-            }
-        }
-    ],
     "ModerateBindingOnBackgroundTabCreation": [
         {
             "group_name": "Enabled"
@@ -308,6 +300,14 @@
             "group_name": "EnabledAsBookmarks"
         }
     ],
+    "OverlayFullscreenVideo": [
+        {
+            "disable_features": [
+                "overlay-fullscreen-video"
+            ],
+            "group_name": "Disabled"
+        }
+    ],
     "PageRevisitInstrumentation": [
         {
             "group_name": "Enabled"
@@ -568,14 +568,6 @@
             "group_name": "aggressive"
         }
     ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
-    ],
     "WebFontsInterventionV2": [
         {
             "group_name": "Enabled-slow2g"
diff --git a/testing/variations/fieldtrial_testing_config_chromeos.json b/testing/variations/fieldtrial_testing_config_chromeos.json
index f6fa7ae..08d8423 100644
--- a/testing/variations/fieldtrial_testing_config_chromeos.json
+++ b/testing/variations/fieldtrial_testing_config_chromeos.json
@@ -335,14 +335,6 @@
             "group_name": "aggressive"
         }
     ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
-    ],
     "WebFontsInterventionV2": [
         {
             "group_name": "Enabled-slow2g"
diff --git a/testing/variations/fieldtrial_testing_config_ios.json b/testing/variations/fieldtrial_testing_config_ios.json
index 8623f75..e2b90dd 100644
--- a/testing/variations/fieldtrial_testing_config_ios.json
+++ b/testing/variations/fieldtrial_testing_config_ios.json
@@ -92,13 +92,5 @@
         {
             "group_name": "Enabled"
         }
-    ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
     ]
 }
diff --git a/testing/variations/fieldtrial_testing_config_linux.json b/testing/variations/fieldtrial_testing_config_linux.json
index 9da7fa83..a01b06f 100644
--- a/testing/variations/fieldtrial_testing_config_linux.json
+++ b/testing/variations/fieldtrial_testing_config_linux.json
@@ -397,14 +397,6 @@
             "group_name": "aggressive"
         }
     ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
-    ],
     "WebFontsInterventionV2": [
         {
             "group_name": "Enabled-slow2g"
diff --git a/testing/variations/fieldtrial_testing_config_mac.json b/testing/variations/fieldtrial_testing_config_mac.json
index ef32eac..dd38d650 100644
--- a/testing/variations/fieldtrial_testing_config_mac.json
+++ b/testing/variations/fieldtrial_testing_config_mac.json
@@ -441,14 +441,6 @@
             "group_name": "aggressive"
         }
     ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
-    ],
     "ViewsSimplifiedFullscreenUI": [
         {
             "enable_features": [
diff --git a/testing/variations/fieldtrial_testing_config_win.json b/testing/variations/fieldtrial_testing_config_win.json
index a3fca15e..b9017072f 100644
--- a/testing/variations/fieldtrial_testing_config_win.json
+++ b/testing/variations/fieldtrial_testing_config_win.json
@@ -324,20 +324,6 @@
             "group_name": "Enabled"
         }
     ],
-    "PreRead": [
-        {
-            "group_name": "NoPrefetchArgument2",
-            "params": {
-                "NoPrefetchArgument": "true"
-            }
-        },
-        {
-            "group_name": "PreReadChromeChildInBrowser",
-            "params": {
-                "PreReadChromeChildInBrowser": "true"
-            }
-        }
-    ],
     "PreconnectMore": [
         {
             "enable_features": [
@@ -515,14 +501,6 @@
             "group_name": "aggressive"
         }
     ],
-    "VarationsServiceControl": [
-        {
-            "group_name": "Interval_30min",
-            "params": {
-                "fetch_period_min": "30"
-            }
-        }
-    ],
     "WebFontsInterventionV2": [
         {
             "group_name": "Enabled-slow2g"
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index f6c64d3a3..6e32ff3 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -704,7 +704,6 @@
 crbug.com/613887 http/tests/preload/meta-viewport-link-headers.html [ Failure Pass ]
 crbug.com/564403 http/tests/inspector/service-workers/service-worker-manager.html [ Failure Pass Crash Timeout ]
 
-crbug.com/613728 fast/table/border-collapsing/cached-cell-append.html [ Failure ]
 crbug.com/613728 fast/table/border-collapsing/cached-69296.html [ Failure ]
 crbug.com/613728 fast/table/border-collapsing/cached-change-table-border-width.html [ Failure ]
 
@@ -892,12 +891,6 @@
 
 crbug.com/570894 [ Win ] imported/csswg-test/css-flexbox-1/flexbox_flex-natural-mixed-basis-auto.html [ Failure Pass ]
 
-# These four tests fail because of a bug in Firefox
-crbug.com/599828 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Failure ]
-crbug.com/599828 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001a.xhtml [ Failure ]
-crbug.com/599828 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-horiz-001b.xhtml [ Failure ]
-crbug.com/599828 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001a.xhtml [ Failure ]
-
 # We render the expectation incorrectly for these five tests
 crbug.com/310004 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-vert-001.xhtml [ Failure ]
 crbug.com/310004 imported/csswg-test/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-iframe-vert-001.xhtml [ Failure ]
@@ -1284,8 +1277,6 @@
 crbug.com/636424 [ Win7 Debug ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Pass Timeout ]
 crbug.com/638618 inspector/editor/text-editor-search-switch-editor.html [ Skip ]
 
-crbug.com/598051 [ Debug ] css3/filters/filter-repaint-turbulence.html [ Pass Failure ]
-
 # This test breaks when the feature introduced in the bug is enabled. We keep
 # this tested without the feature by using the virtual test. See
 # virtual/stable/http/tests/navigation/beacon-cross-origin-redirect-blob-expected.txt
diff --git a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.png b/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.png
deleted file mode 100644
index ce30287..0000000
--- a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.txt b/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.txt
deleted file mode 100644
index 8b13789..0000000
--- a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence.html b/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence.html
deleted file mode 100644
index ca364450..0000000
--- a/third_party/WebKit/LayoutTests/css3/filters/filter-repaint-turbulence.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<!--
-    This test verifies that turbulence is repainted covering the entire filter
-    region, including margin.
--->
-<script src="../../resources/run-after-layout-and-paint.js"></script>
-<script>
-    if (window.testRunner) {
-        testRunner.dumpAsTextWithPixelResults();
-        testRunner.waitUntilDone();
-    }
-
-    function repaintTest()
-    {
-        runAfterLayoutAndPaint(function() {
-            document.getElementById('div').classList.add('filtered');
-            if (window.testRunner)
-                testRunner.notifyDone();
-        });
-    }
-</script>
-<style>
-    div {
-        margin: 50px;
-        height: 100px;
-        width: 100px;
-        background-color: green;
-    }
-
-    .filtered {
-        filter: url(#turbulence);
-    }
-</style>
-<body onload="repaintTest()">
-    <svg xmlns="http://www.w3.org/2000/svg" width="0" height="0">
-        <defs>
-            <filter id="turbulence">
-                <feTurbulence type="fractalNoise" baseFrequency="0.01" numOctaves="1"/>
-            </filter>
-        </defs>
-    </svg>
-    <div id="div"></div>
-</body>
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html b/third_party/WebKit/LayoutTests/css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html
index 106b93d..50b5273 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/alignContent-applies-with-flexWrap-wrap-with-single-line.html
@@ -6,28 +6,20 @@
     display: flex;
     flex-wrap: wrap;
     position: relative;
-    height: 70px;
+    height: 75px;
     border: 1px solid red;
     margin: 5px;
 }
 
-.default > div {
-  height: 20px;
-}
-
 .verticalWriting {
     display: flex;
     flex-wrap: wrap;
     position: relative;
-    width: 70px;
+    width: 75px;
     border: 1px solid red;
     margin: 5px;
     writing-mode: vertical-lr;
 }
-
-.verticalWriting > div {
-  width: 20px;
-}
 </style>
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
@@ -35,42 +27,42 @@
 </head>
 <body onload="checkLayout('.default, .verticalWriting'); ">
 <div id=log></div>
-<p>Test that we honor align-content even in single-line flex containers</p>
+<p>Test for BUG=324178: Chrome incorrectly honors "align-content" in "flex-wrap: wrap" flex containers that only have a single line</p>
 <div class="default" style="align-content: flex-start">
-<div data-offset-y="0">This text should be at the top of its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="default" style="align-content: flex-end">
-<div data-offset-y="50">This text should be at the bottom of its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="default" style="align-content: center">
-<div data-offset-y="25">This text should be centered in its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="default" style="align-content: space-between">
-<div data-offset-y="0">This text should be at the top of its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="default" style="align-content: space-around">
-<div data-offset-y="25">This text should be centered in its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="default" style="align-content: stretch">
-<div data-offset-y="0">This text should be at the top of its container</div>
+<div data-offset-y="0">This text should be at the top of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: flex-start">
-<div data-offset-x="0">This text should be at the left of its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: flex-end">
-<div data-offset-x="50">This text should be at the right of its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: center">
-<div data-offset-x="25">This text should be centered in its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: space-between">
-<div data-offset-x="0">This text should be at the left of its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: space-around">
-<div data-offset-x="25">This text should be centered in its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 <div class="verticalWriting" style="align-content: stretch">
-<div data-offset-x="0">This text should be at the left of its container</div>
+<div data-offset-x="0">This text should be at the left of it's container</div>
 </div>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/flexbox-wordwrap.html b/third_party/WebKit/LayoutTests/css3/flexbox/flexbox-wordwrap.html
index b6dd9df..cbcfe3c 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/flexbox-wordwrap.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/flexbox-wordwrap.html
@@ -75,9 +75,9 @@
 </div>
 
 <div class="flex-horizontal" style="flex-wrap:wrap;">
-    <div class="item-horizontal" data-expected-height="150"><div class="content1-horizontal"></div></div>
-    <div class="item-horizontal" data-expected-height="150"><div class="content2-horizontal"></div></div>
-    <div class="item-horizontal" data-expected-height="150"><div class="content3-horizontal"></div></div>
+    <div class="item-horizontal" data-expected-height="80"><div class="content1-horizontal"></div></div>
+    <div class="item-horizontal" data-expected-height="80"><div class="content2-horizontal"></div></div>
+    <div class="item-horizontal" data-expected-height="80"><div class="content3-horizontal"></div></div>
 </div>
 
 <div class="flex-horizontal" style="flex-wrap:wrap;">
@@ -95,9 +95,9 @@
 </div>
 
 <div class="flex-vertical" style="flex-wrap:wrap;">
-    <div class="item-vertical" data-expected-width="150"><div class="content1-vertical"></div></div>
-    <div class="item-vertical" data-expected-width="150"><div class="content2-vertical"></div></div>
-    <div class="item-vertical" data-expected-width="150"><div class="content3-vertical"></div></div>
+    <div class="item-vertical" data-expected-width="80"><div class="content1-vertical"></div></div>
+    <div class="item-vertical" data-expected-width="80"><div class="content2-vertical"></div></div>
+    <div class="item-vertical" data-expected-width="80"><div class="content3-vertical"></div></div>
 </div>
 
 <div class="flex-vertical" style="flex-wrap:wrap;">
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html b/third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html
index 6cf9cc8..db0854d 100644
--- a/third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html
+++ b/third_party/WebKit/LayoutTests/css3/flexbox/multiline-align-content.html
@@ -170,10 +170,10 @@
 
 <!-- 1 line should not crash. -->
 <div data-expected-height="30" class="flexbox horizontal" style="align-content: space-between; height: 30px">
-  <div data-offset-x="0" data-offset-y="0" data-expected-height="10"></div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-height="30"></div>
 </div>
 <div data-expected-height="30" class="flexbox horizontal" style="align-content: space-around; height: 30px">
-  <div data-offset-x="0" data-offset-y="10" data-expected-height="10"></div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-height="30"></div>
 </div>
 <div data-expected-height="30" class="flexbox horizontal" style="align-content: stretch; height: 30px">
   <div data-offset-x="0" data-offset-y="0" data-expected-height="30"></div>
@@ -279,10 +279,10 @@
 
 <!-- 1 line should not crash. -->
 <div data-expected-width="30" class="flexbox vertical-rl" style="align-content: space-between; width: 30px">
-  <div data-offset-x="20" data-offset-y="0" data-expected-width="10"></div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="30"></div>
 </div>
 <div data-expected-width="30" class="flexbox vertical-rl" style="align-content: space-around; width: 30px">
-  <div data-offset-x="10" data-offset-y="0" data-expected-width="10"></div>
+  <div data-offset-x="0" data-offset-y="0" data-expected-width="30"></div>
 </div>
 <div data-expected-width="30" class="flexbox vertical-rl" style="align-content: stretch; width: 30px">
   <div data-offset-x="0" data-offset-y="0" data-expected-width="30"></div>
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 5bc7d5e..49a2d7f 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -49,7 +49,6 @@
 PASS window.cached_navigator_connection.ontypechange is null
 PASS window.cached_navigator_mediaDevices.ondevicechange is null
 PASS window.cached_navigator_presentation.defaultRequest is null
-PASS window.cached_navigator_presentation.receiver.onconnectionavailable is null
 PASS window.cached_navigator_serviceWorker.controller is null
 PASS window.cached_navigator_serviceWorker.oncontrollerchange is null
 PASS window.cached_navigator_serviceWorker.onmessage is null
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index bb71c3f..9feec279 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -49,7 +49,6 @@
 PASS window.cached_navigator_connection.ontypechange is null
 PASS window.cached_navigator_mediaDevices.ondevicechange is null
 PASS window.cached_navigator_presentation.defaultRequest is null
-PASS window.cached_navigator_presentation.receiver.onconnectionavailable is null
 PASS window.cached_navigator_serviceWorker.controller is null
 PASS window.cached_navigator_serviceWorker.oncontrollerchange is null
 PASS window.cached_navigator_serviceWorker.onmessage is null
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index 30c37a6e..9604c34e7 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -49,7 +49,6 @@
 PASS window.cached_navigator_connection.ontypechange is null
 PASS window.cached_navigator_mediaDevices.ondevicechange is null
 PASS window.cached_navigator_presentation.defaultRequest is null
-PASS window.cached_navigator_presentation.receiver.onconnectionavailable is null
 PASS window.cached_navigator_serviceWorker.controller is null
 PASS window.cached_navigator_serviceWorker.oncontrollerchange is null
 PASS window.cached_navigator_serviceWorker.onmessage is null
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index 8869d08e..f719f55 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -56,7 +56,6 @@
 PASS oldChildWindow.navigator.onLine is newChildWindow.navigator.onLine
 PASS oldChildWindow.navigator.platform is newChildWindow.navigator.platform
 PASS oldChildWindow.navigator.presentation.defaultRequest is newChildWindow.navigator.presentation.defaultRequest
-PASS oldChildWindow.navigator.presentation.receiver.onconnectionavailable is newChildWindow.navigator.presentation.receiver.onconnectionavailable
 PASS oldChildWindow.navigator.product is newChildWindow.navigator.product
 PASS oldChildWindow.navigator.productSub is newChildWindow.navigator.productSub
 PASS oldChildWindow.navigator.serviceWorker.controller is newChildWindow.navigator.serviceWorker.controller
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index e6c8418..e6ed3df 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -56,7 +56,6 @@
 PASS childWindow.navigator.onLine is window.navigator.onLine
 PASS childWindow.navigator.platform is window.navigator.platform
 FAIL childWindow.navigator.presentation.defaultRequest should be null. Threw exception TypeError: Cannot read property 'defaultRequest' of null
-FAIL childWindow.navigator.presentation.receiver.onconnectionavailable should be null. Threw exception TypeError: Cannot read property 'receiver' of null
 PASS childWindow.navigator.product is window.navigator.product
 PASS childWindow.navigator.productSub is window.navigator.productSub
 FAIL childWindow.navigator.serviceWorker.controller should be null. Threw exception TypeError: Cannot read property 'controller' of null
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index e9caac3..8628592 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -55,7 +55,6 @@
 PASS childWindow.navigator.onLine is window.navigator.onLine
 PASS childWindow.navigator.platform is window.navigator.platform
 FAIL childWindow.navigator.presentation.defaultRequest should be null. Threw exception TypeError: Cannot read property 'defaultRequest' of null
-FAIL childWindow.navigator.presentation.receiver.onconnectionavailable should be null. Threw exception TypeError: Cannot read property 'receiver' of null
 PASS childWindow.navigator.product is window.navigator.product
 PASS childWindow.navigator.productSub is window.navigator.productSub
 FAIL childWindow.navigator.serviceWorker.controller should be null. Threw exception TypeError: Cannot read property 'controller' of null
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream-expected.txt b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream-expected.txt
deleted file mode 100644
index 8cd7c09..0000000
--- a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Tests RTCPeerConnection [add|remove]Stream.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS Got a stream.
-PASS Got another stream.
-PASS stream.id === stream2.id is false
-PASS onAddStream was called.
-PASS pc.getStreamById(stream.id) is stream
-PASS pc.getStreamById(stream2.id) is null
-PASS pc.getLocalStreams().length is 1
-PASS pc.getLocalStreams().length is 1
-PASS onRemoveStream was called.
-PASS pc.getLocalStreams().length is 0
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream.html
index 6e8564a6..9190a62 100644
--- a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream.html
+++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-AddRemoveStream.html
@@ -1,81 +1,46 @@
 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
 <html>
 <head>
-<script src="../../resources/js-test.js"></script>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
 </head>
 <body>
 <script>
-description("Tests RTCPeerConnection [add|remove]Stream.");
+var testRTC = async_test('Tests RTCPeerConnection [add|remove]Stream.');
 
-var stream = null;
-var stream2 = null;
 var pc = null;
+var options = {audio: true, video: true};
+var errorCallback = () => assert_unreached('Stream generation failed.');
 
-function error() {
-    testFailed('Stream generation failed.');
-    finishJSTest();
-}
+navigator.webkitGetUserMedia(options, (stream1) => {
+    navigator.webkitGetUserMedia(options, (stream2) => {
+        assert_false(stream1.id === stream2.id);
 
-function getUserMedia(dictionary, callback) {
-    try {
-        navigator.webkitGetUserMedia(dictionary, callback, error);
-    } catch (e) {
-        testFailed('webkitGetUserMedia threw exception :' + e);
-        finishJSTest();
-    }
-}
+        pc = new webkitRTCPeerConnection(null, null);
 
-function onErroneousNegotiationNeeded() {
-    testFailed('onErroneousNegotiationNeeded was called.');
-    finishJSTest();
-}
+        pc.onnegotiationneeded = (event) => {
+            assert_equals(pc.getStreamById(stream1.id), stream1);
+            assert_equals(pc.getStreamById(stream2.id), null);
 
-function onRemoveStream(event) {
-    testPassed('onRemoveStream was called.');
+            pc.onnegotiationneeded = () => {
+                assert_unreached('onErroneousNegotiationNeeded was called.');
+            };
 
-    shouldBe('pc.getLocalStreams().length', '0');
+            pc.addStream(stream1);
+            assert_equals(pc.getLocalStreams().length, 1);
+            pc.removeStream(stream2);
+            assert_equals(pc.getLocalStreams().length, 1);
 
-    finishJSTest();
-}
+            pc.onnegotiationneeded = (event) => {
+                assert_equals(pc.getLocalStreams().length, 0);
+                testRTC.done();
+            };
+            pc.removeStream(stream1);
+        };
 
-function onAddStream(event) {
-    testPassed('onAddStream was called.');
-
-    shouldBe('pc.getStreamById(stream.id)', 'stream');
-    shouldBe('pc.getStreamById(stream2.id)', 'null');
-
-    pc.onnegotiationneeded = onErroneousNegotiationNeeded;
-    pc.addStream(stream);
-    shouldBe('pc.getLocalStreams().length', '1');
-    pc.removeStream(stream2);
-    shouldBe('pc.getLocalStreams().length', '1');
-
-    pc.onnegotiationneeded = onRemoveStream;
-    pc.removeStream(stream);
-}
-
-function gotStream2(s) {
-    testPassed('Got another stream.');
-    stream2 = s;
-
-    shouldBeFalse("stream.id === stream2.id");
-
-    pc = new webkitRTCPeerConnection(null, null);
-    pc.onnegotiationneeded = onAddStream;
-    pc.addStream(stream);
-}
-
-function gotStream1(s) {
-    testPassed('Got a stream.');
-    stream = s;
-
-    getUserMedia({audio:true, video:true}, gotStream2);
-}
-
-getUserMedia({audio:true, video:true}, gotStream1);
-
-window.jsTestIsAsync = true;
-window.successfullyParsed = true;
+        pc.addStream(stream1);
+    }, errorCallback);
+}, errorCallback);
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border-expected.txt b/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border-expected.txt
new file mode 100644
index 0000000..71c2fe0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border-expected.txt
@@ -0,0 +1,3 @@
+Adding a middle cell with a large border should make the table expand to accommodate it. The outer two cells' widths should also take on half of the new large border's width.
+
+PASS
diff --git a/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border.html b/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border.html
new file mode 100644
index 0000000..0acfb79a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/add-cell-with-large-border.html
@@ -0,0 +1,27 @@
+<!doctype html>
+<style>
+    td {
+        width: 50px;
+        height: 50px;
+        padding: 0px;
+        background: lime;
+    }
+</style>
+<script src="../../resources/check-layout.js"></script>
+<script src="../../resources/run-after-layout-and-paint.js"></script>
+<script type="text/javascript">
+    function addMiddleCell() {
+        var cellToAdd = document.createElement("td");
+        cellToAdd.style.border = "18px solid lightblue";
+        theRow.insertBefore(cellToAdd, rightCell);
+        checkLayout("table");
+    }
+    runAfterLayoutAndPaint(addMiddleCell, true);
+</script>
+<p>Adding a middle cell with a large border should make the table expand to accommodate it. The outer two cells' widths should also take on half of the new large border's width.</p>
+<table style="border-collapse:collapse" data-expected-width=190>
+  <tr id="theRow">
+    <td style="border:4px solid black" data-expected-width=61></td>
+    <td data-expected-width=59 id="rightCell"></td>
+  </tr>
+</table>
diff --git a/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append-expected.txt b/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append-expected.txt
index 3f33d46..47fce34 100644
--- a/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append-expected.txt
@@ -1,36 +1,71 @@
 {
+  "name": "Content Root Layer",
   "bounds": [800, 600],
   "children": [
     {
+      "name": "LayoutView #document",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "drawsContent": true,
       "paintInvalidations": [
         {
+          "object": "LayoutTable TABLE",
+          "rect": [8, 59, 120, 5],
+          "reason": "incremental"
+        },
+        {
+          "object": "LayoutTable TABLE",
+          "rect": [8, 62, 120, 2],
+          "reason": "incremental"
+        },
+        {
           "object": "LayoutTableCell TD",
-          "rect": [63, 8, 60, 54],
+          "rect": [64, 8, 64, 56],
           "reason": "layoutObject insertion"
         },
         {
           "object": "LayoutTable TABLE",
-          "rect": [67, 8, 56, 54],
+          "rect": [65, 8, 63, 56],
           "reason": "incremental"
         },
         {
+          "object": "LayoutTableCell TD",
+          "rect": [8, 8, 62, 56],
+          "reason": "location change"
+        },
+        {
           "object": "LayoutTable TABLE",
-          "rect": [68, 8, 55, 54],
+          "rect": [68, 8, 60, 56],
           "reason": "incremental"
-        },
-        {
-          "object": "LayoutTableCell TD",
-          "reason": "full"
-        },
-        {
-          "object": "LayoutTableCell TD",
-          "reason": "full"
         }
       ]
     }
+  ],
+  "objectPaintInvalidations": [
+    {
+      "object": "LayoutTableCell TD",
+      "reason": "style change"
+    },
+    {
+      "object": "LayoutTableCell TD",
+      "reason": "style change"
+    },
+    {
+      "object": "LayoutTable TABLE",
+      "reason": "incremental"
+    },
+    {
+      "object": "LayoutTableRow TR id='row'",
+      "reason": "location change"
+    },
+    {
+      "object": "LayoutTableCell TD",
+      "reason": "location change"
+    },
+    {
+      "object": "LayoutTableCell TD",
+      "reason": "layoutObject insertion"
+    }
   ]
 }
 
diff --git a/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append.html b/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append.html
index f64c640..164917a 100644
--- a/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append.html
+++ b/third_party/WebKit/LayoutTests/fast/table/border-collapsing/cached-cell-append.html
@@ -10,9 +10,9 @@
         <script type="text/javascript">
             function repaintTest() {
                 newCell = document.createElement("td");
-                newCell.style.borderLeftWidth = "6px";
-                newCell.style.borderLeftStyle = "solid";
-                newCell.style.borderLeftColor = "yellow";
+                newCell.style.borderWidth = "6px";
+                newCell.style.borderStyle = "solid";
+                newCell.style.borderColor = "yellow";
                 document.getElementById("row").appendChild(newCell);
             }
         </script>
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/shadow-content-expected.txt b/third_party/WebKit/LayoutTests/intersection-observer/shadow-content-expected.txt
new file mode 100644
index 0000000..3cc1519
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/intersection-observer/shadow-content-expected.txt
@@ -0,0 +1,24 @@
+Tests that observations can be made across shadow DOM boundaries.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS entries.length is 0
+PASS entries.length is 1
+PASS entries[0].boundingClientRect.left is 8
+PASS entries[0].boundingClientRect.right is 108
+PASS entries[0].boundingClientRect.top is 8
+PASS entries[0].boundingClientRect.bottom is 108
+PASS entries[0].intersectionRect.left is 8
+PASS entries[0].intersectionRect.right is 108
+PASS entries[0].intersectionRect.top is 8
+PASS entries[0].intersectionRect.bottom is 108
+PASS entries[0].rootBounds.left is 0
+PASS entries[0].rootBounds.right is 800
+PASS entries[0].rootBounds.top is 0
+PASS entries[0].rootBounds.bottom is 600
+PASS entries[0].target is [object HTMLDivElement]
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/third_party/WebKit/LayoutTests/intersection-observer/shadow-content.html b/third_party/WebKit/LayoutTests/intersection-observer/shadow-content.html
new file mode 100644
index 0000000..7a990e3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/intersection-observer/shadow-content.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<script src="../resources/js-test.js"></script>
+<script src="../resources/intersection-observer-helper-functions.js"></script>
+<div id="host"></div>
+
+<script>
+description("Tests that observations can be made across shadow DOM boundaries.");
+var entries = [];
+var target;
+var observer = new IntersectionObserver(changes => { entries = entries.concat(changes) });
+
+onload = function() {
+  let shadowHost = document.getElementById("host");
+  let shadowRoot = shadowHost.createShadowRoot();
+  target = document.createElement('div');
+  target.style.cssText = "background-color: green; width:100px; height:100px";
+  shadowRoot.appendChild(target);
+  observer.observe(target);
+
+  entries = entries.concat(observer.takeRecords());
+  shouldBeEqualToNumber("entries.length", 0);
+  waitForNotification(step1);
+};
+
+function step1() {
+  shouldBeEqualToNumber("entries.length", 1);
+  if (entries.length > 0) {
+    shouldBeEqualToNumber("entries[0].boundingClientRect.left", 8);
+    shouldBeEqualToNumber("entries[0].boundingClientRect.right", 108);
+    shouldBeEqualToNumber("entries[0].boundingClientRect.top", 8);
+    shouldBeEqualToNumber("entries[0].boundingClientRect.bottom", 108);
+    shouldBeEqualToNumber("entries[0].intersectionRect.left", 8);
+    shouldBeEqualToNumber("entries[0].intersectionRect.right", 108);
+    shouldBeEqualToNumber("entries[0].intersectionRect.top", 8);
+    shouldBeEqualToNumber("entries[0].intersectionRect.bottom", 108);
+    shouldBeEqualToNumber("entries[0].rootBounds.left", 0);
+    shouldBeEqualToNumber("entries[0].rootBounds.right", 800);
+    shouldBeEqualToNumber("entries[0].rootBounds.top", 0);
+    shouldBeEqualToNumber("entries[0].rootBounds.bottom", 600);
+    shouldEvaluateToSameObject("entries[0].target", target);
+  }
+  finishJSTest();
+}
+</script>
diff --git a/third_party/WebKit/LayoutTests/payments/payment-request-interface.html b/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
index 670f291..d1c6c7d 100644
--- a/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
+++ b/third_party/WebKit/LayoutTests/payments/payment-request-interface.html
@@ -275,24 +275,6 @@
 for (var i in detailNames) {
     generate_tests(assert_throws, [
         // Invalid currency code formats.
-        ['Invalid currency code US1 should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': 'US1'}))
-        }],
-        ['Invalid currency code US should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': 'US'}))
-        }],
-        ['Invalid currency code USDO should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': 'USDO'}))
-        }],
-        ['Invalid currency code usd should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': 'usd'}))
-        }],
-        ['Empty currency code should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': ''}))
-        }],
-        ['Null currency code should throw', null, function() {
-            new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': null}))
-        }],
         ['Undefined currency code should throw', null, function() {
             new PaymentRequest([{'supportedMethods': ['foo']}], buildDetails(detailNames[i], {'currency': undefined}))
         }],
diff --git a/third_party/WebKit/LayoutTests/platform/android/css3/filters/filter-repaint-turbulence-expected.png b/third_party/WebKit/LayoutTests/platform/android/css3/filters/filter-repaint-turbulence-expected.png
deleted file mode 100644
index eef3903..0000000
--- a/third_party/WebKit/LayoutTests/platform/android/css3/filters/filter-repaint-turbulence-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png b/third_party/WebKit/LayoutTests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png
deleted file mode 100644
index e233f3e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/touchadjustment/touch-links-longpress-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/touchadjustment/touch-links-longpress-expected.txt
deleted file mode 100644
index 35b604d..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/touchadjustment/touch-links-longpress-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Tests if a long press gesture on links will trigger a drag/drop when touch adjustment is used.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Testing direct hits.
-PASS
-PASS
-Testing indirect hits.
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/presentation/presentation-receiver.html b/third_party/WebKit/LayoutTests/presentation/presentation-receiver.html
index 3f593f9a..31af394 100644
--- a/third_party/WebKit/LayoutTests/presentation/presentation-receiver.html
+++ b/third_party/WebKit/LayoutTests/presentation/presentation-receiver.html
@@ -7,24 +7,14 @@
 
 test(function() {
     assert_true('receiver' in navigator.presentation);
-    assert_true('getConnection' in navigator.presentation.receiver);
-    assert_true('getConnections' in navigator.presentation.receiver);
-    assert_true('onconnectionavailable' in navigator.presentation.receiver);
-
-    assert_true('PresentationReceiver' in window);
+    assert_true('connectionList' in navigator.presentation.receiver);
 }, "Test that the Presentation Receiver API is present.")
 
 test(function() {
   assert_equals(typeof(navigator.presentation.receiver), "object");
-  assert_equals(typeof(navigator.presentation.receiver.getConnection), "function");
-  assert_equals(typeof(navigator.presentation.receiver.getConnections), "function");
-  assert_equals(typeof(navigator.presentation.receiver.onconnectionavailable), "object");
+  assert_equals(typeof(navigator.presentation.receiver.connectionList), "object");
 }, "Test the Presentation Receiver API property types.");
 
-test(function() {
-  assert_true(navigator.presentation.receiver instanceof EventTarget);
-}, "Test that navigator.presentation.receiver is an EventTarget.");
-
 </script>
 </body>
 </html>
diff --git a/third_party/WebKit/LayoutTests/printing/overflow-auto-expected.html b/third_party/WebKit/LayoutTests/printing/overflow-auto-expected.html
deleted file mode 100644
index 71d8d53..0000000
--- a/third_party/WebKit/LayoutTests/printing/overflow-auto-expected.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<script>
-if (window.testRunner)
-    testRunner.setPrinting();
-</script>
-<p>There should be some text below this paragraph, on this page. The text should flow nicely into
-    the next page. The number of pages should be 6.</p>
-<div style="font-size:4em; height:510vh; orphans:1; widows:1;">
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-</div>
diff --git a/third_party/WebKit/LayoutTests/printing/overflow-auto.html b/third_party/WebKit/LayoutTests/printing/overflow-auto.html
deleted file mode 100644
index a7d1680..0000000
--- a/third_party/WebKit/LayoutTests/printing/overflow-auto.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<script>
-if (window.testRunner)
-    testRunner.setPrinting();
-</script>
-<p>There should be some text below this paragraph, on this page. The text should flow nicely into
-    the next page. The number of pages should be 6.</p>
-<div style="overflow:auto; font-size:4em; height:510vh; orphans:1; widows:1;">
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-    Line of text.<br>
-</div>
diff --git a/third_party/WebKit/LayoutTests/touchadjustment/touch-links-longpress.html b/third_party/WebKit/LayoutTests/touchadjustment/touch-links-longpress.html
index 4d6c5d7..c737d0cd 100644
--- a/third_party/WebKit/LayoutTests/touchadjustment/touch-links-longpress.html
+++ b/third_party/WebKit/LayoutTests/touchadjustment/touch-links-longpress.html
@@ -16,7 +16,7 @@
 <body>
 
 <div id="sandbox">
-<p><a href="" id="link1">I</a> propose to consider <a href="" id="link2">the question</a>, "Can machines think?"<br>This should begin with definitions of the meaning of the terms "machine" and <a href="" id="link3">"think."</a></p>
+<p><a id="link1">I</a> propose to consider <a id="link2">the question</a>, "Can machines think?"<br>This should begin with definitions of the meaning of the terms "machine" and <a id="link3">"think."</a></p>
 </div>
 
 <p id='description'></p>
@@ -35,8 +35,15 @@
 
     function testLongPress(touchpoint)
     {
-        if (eventSender.gestureLongPress)
+        if (eventSender.gestureLongPress) {
+            // Anchor tags without href are not treated as links, but as texts
+            // instead.
+            // The first long press selects the text. The second long press will
+            // initiate drag and drop.
             eventSender.gestureLongPress(touchpoint.x, touchpoint.y, touchpoint.width, touchpoint.height);
+            eventSender.leapForward(100);
+            eventSender.gestureLongPress(touchpoint.x, touchpoint.y, touchpoint.width, touchpoint.height);
+        }
         else
             debug("gestureLongPress not implemented by this platform.");
     }
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index b16f31f..a94555c 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -4575,13 +4575,16 @@
     getter message
     getter reason
     method constructor
-interface PresentationReceiver : EventTarget
+interface PresentationConnectionList : EventTarget
     attribute @@toStringTag
+    getter connections
     getter onconnectionavailable
     method constructor
-    method getConnection
-    method getConnections
     setter onconnectionavailable
+interface PresentationReceiver
+    attribute @@toStringTag
+    getter connectionList
+    method constructor
 interface PresentationRequest : EventTarget
     attribute @@toStringTag
     getter onconnectionavailable
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h
index 9eb13bc..dcf9899f 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerThread.h
@@ -6,9 +6,9 @@
 #define ScriptStreamerThread_h
 
 #include "core/CoreExport.h"
-#include "platform/TaskSynchronizer.h"
 #include "public/platform/WebThread.h"
 #include "wtf/Functional.h"
+#include "wtf/ThreadingPrimitives.h"
 #include <memory>
 #include <v8.h>
 
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index b5e5d5e7..30611f2 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chrome_build.gni")
 import("//build/config/chromecast_build.gni")
 import("//build/config/ui.gni")
 import("//build/split_static_library.gni")
@@ -21,30 +20,6 @@
 
 rel_blink_core_gen_dir = rebase_path(blink_core_output_dir, root_build_dir)
 
-# Compute the optimization level. The GYP code sets "optimize: max" which sets
-# speed-over-size optimization for official builds on Windows only. The GN's
-# build optimize_max config applies this optimization on all platforms, so
-# compute how to modify the config list to duplicate the GYP behavior.
-if (is_debug || !is_win || !is_official_build) {
-  # NOP.
-  core_config_add = []
-  core_config_remove = []
-} else {
-  core_config_remove = [ "//build/config/compiler:default_optimization" ]
-  core_config_add = [ "//build/config/compiler:optimize_max" ]
-}
-
-# Core targets also get wexit time destructors.
-core_config_add += [
-  "//build/config/compiler:wexit_time_destructors",
-  "//third_party/WebKit/Source:non_test_config",
-]
-
-if (remove_webcore_debug_symbols) {
-  core_config_remove += [ "//build/config/compiler:default_symbols" ]
-  core_config_add += [ "//build/config/compiler:no_symbols" ]
-}
-
 # Config for code that builds as part of core.
 config("config") {
   defines = [ "BLINK_CORE_IMPLEMENTATION=1" ]
@@ -59,7 +34,6 @@
     defines += [ "BLINK_MEDIA_LOG=DVLOG(2)" ]
   }
 }
-core_config_add += [ ":config" ]
 
 config("core_include_dirs") {
   include_dirs = [
@@ -424,35 +398,6 @@
     "$blink_core_output_dir/InspectorOverridesInl.h",
     "$blink_core_output_dir/InstrumentingAgents.h",
 
-    # Additional .cpp files from the inspector:protocol_sources list.
-    "$blink_core_output_dir/inspector/protocol/Accessibility.cpp",
-    "$blink_core_output_dir/inspector/protocol/Animation.cpp",
-    "$blink_core_output_dir/inspector/protocol/ApplicationCache.cpp",
-    "$blink_core_output_dir/inspector/protocol/CSS.cpp",
-    "$blink_core_output_dir/inspector/protocol/CacheStorage.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOM.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOMDebugger.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOMStorage.cpp",
-    "$blink_core_output_dir/inspector/protocol/Database.cpp",
-    "$blink_core_output_dir/inspector/protocol/DeviceOrientation.cpp",
-    "$blink_core_output_dir/inspector/protocol/Emulation.cpp",
-    "$blink_core_output_dir/inspector/protocol/IO.cpp",
-    "$blink_core_output_dir/inspector/protocol/IndexedDB.cpp",
-    "$blink_core_output_dir/inspector/protocol/Input.cpp",
-    "$blink_core_output_dir/inspector/protocol/Inspector.cpp",
-    "$blink_core_output_dir/inspector/protocol/LayerTree.cpp",
-    "$blink_core_output_dir/inspector/protocol/Log.cpp",
-    "$blink_core_output_dir/inspector/protocol/Memory.cpp",
-    "$blink_core_output_dir/inspector/protocol/Network.cpp",
-    "$blink_core_output_dir/inspector/protocol/Page.cpp",
-    "$blink_core_output_dir/inspector/protocol/Protocol.cpp",
-    "$blink_core_output_dir/inspector/protocol/Rendering.cpp",
-    "$blink_core_output_dir/inspector/protocol/Security.cpp",
-    "$blink_core_output_dir/inspector/protocol/ServiceWorker.cpp",
-    "$blink_core_output_dir/inspector/protocol/Storage.cpp",
-    "$blink_core_output_dir/inspector/protocol/Tracing.cpp",
-    "$blink_core_output_dir/inspector/protocol/Worker.cpp",
-
     # Additional .cpp files for SVG.
     "$blink_core_output_dir/SVGElementFactory.cpp",
 
@@ -482,7 +427,7 @@
     ":make_core_generated",
     ":prerequisites",
     "inspector:instrumentation_sources",
-    "inspector:protocol_sources",
+    "inspector:protocol",
     "//gin",
     "//skia",
     "//third_party/WebKit/Source/bindings/core/v8:bindings_core_v8_generated",
diff --git a/third_party/WebKit/Source/core/core.gni b/third_party/WebKit/Source/core/core.gni
index e9eb067..2427ada 100644
--- a/third_party/WebKit/Source/core/core.gni
+++ b/third_party/WebKit/Source/core/core.gni
@@ -2,8 +2,37 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chrome_build.gni")
+import("//third_party/WebKit/Source/config.gni")
+
 blink_core_output_dir = "$root_gen_dir/blink/core"
 
+# This file sets core_config_add and core_config_remove lists of configs to
+# modify the default lists of configs set in the build as appropriate for core
+# targets. This avoids duplicating logic across many targets.
+core_config_add = [
+  "//build/config/compiler:wexit_time_destructors",
+  "//third_party/WebKit/Source:config",
+  "//third_party/WebKit/Source:non_test_config",
+  "//third_party/WebKit/Source/core:config",
+]
+core_config_remove = []
+
+# Compute the optimization level. The GYP code sets "optimize: max" which sets
+# speed-over-size optimization for official builds on Windows only. The GN's
+# build optimize_max config applies this optimization on all platforms, so
+# compute how to modify the config list to duplicate the GYP behavior.
+# TODO revisit this behavior, as the Windows-specific part seems suspicious.
+if (is_win && is_official_build) {
+  core_config_remove += [ "//build/config/compiler:default_optimization" ]
+  core_config_add += [ "//build/config/compiler:optimize_max" ]
+}
+
+if (remove_webcore_debug_symbols) {
+  core_config_remove += [ "//build/config/compiler:default_symbols" ]
+  core_config_add += [ "//build/config/compiler:no_symbols" ]
+}
+
 # This file is the GN version of core.gypi. We rebase most paths to be absolute
 # so these lists can be used by BUILD files in different directories without
 # worrying about the base directory.
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi
index 6f4d7cd..49a56d7 100644
--- a/third_party/WebKit/Source/core/core.gypi
+++ b/third_party/WebKit/Source/core/core.gypi
@@ -2678,6 +2678,8 @@
             'dom/StyleElement.h',
             'dom/StyleEngine.cpp',
             'dom/StyleEngine.h',
+            'dom/StyleEngineContext.cpp',
+            'dom/StyleEngineContext.h',
             'dom/StyleSheetCandidate.cpp',
             'dom/StyleSheetCandidate.h',
             'dom/StyleSheetCollection.cpp',
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index bb03aff..637cd04 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -447,7 +447,7 @@
     if (data.positionType() == LegacyPosition)
         result->append(*CSSPrimitiveValue::createIdentifier(CSSValueLegacy));
     // To avoid needing to copy the RareNonInheritedData, we repurpose the 'auto' flag to not just mean 'auto' prior to running the StyleAdjuster but also mean 'normal' after running it.
-    result->append(*CSSPrimitiveValue::create(data.position() == ItemPositionAuto ? ItemPositionNormal : data.position()));
+    result->append(*CSSPrimitiveValue::create(data.position() == ItemPositionAuto ? ComputedStyle::initialDefaultAlignment().position() : data.position()));
     if (data.position() >= ItemPositionCenter && data.overflow() != OverflowAlignmentDefault)
         result->append(*CSSPrimitiveValue::create(data.overflow()));
     ASSERT(result->length() <= 2);
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
index 319e74e..bd49325e 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
@@ -116,7 +116,7 @@
 
 void RemoteFontFaceSource::notifyFinished(Resource*)
 {
-    m_histograms.recordRemoteFont(m_font.get());
+    m_histograms.recordRemoteFont(m_font.get(), m_isLoadedFromMemoryCache);
     m_histograms.fontLoaded(m_isInterventionTriggered, !m_isLoadedFromMemoryCache && !m_font->url().protocolIsData() && !m_font->response().wasCached());
 
     m_font->ensureCustomFontData();
@@ -260,16 +260,17 @@
     m_blankPaintTime = -1;
 }
 
-void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResource* font)
+void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResource* font, bool isLoadedFromMemoryCache)
 {
     if (m_loadStartTime > 0 && font && !font->isLoading()) {
         int duration = static_cast<int>(currentTimeMS() - m_loadStartTime);
         recordLoadTimeHistogram(font, duration);
         m_loadStartTime = -1;
 
-        enum { Miss, Hit, DataUrl, CacheHitEnumMax };
+        enum { Miss, DiskHit, DataUrl, MemoryHit, CacheHitEnumMax };
         int histogramValue = font->url().protocolIsData() ? DataUrl
-            : font->response().wasCached() ? Hit
+            : isLoadedFromMemoryCache ? MemoryHit
+            : font->response().wasCached() ? DiskHit
             : Miss;
         DEFINE_STATIC_LOCAL(EnumerationHistogram, cacheHitHistogram, ("WebFont.CacheHit", CacheHitEnumMax));
         cacheHitHistogram.count(histogramValue);
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
index edcfdc5..6bb1e5f 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
@@ -67,7 +67,7 @@
         void fontLoaded(bool isInterventionTriggered, bool isLoadedFromNetwork);
         void longLimitExceeded(bool isInterventionTriggered);
         void recordFallbackTime(const FontResource*);
-        void recordRemoteFont(const FontResource*);
+        void recordRemoteFont(const FontResource*, bool isLoadedFromMemoryCache);
         bool hadBlankText() { return m_blankPaintTime; }
     private:
         void recordLoadTimeHistogram(const FontResource*, int duration);
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
index d75c415a..83ada0d 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
@@ -169,7 +169,7 @@
 
     // The 'auto' keyword computes the computed value of align-items on the parent
     // or 'normal' if the box has no parent.
-    if (style.alignSelfPosition() == ItemPositionAuto && parentStyle.alignItemsPosition() != ItemPositionNormal)
+    if (style.alignSelfPosition() == ItemPositionAuto && parentStyle.alignItemsPosition() != ComputedStyle::initialDefaultAlignment().position())
         style.setAlignSelf(parentStyle.alignItems());
 }
 
diff --git a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
index 9cee2748..1970c98 100644
--- a/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
+++ b/third_party/WebKit/Source/core/dom/IntersectionObserver.cpp
@@ -249,7 +249,7 @@
 
     if (target->document() == rootNode()->document()) {
         shouldReportRootBounds = true;
-        isDOMDescendant = target->isDescendantOf(rootNode());
+        isDOMDescendant = rootNode()->isShadowIncludingInclusiveAncestorOf(target);
     } else if (targetFrame && rootFrame) {
         shouldReportRootBounds = targetFrame->securityContext()->getSecurityOrigin()->canAccess(rootFrame->securityContext()->getSecurityOrigin());
         isDOMDescendant = (targetFrame->tree().top() == rootFrame);
diff --git a/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp b/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp
new file mode 100644
index 0000000..a345d26
--- /dev/null
+++ b/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 Google, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "core/dom/StyleEngineContext.h"
+
+#include "core/frame/UseCounter.h"
+
+namespace blink {
+
+StyleEngineContext::StyleEngineContext()
+    : m_addedPendingSheetBeforeBody(false)
+{
+}
+
+void StyleEngineContext::addingPendingSheet(const Document& document)
+{
+    // If the sheet was ever added before the body then all references to it are
+    // treated as before-body.
+    if (!m_addedPendingSheetBeforeBody) {
+        m_addedPendingSheetBeforeBody = !document.body();
+        if (!m_addedPendingSheetBeforeBody)
+            UseCounter::count(document, UseCounter::PendingStylesheetAddedAfterBodyStarted);
+    }
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/StyleEngineContext.h b/third_party/WebKit/Source/core/dom/StyleEngineContext.h
index 79188c2..bc68009 100644
--- a/third_party/WebKit/Source/core/dom/StyleEngineContext.h
+++ b/third_party/WebKit/Source/core/dom/StyleEngineContext.h
@@ -9,12 +9,12 @@
 
 namespace blink {
 
-class StyleEngineContext {
+class CORE_EXPORT StyleEngineContext {
 public:
-    StyleEngineContext() : m_addedPendingSheetBeforeBody(false) {}
+    StyleEngineContext();
     ~StyleEngineContext() {}
     bool addedPendingSheetBeforeBody() const { return m_addedPendingSheetBeforeBody; }
-    void addingPendingSheet(const Document& document) { m_addedPendingSheetBeforeBody = m_addedPendingSheetBeforeBody || !document.body(); }
+    void addingPendingSheet(const Document&);
 private:
     bool m_addedPendingSheetBeforeBody : 1;
 };
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h
index 36fd422..4fcff565 100644
--- a/third_party/WebKit/Source/core/frame/UseCounter.h
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1275,6 +1275,7 @@
         DraggableAttribute = 1539,
         CleanScriptElementWithNonce = 1540,
         PotentiallyInjectedScriptElementWithNonce = 1541,
+        PendingStylesheetAddedAfterBodyStarted = 1542,
 
         // Add new features immediately above this line. Don't change assigned
         // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp b/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp
index 7ed7aa7..608eb139 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp
@@ -68,7 +68,6 @@
     if (Platform::current()->currentThread() && s_sharedThread->m_thread) {
         WaitableEvent waitableEvent;
         s_sharedThread->postTask(crossThreadBind(&HTMLParserThread::cleanupHTMLParserThread, crossThreadUnretained(s_sharedThread), crossThreadUnretained(&waitableEvent)));
-        SafePointScope scope(BlinkGC::HeapPointersOnStack);
         waitableEvent.wait();
     }
     delete s_sharedThread;
diff --git a/third_party/WebKit/Source/core/input/GestureManager.cpp b/third_party/WebKit/Source/core/input/GestureManager.cpp
index a1aa320..4e94c837 100644
--- a/third_party/WebKit/Source/core/input/GestureManager.cpp
+++ b/third_party/WebKit/Source/core/input/GestureManager.cpp
@@ -254,14 +254,18 @@
     // supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code
     // and LongPress is such a special scenario that it's unlikely to matter much in practice.
 
+    IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.position());
+    HitTestResult hitTestResult = m_frame->eventHandler().hitTestResultAtPoint(hitTestPoint);
+
     m_longTapShouldInvokeContextMenu = false;
-    if (m_frame->eventHandler().handleDragDropIfPossible(targetedEvent)) {
+    bool hitTestContainsLinks = hitTestResult.URLElement() || !hitTestResult.absoluteImageURL().isNull() || !hitTestResult.absoluteMediaURL().isNull();
+
+    if (!hitTestContainsLinks && m_frame->eventHandler().handleDragDropIfPossible(targetedEvent)) {
         m_longTapShouldInvokeContextMenu = true;
         return WebInputEventResult::HandledSystem;
     }
-    IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.position());
-    HitTestResult result = m_frame->eventHandler().hitTestResultAtPoint(hitTestPoint);
-    if (m_selectionController->handleGestureLongPress(gestureEvent, result)) {
+
+    if (m_selectionController->handleGestureLongPress(gestureEvent, hitTestResult)) {
         m_frame->eventHandler().focusDocumentView();
         return WebInputEventResult::HandledSystem;
     }
diff --git a/third_party/WebKit/Source/core/inspector/BUILD.gn b/third_party/WebKit/Source/core/inspector/BUILD.gn
index e272cea..bbb4958 100644
--- a/third_party/WebKit/Source/core/inspector/BUILD.gn
+++ b/third_party/WebKit/Source/core/inspector/BUILD.gn
@@ -31,84 +31,93 @@
 
 # inspector protocol -----------------------------------------------------------
 
-action("protocol_sources") {
-  script = "../../platform/inspector_protocol/CodeGenerator.py"
-  deps = [
-    ":protocol_version",
-  ]
-  sources = inspector_protocol_sources
+inspector_protocol_generate("protocol_sources") {
+  out_dir = blink_core_output_dir
+
+  config_file = "inspector_protocol_config.json"
   inputs = [
     "browser_protocol.json",
     "../../platform/v8_inspector/js_protocol.json",
     "inspector_protocol_config.json",
   ]
+
+  # These are relative to blink_core_output_dir.
   outputs = [
-    "$blink_core_output_dir/inspector/protocol/Forward.h",
-    "$blink_core_output_dir/inspector/protocol/Protocol.cpp",
-    "$blink_core_output_dir/inspector/protocol/Protocol.h",
-    "$blink_core_output_dir/inspector/protocol/Accessibility.cpp",
-    "$blink_core_output_dir/inspector/protocol/Accessibility.h",
-    "$blink_core_output_dir/inspector/protocol/Animation.cpp",
-    "$blink_core_output_dir/inspector/protocol/Animation.h",
-    "$blink_core_output_dir/inspector/protocol/ApplicationCache.cpp",
-    "$blink_core_output_dir/inspector/protocol/ApplicationCache.h",
-    "$blink_core_output_dir/inspector/protocol/CacheStorage.cpp",
-    "$blink_core_output_dir/inspector/protocol/CacheStorage.h",
-    "$blink_core_output_dir/inspector/protocol/CSS.cpp",
-    "$blink_core_output_dir/inspector/protocol/CSS.h",
-    "$blink_core_output_dir/inspector/protocol/Database.cpp",
-    "$blink_core_output_dir/inspector/protocol/Database.h",
-    "$blink_core_output_dir/inspector/protocol/Debugger.h",
-    "$blink_core_output_dir/inspector/protocol/DeviceOrientation.cpp",
-    "$blink_core_output_dir/inspector/protocol/DeviceOrientation.h",
-    "$blink_core_output_dir/inspector/protocol/DOM.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOMDebugger.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOMDebugger.h",
-    "$blink_core_output_dir/inspector/protocol/DOM.h",
-    "$blink_core_output_dir/inspector/protocol/DOMStorage.cpp",
-    "$blink_core_output_dir/inspector/protocol/DOMStorage.h",
-    "$blink_core_output_dir/inspector/protocol/Emulation.cpp",
-    "$blink_core_output_dir/inspector/protocol/Emulation.h",
-    "$blink_core_output_dir/inspector/protocol/IndexedDB.cpp",
-    "$blink_core_output_dir/inspector/protocol/IndexedDB.h",
-    "$blink_core_output_dir/inspector/protocol/Input.cpp",
-    "$blink_core_output_dir/inspector/protocol/Input.h",
-    "$blink_core_output_dir/inspector/protocol/Inspector.cpp",
-    "$blink_core_output_dir/inspector/protocol/Inspector.h",
-    "$blink_core_output_dir/inspector/protocol/IO.cpp",
-    "$blink_core_output_dir/inspector/protocol/IO.h",
-    "$blink_core_output_dir/inspector/protocol/LayerTree.cpp",
-    "$blink_core_output_dir/inspector/protocol/LayerTree.h",
-    "$blink_core_output_dir/inspector/protocol/Log.cpp",
-    "$blink_core_output_dir/inspector/protocol/Log.h",
-    "$blink_core_output_dir/inspector/protocol/Memory.cpp",
-    "$blink_core_output_dir/inspector/protocol/Memory.h",
-    "$blink_core_output_dir/inspector/protocol/Network.cpp",
-    "$blink_core_output_dir/inspector/protocol/Network.h",
-    "$blink_core_output_dir/inspector/protocol/Page.cpp",
-    "$blink_core_output_dir/inspector/protocol/Page.h",
-    "$blink_core_output_dir/inspector/protocol/Rendering.cpp",
-    "$blink_core_output_dir/inspector/protocol/Rendering.h",
-    "$blink_core_output_dir/inspector/protocol/Runtime.h",
-    "$blink_core_output_dir/inspector/protocol/Security.cpp",
-    "$blink_core_output_dir/inspector/protocol/Security.h",
-    "$blink_core_output_dir/inspector/protocol/ServiceWorker.cpp",
-    "$blink_core_output_dir/inspector/protocol/ServiceWorker.h",
-    "$blink_core_output_dir/inspector/protocol/Storage.cpp",
-    "$blink_core_output_dir/inspector/protocol/Storage.h",
-    "$blink_core_output_dir/inspector/protocol/Tracing.cpp",
-    "$blink_core_output_dir/inspector/protocol/Tracing.h",
-    "$blink_core_output_dir/inspector/protocol/Worker.cpp",
-    "$blink_core_output_dir/inspector/protocol/Worker.h",
+    "inspector/protocol/Accessibility.cpp",
+    "inspector/protocol/Accessibility.h",
+    "inspector/protocol/Animation.cpp",
+    "inspector/protocol/Animation.h",
+    "inspector/protocol/ApplicationCache.cpp",
+    "inspector/protocol/ApplicationCache.h",
+    "inspector/protocol/CacheStorage.cpp",
+    "inspector/protocol/CacheStorage.h",
+    "inspector/protocol/CSS.cpp",
+    "inspector/protocol/CSS.h",
+    "inspector/protocol/Database.cpp",
+    "inspector/protocol/Database.h",
+    "inspector/protocol/Debugger.h",
+    "inspector/protocol/DeviceOrientation.cpp",
+    "inspector/protocol/DeviceOrientation.h",
+    "inspector/protocol/DOM.cpp",
+    "inspector/protocol/DOMDebugger.cpp",
+    "inspector/protocol/DOMDebugger.h",
+    "inspector/protocol/DOM.h",
+    "inspector/protocol/DOMStorage.cpp",
+    "inspector/protocol/DOMStorage.h",
+    "inspector/protocol/Emulation.cpp",
+    "inspector/protocol/Emulation.h",
+    "inspector/protocol/Forward.h",
+    "inspector/protocol/IndexedDB.cpp",
+    "inspector/protocol/IndexedDB.h",
+    "inspector/protocol/Input.cpp",
+    "inspector/protocol/Input.h",
+    "inspector/protocol/Inspector.cpp",
+    "inspector/protocol/Inspector.h",
+    "inspector/protocol/IO.cpp",
+    "inspector/protocol/IO.h",
+    "inspector/protocol/LayerTree.cpp",
+    "inspector/protocol/LayerTree.h",
+    "inspector/protocol/Log.cpp",
+    "inspector/protocol/Log.h",
+    "inspector/protocol/Memory.cpp",
+    "inspector/protocol/Memory.h",
+    "inspector/protocol/Network.cpp",
+    "inspector/protocol/Network.h",
+    "inspector/protocol/Page.cpp",
+    "inspector/protocol/Page.h",
+    "inspector/protocol/Protocol.cpp",
+    "inspector/protocol/Protocol.h",
+    "inspector/protocol/Rendering.cpp",
+    "inspector/protocol/Rendering.h",
+    "inspector/protocol/Runtime.h",
+    "inspector/protocol/Security.cpp",
+    "inspector/protocol/Security.h",
+    "inspector/protocol/ServiceWorker.cpp",
+    "inspector/protocol/ServiceWorker.h",
+    "inspector/protocol/Storage.cpp",
+    "inspector/protocol/Storage.h",
+    "inspector/protocol/Tracing.cpp",
+    "inspector/protocol/Tracing.h",
+    "inspector/protocol/Worker.cpp",
+    "inspector/protocol/Worker.h",
   ]
 
-  args = [
-    "--jinja_dir",
-    rebase_path("../../../../", root_build_dir),  # jinja is in chromium's third_party
-    "--output_base",
-    rebase_path(blink_core_output_dir, root_build_dir),
-    "--config",
-    rebase_path("inspector_protocol_config.json", root_build_dir),
+  deps = [
+    ":protocol_version",
+  ]
+}
+
+# Compiles the sources generated above.
+source_set("protocol") {
+  sources = get_target_outputs(":protocol_sources")
+
+  configs -= core_config_remove
+  configs +=
+      core_config_add + [ "//third_party/WebKit/Source/core:core_include_dirs" ]
+
+  deps = [
+    ":protocol_sources",
+    "//third_party/WebKit/Source/wtf",
   ]
 }
 
diff --git a/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json b/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
index 2a5f909..b469cba 100644
--- a/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
+++ b/third_party/WebKit/Source/core/inspector/inspector_protocol_config.json
@@ -3,7 +3,9 @@
         "path": "browser_protocol.json",
         "package": "core/inspector/protocol",
         "output": "inspector/protocol",
-        "namespace": ["blink", "protocol"]
+        "namespace": ["blink", "protocol"],
+        "export_macro": "CORE_EXPORT",
+        "export_header": "core/CoreExport.h"
     },
 
     "imported": {
@@ -18,11 +20,8 @@
         "package": "core/inspector/protocol",
         "output": "inspector/protocol",
         "string_header": "core/inspector/V8InspectorString.h",
-        "platform_header": "core/inspector/ProtocolPlatform.h"
-    },
-
-    "class_export": {
-        "macro": "CORE_EXPORT",
-        "header": "core/CoreExport.h"
+        "platform_header": "core/inspector/ProtocolPlatform.h",
+        "export_macro": "CORE_EXPORT",
+        "export_header": "core/CoreExport.h"
     }
 }
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index 7b7ec95a..b8d834e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -4220,12 +4220,6 @@
     if ((isHorizontal && !scrollsOverflowY()) || (!isHorizontal && !scrollsOverflowX()))
         return false;
 
-    // Fragmenting scrollbars is only problematic in interactive media, e.g. multicol on a
-    // screen. If we're printing, which is non-interactive media, we should allow objects with
-    // non-visible overflow to be paginated as normally.
-    if (document().printing())
-        return false;
-
     // We do have overflow. We'll still be willing to paginate as long as the block
     // has auto logical height, auto or undefined max-logical-height and a zero or auto min-logical-height.
     // Note this is just a heuristic, and it's still possible to have overflow under these
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 4fc5844..f22261a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -1753,9 +1753,9 @@
     }
 }
 
-static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, ContentPosition alignContent, ContentDistributionType alignContentDistribution, bool isMultiline, unsigned numberOfLines)
+static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, ContentPosition alignContent, ContentDistributionType alignContentDistribution, unsigned numberOfLines)
 {
-    if (!isMultiline)
+    if (numberOfLines <= 1)
         return LayoutUnit();
     if (alignContent == ContentPositionFlexEnd)
         return availableFreeSpace;
@@ -1783,15 +1783,13 @@
 
 void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
 {
-    if (!lineContexts.size())
-        return;
-
     ContentPosition position = styleRef().resolvedAlignContentPosition(contentAlignmentNormalBehavior());
     ContentDistributionType distribution = styleRef().resolvedAlignContentDistribution(contentAlignmentNormalBehavior());
 
-    // If we have a single line flexbox the line height is all the available space.
+    // If we have a single line flexbox or a multiline line flexbox with only one flex line,
+    // the line height is all the available space.
     // For flex-direction: row, this means we need to use the height, so we do this after calling updateLogicalHeight.
-    if (!isMultiline()) {
+    if (lineContexts.size() == 1) {
         lineContexts[0].crossAxisExtent = crossAxisContentExtent();
         return;
     }
@@ -1804,7 +1802,7 @@
         availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
 
     LayoutBox* child = m_orderIterator.first();
-    LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, position, distribution, isMultiline(), lineContexts.size());
+    LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, position, distribution, lineContexts.size());
     for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
         lineContexts[lineNumber].crossAxisOffset += lineOffset;
         for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next())
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp b/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
index 39bdbe4..e51a52a 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTableRow.cpp
@@ -153,8 +153,17 @@
     LayoutTableBoxComponent::addChild(cell, beforeChild);
 
     // Generated content can result in us having a null section so make sure to null check our parent.
-    if (parent())
+    if (parent()) {
         section()->addCell(cell, this);
+        // When borders collapse, adding a cell can affect the the width of neighboring cells.
+        LayoutTable* enclosingTable = table();
+        if (enclosingTable && enclosingTable->collapseBorders()) {
+            if (LayoutTableCell* previousCell = cell->previousCell())
+                previousCell->setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::TableChanged);
+            if (LayoutTableCell* nextCell = cell->nextCell())
+                nextCell->setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::TableChanged);
+        }
+    }
 
     if (beforeChild || nextRow())
         section()->setNeedsCellRecalc();
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index 263634c..10d8978 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -2464,7 +2464,7 @@
         paintLayerFlags |= PaintLayerPaintingCompositingScrollingPhase;
 
     if (graphicsLayer == m_backgroundLayer.get())
-        paintLayerFlags |= (PaintLayerPaintingRootBackgroundOnly | PaintLayerPaintingCompositingForegroundPhase); // Need PaintLayerPaintingCompositingForegroundPhase to walk child layers.
+        paintLayerFlags |= PaintLayerPaintingRootBackgroundOnly;
     else if (compositor()->fixedRootBackgroundLayer() && m_owningLayer.isRootLayer())
         paintLayerFlags |= PaintLayerPaintingSkipRootBackground;
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
index a4a77c0..334d383 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
@@ -18,7 +18,9 @@
 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm(
     PassRefPtr<const ComputedStyle> style,
     NGBox* first_child)
-    : style_(style), first_child_(first_child), state_(kStateInit) {}
+    : style_(style), first_child_(first_child), state_(kStateInit) {
+  DCHECK(style_);
+}
 
 bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space,
                                     NGPhysicalFragment** out) {
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
index f239f14..7b21fa5f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -35,5 +35,48 @@
   EXPECT_EQ(frag->Height(), LayoutUnit(40));
 }
 
+// Verifies that two children are laid out with the correct size and position.
+TEST_F(NGBlockLayoutAlgorithmTest, LayoutBlockChildren) {
+  const int kWidth = 30;
+  const int kHeight1 = 20;
+  const int kHeight2 = 30;
+  const int kMarginTop = 5;
+  const int kMarginBottom = 20;
+  style_->setWidth(Length(kWidth, Fixed));
+
+  NGConstraintSpace* space = new NGConstraintSpace(
+      HorizontalTopBottom, NGLogicalSize(LayoutUnit(100), NGSizeIndefinite));
+
+  RefPtr<ComputedStyle> first_style = ComputedStyle::create();
+  first_style->setHeight(Length(kHeight1, Fixed));
+  NGBox* first_child = new NGBox(first_style.get());
+
+  RefPtr<ComputedStyle> second_style = ComputedStyle::create();
+  second_style->setHeight(Length(kHeight2, Fixed));
+  second_style->setMarginTop(Length(kMarginTop, Fixed));
+  second_style->setMarginBottom(Length(kMarginBottom, Fixed));
+  NGBox* second_child = new NGBox(second_style.get());
+
+  first_child->SetNextSibling(second_child);
+
+  NGBlockLayoutAlgorithm algorithm(style_, first_child);
+  NGPhysicalFragment* frag;
+  while (!algorithm.Layout(space, &frag))
+    ;
+  EXPECT_EQ(frag->Width(), LayoutUnit(kWidth));
+  EXPECT_EQ(frag->Height(),
+            LayoutUnit(kHeight1 + kHeight2 + kMarginTop + kMarginBottom));
+  EXPECT_EQ(frag->Type(), NGPhysicalFragmentBase::FragmentBox);
+  ASSERT_EQ(frag->Children().size(), 2UL);
+
+  const NGPhysicalFragmentBase* child = frag->Children()[0];
+  EXPECT_EQ(child->Height(), kHeight1);
+  EXPECT_EQ(child->TopOffset(), 0);
+
+  child = frag->Children()[1];
+  EXPECT_EQ(child->Height(), kHeight2);
+  EXPECT_EQ(child->TopOffset(), kHeight1 + kMarginTop);
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_box.cc b/third_party/WebKit/Source/core/layout/ng/ng_box.cc
index 14ded2f..a0eee39 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_box.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_box.cc
@@ -21,6 +21,10 @@
   DCHECK(layout_box_);
 }
 
+NGBox::NGBox(ComputedStyle* style) : style_(style) {
+  DCHECK(style_);
+}
+
 bool NGBox::Layout(const NGConstraintSpace* constraint_space,
                    NGFragment** out) {
   // We can either use the new layout code to do the layout and then copy the
@@ -38,20 +42,23 @@
       return false;
     fragment_ = fragment;
 
-    layout_box_->setWidth(fragment_->Width());
-    layout_box_->setHeight(fragment_->Height());
+    if (layout_box_) {
+      layout_box_->setWidth(fragment_->Width());
+      layout_box_->setHeight(fragment_->Height());
 
-    // Ensure the position of the children are copied across to the
-    // LayoutObject tree.
-    for (NGBox* box = FirstChild(); box; box = box->NextSibling()) {
-      if (box->fragment_)
-        box->PositionUpdated();
+      // Ensure the position of the children are copied across to the
+      // LayoutObject tree.
+      for (NGBox* box = FirstChild(); box; box = box->NextSibling()) {
+        if (box->fragment_)
+          box->PositionUpdated();
+      }
+
+      if (layout_box_->isLayoutBlock())
+        toLayoutBlock(layout_box_)->layoutPositionedObjects(true);
+      layout_box_->clearNeedsLayout();
     }
-
-    if (layout_box_->isLayoutBlock())
-      toLayoutBlock(layout_box_)->layoutPositionedObjects(true);
-    layout_box_->clearNeedsLayout();
   } else {
+    DCHECK(layout_box_);
     // TODO(layout-ng): If fixedSize is true, set the override width/height too
     NGLogicalSize container_size = constraint_space->ContainerSize();
     layout_box_->setOverrideContainingBlockContentLogicalWidth(
@@ -82,23 +89,45 @@
 }
 
 const ComputedStyle* NGBox::Style() const {
+  if (style_)
+    return style_.get();
+  DCHECK(layout_box_);
   return layout_box_->style();
 }
 
 NGBox* NGBox::NextSibling() const {
+  if (style_)
+    return next_sibling_;
+  DCHECK(layout_box_);
   LayoutObject* next_sibling = layout_box_->nextSibling();
   return next_sibling ? new NGBox(next_sibling) : nullptr;
 }
 
 NGBox* NGBox::FirstChild() const {
+  if (style_)
+    return first_child_;
+  DCHECK(layout_box_);
   LayoutObject* child = layout_box_->slowFirstChild();
   return child ? new NGBox(child) : nullptr;
 }
 
+void NGBox::SetNextSibling(NGBox* sibling) {
+  DCHECK(!layout_box_);
+  DCHECK(style_);
+  next_sibling_ = sibling;
+}
+
+void NGBox::SetFirstChild(NGBox* child) {
+  DCHECK(!layout_box_);
+  DCHECK(style_);
+  first_child_ = child;
+}
+
 void NGBox::PositionUpdated() {
-  DCHECK(fragment_);
-  layout_box_->setX(fragment_->LeftOffset());
-  layout_box_->setY(fragment_->TopOffset());
+  if (layout_box_) {
+    layout_box_->setX(fragment_->LeftOffset());
+    layout_box_->setY(fragment_->TopOffset());
+  }
 }
 
 bool NGBox::CanUseNewLayout() {
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_box.h b/third_party/WebKit/Source/core/layout/ng/ng_box.h
index d000b1b..790d8897 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_box.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_box.h
@@ -19,9 +19,10 @@
 class NGPhysicalFragment;
 
 // Represents a node to be laid out.
-class CORE_EXPORT NGBox final : public GarbageCollected<NGBox> {
+class CORE_EXPORT NGBox final : public GarbageCollectedFinalized<NGBox> {
  public:
   explicit NGBox(LayoutObject*);
+  explicit NGBox(ComputedStyle*);
 
   // Returns true when done; when this function returns false, it has to be
   // called again. The out parameter will only be set when this function
@@ -35,9 +36,14 @@
 
   NGBox* FirstChild() const;
 
+  void SetNextSibling(NGBox*);
+  void SetFirstChild(NGBox*);
+
   DEFINE_INLINE_VIRTUAL_TRACE() {
     visitor->trace(algorithm_);
     visitor->trace(fragment_);
+    visitor->trace(next_sibling_);
+    visitor->trace(first_child_);
   }
 
  private:
@@ -45,9 +51,15 @@
   // positions us, it calls this function so we can store the position on the
   // underlying LayoutBox.
   void PositionUpdated();
+
   bool CanUseNewLayout();
 
+  // We can either wrap a layout_box_ or a style_/next_sibling_/first_child_
+  // combination.
   LayoutBox* layout_box_;
+  RefPtr<ComputedStyle> style_;
+  Member<NGBox> next_sibling_;
+  Member<NGBox> first_child_;
   Member<NGBlockLayoutAlgorithm> algorithm_;
   Member<NGPhysicalFragment> fragment_;
 };
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc
index 7c8e546d9..c329866 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.cc
@@ -58,7 +58,8 @@
   DCHECK_EQ(offsets_.size(), children_.size());
 
   NGPhysicalSize physical_size = size_.ConvertToPhysical(writing_mode_);
-  HeapVector<Member<const NGPhysicalFragmentBase>> children(children_.size());
+  HeapVector<Member<const NGPhysicalFragmentBase>> children;
+  children.reserveCapacity(children_.size());
 
   for (size_t i = 0; i < children_.size(); ++i) {
     NGPhysicalFragmentBase* child = children_[i].get();
diff --git a/third_party/WebKit/Source/core/loader/FrameLoaderClient.h b/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
index 0dd606bf..6dceeae 100644
--- a/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
+++ b/third_party/WebKit/Source/core/loader/FrameLoaderClient.h
@@ -231,8 +231,6 @@
 
     virtual void didChangeFrameOwnerProperties(HTMLFrameElementBase*) { }
 
-    virtual void dispatchWillOpenWebSocket(WebSocketHandle*) { }
-
     virtual void dispatchWillStartUsingPeerConnectionHandler(WebRTCPeerConnectionHandler*) { }
 
     virtual bool allowWebGL(bool enabledPerSettings) { return enabledPerSettings; }
diff --git a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
index 44e1591e..2183ea0 100644
--- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
@@ -252,10 +252,7 @@
     if (m_blockingBehavior == LoadAsynchronously)
         return;
 
-    {
-        SafePointScope scope(BlinkGC::HeapPointersOnStack);
-        eventWithTasks->wait();
-    }
+    eventWithTasks->wait();
 
     if (eventWithTasks->isAborted()) {
         // This thread is going to terminate.
diff --git a/third_party/WebKit/Source/core/observer/ResizeObserverController.h b/third_party/WebKit/Source/core/observer/ResizeObserverController.h
index 4926528..a3b7a03 100644
--- a/third_party/WebKit/Source/core/observer/ResizeObserverController.h
+++ b/third_party/WebKit/Source/core/observer/ResizeObserverController.h
@@ -38,6 +38,9 @@
 
     DECLARE_TRACE();
 
+    // For testing only.
+    const HeapHashSet<WeakMember<ResizeObserver>>& observers() { return m_observers; }
+
 private:
     // Active observers
     HeapHashSet<WeakMember<ResizeObserver>> m_observers;
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
index a66c0cce..aae71e63 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerPainter.cpp
@@ -203,7 +203,7 @@
 
     PaintResult result = FullyPainted;
 
-    if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layoutObject()->isLayoutView() && !m_paintLayer.layoutObject()->isDocumentElement())
+    if (paintFlags & PaintLayerPaintingRootBackgroundOnly && !m_paintLayer.layoutObject()->isLayoutView())
         return result;
 
     if (m_paintLayer.layoutObject()->view()->frame() && m_paintLayer.layoutObject()->view()->frame()->shouldThrottleRendering())
@@ -564,20 +564,13 @@
     return result;
 }
 
-// FIXME: inline this.
-static bool paintForFixedRootBackground(const PaintLayer* layer, PaintLayerFlags paintFlags)
-{
-    return layer->layoutObject()->isDocumentElement() && (paintFlags & PaintLayerPaintingRootBackgroundOnly);
-}
-
 bool PaintLayerPainter::shouldPaintLayerInSoftwareMode(const GlobalPaintFlags globalPaintFlags, PaintLayerFlags paintFlags)
 {
     DisableCompositingQueryAsserts disabler;
 
     return m_paintLayer.compositingState() == NotComposited
         || (globalPaintFlags & GlobalPaintFlattenCompositingLayers)
-        || ((paintFlags & PaintLayerPaintingReflection) && !m_paintLayer.has3DTransform())
-        || paintForFixedRootBackground(&m_paintLayer, paintFlags);
+        || ((paintFlags & PaintLayerPaintingReflection) && !m_paintLayer.has3DTransform());
 }
 
 void PaintLayerPainter::paintOverflowControlsForFragments(const PaintLayerFragments& layerFragments, GraphicsContext& context, const PaintLayerPaintingInfo& localPaintingInfo, PaintLayerFlags paintFlags)
@@ -677,6 +670,8 @@
     GraphicsContext& context, const LayoutRect& transparencyPaintDirtyRect,
     const PaintLayerPaintingInfo& localPaintingInfo, bool selectionOnly, PaintLayerFlags paintFlags)
 {
+    DCHECK(!(paintFlags & PaintLayerPaintingRootBackgroundOnly));
+
     // Optimize clipping for the single fragment case.
     bool shouldClip = localPaintingInfo.clipToDirtyRect && layerFragments.size() == 1 && !layerFragments[0].foregroundRect.isEmpty();
     ClipState clipState = HasNotClipped;
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index f130819..8e60e049 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -194,6 +194,7 @@
   "front_end/emulation/TouchModel.js",
 ]
 devtools_ui_js_files = [
+  "front_end/ui/bezierEditor.css",
   "front_end/ui/bezierSwatch.css",
   "front_end/ui/checkboxTextLabel.css",
   "front_end/ui/closeButton.css",
@@ -232,6 +233,8 @@
   "front_end/ui/treeoutline.css",
   "front_end/ui/viewContainers.css",
   "front_end/ui/ActionRegistry.js",
+  "front_end/ui/BezierEditor.js",
+  "front_end/ui/BezierUI.js",
   "front_end/ui/ColorSwatch.js",
   "front_end/ui/Context.js",
   "front_end/ui/ContextMenu.js",
@@ -399,14 +402,11 @@
   "front_end/diff/diff_match_patch.js",
 ]
 devtools_elements_js_files = [
-  "front_end/elements/bezierEditor.css",
   "front_end/elements/breadcrumbs.css",
   "front_end/elements/computedStyleSidebarPane.css",
   "front_end/elements/elementsPanel.css",
   "front_end/elements/elementsTreeOutline.css",
   "front_end/elements/platformFontsWidget.css",
-  "front_end/elements/BezierEditor.js",
-  "front_end/elements/BezierUI.js",
   "front_end/elements/ClassesPaneWidget.js",
   "front_end/elements/ColorSwatchPopoverIcon.js",
   "front_end/elements/ComputedStyleModel.js",
@@ -860,13 +860,59 @@
   "$resources_out_dir/SupportedCSSProperties.js",
 ]
 
+generated_entry_files = [
+  "$resources_out_dir/inspector.html",
+  "$resources_out_dir/inspector.js",
+  "$resources_out_dir/toolbox.html",
+  "$resources_out_dir/toolbox.js",
+]
+
+generated_workers = [
+  "$resources_out_dir/formatter_worker.js",
+  "$resources_out_dir/heap_snapshot_worker.js",
+  "$resources_out_dir/temp_storage_shared_worker.js",
+]
+
+generated_bundled_modules = [
+  "$resources_out_dir/animation/animation_module.js",
+  "$resources_out_dir/audits/audits_module.js",
+  "$resources_out_dir/components_lazy/components_lazy_module.js",
+  "$resources_out_dir/console/console_module.js",
+  "$resources_out_dir/devices/devices_module.js",
+  "$resources_out_dir/diff/diff_module.js",
+  "$resources_out_dir/elements/elements_module.js",
+  "$resources_out_dir/es_tree/es_tree_module.js",
+  "$resources_out_dir/layers/layers_module.js",
+  "$resources_out_dir/network/network_module.js",
+  "$resources_out_dir/profiler/profiler_module.js",
+  "$resources_out_dir/resources/resources_module.js",
+  "$resources_out_dir/sass/sass_module.js",
+  "$resources_out_dir/security/security_module.js",
+  "$resources_out_dir/settings/settings_module.js",
+  "$resources_out_dir/snippets/snippets_module.js",
+  "$resources_out_dir/source_frame/source_frame_module.js",
+  "$resources_out_dir/sources/sources_module.js",
+  "$resources_out_dir/text_editor/text_editor_module.js",
+  "$resources_out_dir/timeline_model/timeline_model_module.js",
+  "$resources_out_dir/timeline/timeline_module.js",
+  "$resources_out_dir/ui_lazy/ui_lazy_module.js",
+]
+
+generated_remote_modules = [
+  "$resources_out_dir/accessibility/accessibility_module.js",
+  "$resources_out_dir/cm_modes/cm_modes_module.js",
+  "$resources_out_dir/emulated_devices/emulated_devices_module.js",
+  "$resources_out_dir/gonzales/gonzales_module.js",
+  "$resources_out_dir/screencast/screencast_module.js",
+]
+
 #-------------------------------------------------------------------------------
 
 visibility = [ "//third_party/WebKit/*" ]
 
 group("devtools_frontend_resources") {
   public_deps = [
-    ":build_applications",
+    ":build_release_devtools",
     ":copy_embedder_scripts",
     ":copy_emulated_devices_images",
     ":copy_inspector_images",
@@ -874,6 +920,9 @@
     ":frontend_protocol_sources",
     ":supported_css_properties",
   ]
+  if (debug_devtools) {
+    public_deps += [ ":build_debug_devtools" ]
+  }
 }
 
 copy("copy_embedder_scripts") {
@@ -906,57 +955,9 @@
   inputs = devtools_image_files + all_devtools_files
   inputs += devtools_embedder_scripts
 
-  if (debug_devtools) {
-    # Debug: all files are picked as-is.
-    generated_files = generated_scripts + [
-                        "$resources_out_dir/inspector.html",
-                        "$resources_out_dir/toolbox.html",
-                      ]
-
-    # Use a response file since the static files can be too long for the
-    # command line. The args here will be added to the command line.
-    static_files = all_devtools_files + [ "front_end/Runtime.js" ]
-    response_file_contents = rebase_path(static_files, root_build_dir)
-    static_files_args = [
-      "--static_files_args",
-      "{{response_file_name}}",
-    ]
-  } else {
-    # Release: pick compiled non-remote modules and concatenated app files.
-    generated_files = [
-      "$resources_out_dir/inspector.html",
-      "$resources_out_dir/inspector.js",
-      "$resources_out_dir/toolbox.html",
-      "$resources_out_dir/toolbox.js",
-      "$resources_out_dir/formatter_worker.js",
-      "$resources_out_dir/heap_snapshot_worker.js",
-      "$resources_out_dir/temp_storage_shared_worker.js",
-      "$resources_out_dir/audits/audits_module.js",
-      "$resources_out_dir/animation/animation_module.js",
-      "$resources_out_dir/components_lazy/components_lazy_module.js",
-      "$resources_out_dir/console/console_module.js",
-      "$resources_out_dir/devices/devices_module.js",
-      "$resources_out_dir/diff/diff_module.js",
-      "$resources_out_dir/elements/elements_module.js",
-      "$resources_out_dir/es_tree/es_tree_module.js",
-      "$resources_out_dir/layers/layers_module.js",
-      "$resources_out_dir/network/network_module.js",
-      "$resources_out_dir/profiler/profiler_module.js",
-      "$resources_out_dir/resources/resources_module.js",
-      "$resources_out_dir/sass/sass_module.js",
-      "$resources_out_dir/security/security_module.js",
-      "$resources_out_dir/settings/settings_module.js",
-      "$resources_out_dir/snippets/snippets_module.js",
-      "$resources_out_dir/source_frame/source_frame_module.js",
-      "$resources_out_dir/sources/sources_module.js",
-      "$resources_out_dir/text_editor/text_editor_module.js",
-      "$resources_out_dir/timeline_model/timeline_model_module.js",
-      "$resources_out_dir/timeline/timeline_module.js",
-      "$resources_out_dir/ui_lazy/ui_lazy_module.js",
-      "$resources_out_dir/devtools_extension_api.js",
-    ]
-    static_files_args = []  # Nothing needed for this
-  }
+  generated_files =
+      generated_entry_files + generated_workers + generated_bundled_modules +
+      [ "$resources_out_dir/devtools_extension_api.js" ]
 
   images_path = "front_end/Images"
 
@@ -975,7 +976,7 @@
   args = rebase_path(generated_files, root_build_dir) +
          rebase_path(generated_files, root_build_dir) +
          rebase_path(devtools_embedder_scripts, root_build_dir) +
-         static_files_args + [ "--relative_path_dirs" ] +
+         [ "--relative_path_dirs" ] +
          rebase_path(relative_path_dirs, root_build_dir) +
          [
            "--images",
@@ -1030,8 +1031,14 @@
          ]
 }
 
-action("build_applications") {
+action("build_release_devtools") {
   script = "scripts/build_applications.py"
+
+  deps = [
+    ":frontend_protocol_sources",
+    ":supported_css_properties",
+  ]
+
   helper_scripts = [
     "scripts/modular_build.py",
     "scripts/concatenate_application_code.py",
@@ -1043,58 +1050,10 @@
              "front_end/toolbox.html",
            ]
 
-  outputs = [
-    "$resources_out_dir/inspector.html",
-    "$resources_out_dir/toolbox.html",
-  ]
+  outputs = generated_entry_files + generated_workers +
+            generated_bundled_modules + generated_remote_modules
 
-  deps = [
-    ":frontend_protocol_sources",
-    ":supported_css_properties",
-  ]
-
-  if (debug_devtools) {
-    deps += [ ":copy_debug_non_modules" ]
-
-    debug_mode = "1"
-  } else {
-    outputs += [
-      "$resources_out_dir/inspector.js",
-      "$resources_out_dir/toolbox.js",
-      "$resources_out_dir/formatter_worker.js",
-      "$resources_out_dir/heap_snapshot_worker.js",
-      "$resources_out_dir/temp_storage_shared_worker.js",
-      "$resources_out_dir/accessibility/accessibility_module.js",
-      "$resources_out_dir/animation/animation_module.js",
-      "$resources_out_dir/audits/audits_module.js",
-      "$resources_out_dir/cm_modes/cm_modes_module.js",
-      "$resources_out_dir/components_lazy/components_lazy_module.js",
-      "$resources_out_dir/console/console_module.js",
-      "$resources_out_dir/devices/devices_module.js",
-      "$resources_out_dir/diff/diff_module.js",
-      "$resources_out_dir/elements/elements_module.js",
-      "$resources_out_dir/emulated_devices/emulated_devices_module.js",
-      "$resources_out_dir/es_tree/es_tree_module.js",
-      "$resources_out_dir/gonzales/gonzales_module.js",
-      "$resources_out_dir/layers/layers_module.js",
-      "$resources_out_dir/network/network_module.js",
-      "$resources_out_dir/profiler/profiler_module.js",
-      "$resources_out_dir/resources/resources_module.js",
-      "$resources_out_dir/sass/sass_module.js",
-      "$resources_out_dir/screencast/screencast_module.js",
-      "$resources_out_dir/security/security_module.js",
-      "$resources_out_dir/settings/settings_module.js",
-      "$resources_out_dir/snippets/snippets_module.js",
-      "$resources_out_dir/source_frame/source_frame_module.js",
-      "$resources_out_dir/sources/sources_module.js",
-      "$resources_out_dir/text_editor/text_editor_module.js",
-      "$resources_out_dir/timeline_model/timeline_model_module.js",
-      "$resources_out_dir/timeline/timeline_module.js",
-      "$resources_out_dir/ui_lazy/ui_lazy_module.js",
-    ]
-
-    debug_mode = "0"
-  }
+  debug_mode = "0"
 
   args = [
     "inspector",
@@ -1112,11 +1071,49 @@
 }
 
 if (debug_devtools) {
-  # Debug: copy non-module directories and core into resources_out_dir as-is.
-  group("copy_debug_non_modules") {
+  resources_out_debug_dir = "$root_out_dir/resources/inspector/debug"
+
+  action("build_debug_devtools") {
+    script = "scripts/build_applications.py"
+
+    deps = [
+      ":copy_debug_files",
+    ]
+
+    inputs = all_devtools_files + [
+               "front_end/inspector.html",
+               "front_end/toolbox.html",
+             ]
+
+    outputs = [
+      "$resources_out_debug_dir/inspector.html",
+      "$resources_out_debug_dir/toolbox.html",
+    ]
+
+    debug_mode = "1"
+
+    args = [
+      "inspector",
+      "toolbox",
+      "formatter_worker",
+      "heap_snapshot_worker",
+      "temp_storage_shared_worker",
+      "--input_path",
+      rebase_path("front_end", root_build_dir),
+      "--output_path",
+      rebase_path(resources_out_debug_dir, root_build_dir),
+      "--debug",
+      debug_mode,
+    ]
+  }
+
+  group("copy_debug_files") {
     public_deps = [
       ":copy_acorn_js_files",
       ":copy_codemirror_files",
+      ":copy_emulated_devices_images_debug",
+      ":copy_generated_scripts",
+      ":copy_inspector_images_debug",
       ":copy_runtime_core",
     ]
   }
@@ -1124,21 +1121,45 @@
   copy("copy_runtime_core") {
     sources = devtools_core_base_files
     outputs = [
-      "$resources_out_dir//{{source_file_part}}",
+      "$resources_out_debug_dir/{{source_file_part}}",
     ]
   }
 
   copy("copy_acorn_js_files") {
     sources = devtools_acorn_files
     outputs = [
-      "$resources_out_dir/acorn/{{source_file_part}}",
+      "$resources_out_debug_dir/acorn/{{source_file_part}}",
     ]
   }
 
   copy("copy_codemirror_files") {
     sources = devtools_cm_js_files + devtools_cm_css_files
     outputs = [
-      "$resources_out_dir/cm/{{source_file_part}}",
+      "$resources_out_debug_dir/cm/{{source_file_part}}",
+    ]
+  }
+
+  copy("copy_generated_scripts") {
+    deps = [
+      ":frontend_protocol_sources",
+      ":supported_css_properties",
+    ]
+    sources = generated_scripts
+    outputs = [
+      "$resources_out_debug_dir/{{source_file_part}}",
+    ]
+  }
+  copy("copy_inspector_images_debug") {
+    sources = devtools_image_files
+    outputs = [
+      "$resources_out_debug_dir/Images/{{source_file_part}}",
+    ]
+  }
+
+  copy("copy_emulated_devices_images_debug") {
+    sources = devtools_emulated_devices_images
+    outputs = [
+      "$resources_out_debug_dir/emulated_devices/{{source_file_part}}",
     ]
   }
 }
diff --git a/third_party/WebKit/Source/devtools/front_end/Runtime.js b/third_party/WebKit/Source/devtools/front_end/Runtime.js
index c0ff030..909bbc5 100644
--- a/third_party/WebKit/Source/devtools/front_end/Runtime.js
+++ b/third_party/WebKit/Source/devtools/front_end/Runtime.js
@@ -409,6 +409,8 @@
     useTestBase: function()
     {
         Runtime._remoteBase = "http://localhost:8000/inspector-sources/";
+        if (Runtime.queryParam("debugFrontend"))
+            Runtime._remoteBase += "debug/";
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/common/Geometry.js b/third_party/WebKit/Source/devtools/front_end/common/Geometry.js
index 716b9ea..18359b8 100644
--- a/third_party/WebKit/Source/devtools/front_end/common/Geometry.js
+++ b/third_party/WebKit/Source/devtools/front_end/common/Geometry.js
@@ -90,6 +90,15 @@
     },
 
     /**
+     * @param {number} scalar
+     * @return {!WebInspector.Geometry.Point}
+     */
+    scale: function(scalar)
+    {
+        return new WebInspector.Geometry.Point(this.x * scalar, this.y * scalar);
+    },
+
+    /**
      * @override
      * @return {string}
      */
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/module.json b/third_party/WebKit/Source/devtools/front_end/elements/module.json
index 4dbbc3d3..395d7a8 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/elements/module.json
@@ -214,9 +214,7 @@
     ],
     "scripts": [
         "InspectElementModeController.js",
-        "BezierUI.js",
         "ColorSwatchPopoverIcon.js",
-        "BezierEditor.js",
         "ComputedStyleModel.js",
         "ElementsBreadcrumbs.js",
         "ElementsSidebarPane.js",
@@ -235,7 +233,6 @@
         "ElementsTreeElementHighlighter.js"
     ],
     "resources": [
-        "bezierEditor.css",
         "breadcrumbs.css",
         "computedStyleSidebarPane.css",
         "elementsPanel.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/formatter_worker.json b/third_party/WebKit/Source/devtools/front_end/formatter_worker.json
index 272184c..a9fd165 100644
--- a/third_party/WebKit/Source/devtools/front_end/formatter_worker.json
+++ b/third_party/WebKit/Source/devtools/front_end/formatter_worker.json
@@ -1,7 +1,7 @@
 {
     "modules": [
         { "name": "formatter_worker", "type": "autostart" },
-        { "name": "gonzales", "type": "remoteInRelease" }
+        { "name": "gonzales", "type": "remote" }
     ],
 
     "has_html": false
diff --git a/third_party/WebKit/Source/devtools/front_end/inspector.json b/third_party/WebKit/Source/devtools/front_end/inspector.json
index 3c73ffa..de8e0f6 100644
--- a/third_party/WebKit/Source/devtools/front_end/inspector.json
+++ b/third_party/WebKit/Source/devtools/front_end/inspector.json
@@ -26,17 +26,17 @@
         { "name": "console" },
         { "name": "source_frame" },
         { "name": "text_editor" },
-        { "name": "cm_modes", "type": "remoteInRelease" },
+        { "name": "cm_modes", "type": "remote" },
         { "name": "settings" },
         { "name": "layers", "condition": "!v8only" },
         { "name": "snippets" },
         { "name": "diff" },
         { "name": "sass", "condition": "!v8only" },
-        { "name": "accessibility", "condition": "!v8only", "type": "remoteInRelease" },
+        { "name": "accessibility", "condition": "!v8only", "type": "remote" },
         { "name": "animation", "condition": "!v8only" },
         { "name": "es_tree" },
-        { "name": "screencast", "condition": "remoteFrontend", "type": "remoteInRelease" },
-        { "name": "emulated_devices", "condition": "!v8only" , "type": "remoteInRelease" }
+        { "name": "screencast", "condition": "remoteFrontend", "type": "remote" },
+        { "name": "emulated_devices", "condition": "!v8only" , "type": "remote" }
     ],
 
     "has_html": true
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/BezierEditor.js b/third_party/WebKit/Source/devtools/front_end/ui/BezierEditor.js
similarity index 99%
rename from third_party/WebKit/Source/devtools/front_end/elements/BezierEditor.js
rename to third_party/WebKit/Source/devtools/front_end/ui/BezierEditor.js
index 6b0a1bc2..68a56aa 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/BezierEditor.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/BezierEditor.js
@@ -9,7 +9,7 @@
 WebInspector.BezierEditor = function()
 {
     WebInspector.VBox.call(this, true);
-    this.registerRequiredCSS("elements/bezierEditor.css");
+    this.registerRequiredCSS("ui/bezierEditor.css");
     this.contentElement.tabIndex = 0;
 
     // Preview UI
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js b/third_party/WebKit/Source/devtools/front_end/ui/BezierUI.js
similarity index 100%
rename from third_party/WebKit/Source/devtools/front_end/elements/BezierUI.js
rename to third_party/WebKit/Source/devtools/front_end/ui/BezierUI.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js b/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
index 74a2337..64692709 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/CSSShadowEditor.js
@@ -21,20 +21,27 @@
     this._insetButton.textContent = WebInspector.UIString("Inset");
     this._insetButton.addEventListener("click", this._onButtonClick.bind(this), false);
 
-    var inputs;
-    inputs = this._createSliderField(WebInspector.UIString("X offset"), true);
-    this._xInput = inputs.textInput;
-    this._xSlider = inputs.rangeInput;
-    inputs = this._createSliderField(WebInspector.UIString("Y offset"), true);
-    this._yInput = inputs.textInput;
-    this._ySlider = inputs.rangeInput;
-    inputs = this._createSliderField(WebInspector.UIString("Blur"), false);
-    this._blurInput = inputs.textInput;
-    this._blurSlider = inputs.rangeInput;
-    inputs = this._createSliderField(WebInspector.UIString("Spread"), false);
-    this._spreadInput = inputs.textInput;
-    this._spreadSlider = inputs.rangeInput;
-    this._spreadField = inputs.field;
+    var xField = this.contentElement.createChild("div", "shadow-editor-field");
+    this._xInput = this._createTextInput(xField, WebInspector.UIString("X offset"));
+    var yField = this.contentElement.createChild("div", "shadow-editor-field");
+    this._yInput = this._createTextInput(yField, WebInspector.UIString("Y offset"));
+    this._xySlider = xField.createChild("canvas", "shadow-editor-2D-slider");
+    this._xySlider.width = WebInspector.CSSShadowEditor.canvasSize;
+    this._xySlider.height = WebInspector.CSSShadowEditor.canvasSize;
+    this._xySlider.tabIndex = -1;
+    this._halfCanvasSize = WebInspector.CSSShadowEditor.canvasSize / 2;
+    this._innerCanvasSize = this._halfCanvasSize - WebInspector.CSSShadowEditor.sliderThumbRadius;
+    WebInspector.installDragHandle(this._xySlider, this._dragStart.bind(this), this._dragMove.bind(this), null, "default");
+    this._xySlider.addEventListener("keydown", this._onCanvasArrowKey.bind(this), false);
+    this._xySlider.addEventListener("blur", this._onCanvasBlur.bind(this), false);
+
+    var blurField = this.contentElement.createChild("div", "shadow-editor-blur-field");
+    this._blurInput = this._createTextInput(blurField, WebInspector.UIString("Blur"));
+    this._blurSlider = this._createSlider(blurField);
+
+    this._spreadField = this.contentElement.createChild("div", "shadow-editor-field");
+    this._spreadInput = this._createTextInput(this._spreadField, WebInspector.UIString("Spread"));
+    this._spreadSlider = this._createSlider(this._spreadField);
 }
 
 /** @enum {symbol} */
@@ -43,19 +50,22 @@
 }
 
 /** @type {number} */
-WebInspector.CSSShadowEditor.maxRange = 40;
+WebInspector.CSSShadowEditor.maxRange = 20;
 /** @type {string} */
 WebInspector.CSSShadowEditor.defaultUnit = "px";
+/** @type {number} */
+WebInspector.CSSShadowEditor.sliderThumbRadius = 6;
+/** @type {number} */
+WebInspector.CSSShadowEditor.canvasSize = 88;
 
 WebInspector.CSSShadowEditor.prototype = {
     /**
+     * @param {!Element} field
      * @param {string} propertyName
-     * @param {boolean} negativeAllowed
-     * @return {{textInput: !Element, rangeInput: !Element, field: !Element}}
+     * @return {!Element}
      */
-    _createSliderField: function(propertyName, negativeAllowed)
+    _createTextInput: function(field, propertyName)
     {
-        var field = this.contentElement.createChild("div", "shadow-editor-field");
         var label = field.createChild("label", "shadow-editor-label");
         label.textContent = propertyName;
         label.setAttribute("for", propertyName);
@@ -66,11 +76,19 @@
         textInput.addEventListener("mousewheel", this._handleValueModification.bind(this), false);
         textInput.addEventListener("input", this._onTextInput.bind(this), false);
         textInput.addEventListener("blur", this._onTextBlur.bind(this), false);
-        var halfRange = WebInspector.CSSShadowEditor.maxRange / 2;
-        var slider = negativeAllowed ? createSliderLabel(-halfRange, halfRange) : createSliderLabel(0, WebInspector.CSSShadowEditor.maxRange);
+        return textInput;
+    },
+
+    /**
+     * @param {!Element} field
+     * @return {!Element}
+     */
+    _createSlider: function(field)
+    {
+        var slider = createSliderLabel(0, WebInspector.CSSShadowEditor.maxRange, -1);
         slider.addEventListener("input", this._onSliderInput.bind(this), false);
         field.appendChild(slider);
-        return {field: field, textInput: textInput, rangeInput: slider};
+        return slider;
     },
 
     /**
@@ -99,10 +117,9 @@
         this._yInput.value = this._model.offsetY().asCSSText();
         this._blurInput.value = this._model.blurRadius().asCSSText();
         this._spreadInput.value = this._model.spreadRadius().asCSSText();
-        this._xSlider.value = this._model.offsetX().amount;
-        this._ySlider.value = this._model.offsetY().amount;
         this._blurSlider.value = this._model.blurRadius().amount;
         this._spreadSlider.value = this._model.spreadRadius().amount;
+        this._updateCanvas(false);
     },
 
     _updateButtons: function()
@@ -112,6 +129,50 @@
     },
 
     /**
+     * @param {boolean} drawFocus
+     */
+    _updateCanvas: function(drawFocus)
+    {
+        var context = this._xySlider.getContext("2d");
+        context.clearRect(0, 0, this._xySlider.width, this._xySlider.height);
+
+        // Draw dashed axes.
+        context.save();
+        context.setLineDash([1, 1]);
+        context.strokeStyle = "rgba(0, 0, 0, 0.2)";
+        context.beginPath();
+        context.moveTo(this._halfCanvasSize, 0);
+        context.lineTo(this._halfCanvasSize, WebInspector.CSSShadowEditor.canvasSize);
+        context.moveTo(0, this._halfCanvasSize);
+        context.lineTo(WebInspector.CSSShadowEditor.canvasSize, this._halfCanvasSize);
+        context.stroke();
+        context.restore();
+
+        var thumbPoint = this._sliderThumbPosition();
+        // Draw 2D slider line.
+        context.save();
+        context.translate(this._halfCanvasSize, this._halfCanvasSize);
+        context.lineWidth = 2;
+        context.strokeStyle = "rgba(0, 0, 0, 0.3)";
+        context.beginPath();
+        context.moveTo(0, 0);
+        context.lineTo(thumbPoint.x, thumbPoint.y);
+        context.stroke();
+        // Draw 2D slider thumb.
+        if (drawFocus) {
+            context.beginPath();
+            context.fillStyle = "rgba(66, 133, 244, 0.4)";
+            context.arc(thumbPoint.x, thumbPoint.y, WebInspector.CSSShadowEditor.sliderThumbRadius + 2, 0, 2 * Math.PI);
+            context.fill();
+        }
+        context.beginPath()
+        context.fillStyle = "#4285F4";
+        context.arc(thumbPoint.x, thumbPoint.y, WebInspector.CSSShadowEditor.sliderThumbRadius, 0, 2 * Math.PI);
+        context.fill();
+        context.restore();
+    },
+
+    /**
      * @param {!Event} event
      */
     _onButtonClick: function(event)
@@ -163,16 +224,16 @@
     _onTextInput: function(event)
     {
         this._changedElement = event.currentTarget;
-        this._changedElement.classList.toggle("invalid", false);
+        this._changedElement.classList.remove("invalid");
         var length = WebInspector.CSSLength.parse(event.currentTarget.value);
         if (!length || event.currentTarget === this._blurInput && length.amount < 0)
             return;
         if (event.currentTarget === this._xInput) {
             this._model.setOffsetX(length);
-            this._xSlider.value = length.amount;
+            this._updateCanvas(false);
         } else if (event.currentTarget === this._yInput) {
             this._model.setOffsetY(length);
-            this._ySlider.value = length.amount;
+            this._updateCanvas(false);
         } else if (event.currentTarget === this._blurInput) {
             this._model.setBlurRadius(length);
             this._blurSlider.value = length.amount;
@@ -187,7 +248,7 @@
     {
         if (!this._changedElement)
             return;
-        var length = !this._changedElement.value ? WebInspector.CSSLength.zero() : WebInspector.CSSLength.parse(this._changedElement.value);
+        var length = !this._changedElement.value.trim() ? WebInspector.CSSLength.zero() : WebInspector.CSSLength.parse(this._changedElement.value);
         if (!length)
             length = WebInspector.CSSLength.parse(this._changedElement.value + WebInspector.CSSShadowEditor.defaultUnit);
         if (!length) {
@@ -198,11 +259,11 @@
         if (this._changedElement === this._xInput) {
             this._model.setOffsetX(length);
             this._xInput.value = length.asCSSText();
-            this._xSlider.value = length.amount;
+            this._updateCanvas(false);
         } else if (this._changedElement === this._yInput) {
             this._model.setOffsetY(length);
             this._yInput.value = length.asCSSText();
-            this._ySlider.value = length.amount;
+            this._updateCanvas(false);
         } else if (this._changedElement === this._blurInput) {
             if (length.amount < 0)
                 length = WebInspector.CSSLength.zero();
@@ -223,25 +284,121 @@
      */
     _onSliderInput: function(event)
     {
-        if (event.currentTarget === this._xSlider) {
-            this._model.setOffsetX(new WebInspector.CSSLength(this._xSlider.value, this._model.offsetX().unit || WebInspector.CSSShadowEditor.defaultUnit));
-            this._xInput.value = this._model.offsetX().asCSSText();
-            this._xInput.classList.toggle("invalid", false);
-        } else if (event.currentTarget === this._ySlider) {
-            this._model.setOffsetY(new WebInspector.CSSLength(this._ySlider.value, this._model.offsetY().unit || WebInspector.CSSShadowEditor.defaultUnit));
-            this._yInput.value = this._model.offsetY().asCSSText();
-            this._yInput.classList.toggle("invalid", false);
-        } else if (event.currentTarget === this._blurSlider) {
+        if (event.currentTarget === this._blurSlider) {
             this._model.setBlurRadius(new WebInspector.CSSLength(this._blurSlider.value, this._model.blurRadius().unit || WebInspector.CSSShadowEditor.defaultUnit));
             this._blurInput.value = this._model.blurRadius().asCSSText();
-            this._blurInput.classList.toggle("invalid", false);
+            this._blurInput.classList.remove("invalid");
         } else if (event.currentTarget === this._spreadSlider) {
             this._model.setSpreadRadius(new WebInspector.CSSLength(this._spreadSlider.value, this._model.spreadRadius().unit || WebInspector.CSSShadowEditor.defaultUnit));
             this._spreadInput.value = this._model.spreadRadius().asCSSText();
-            this._spreadInput.classList.toggle("invalid", false);
+            this._spreadInput.classList.remove("invalid");
         }
         this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
     },
 
+    /**
+     * @param {!Event} event
+     * @return {boolean}
+     */
+    _dragStart: function(event)
+    {
+        this._xySlider.focus();
+        this._updateCanvas(true);
+        this._canvasOrigin = new WebInspector.Geometry.Point(this._xySlider.totalOffsetLeft() + this._halfCanvasSize, this._xySlider.totalOffsetTop() + this._halfCanvasSize);
+        var clickedPoint = new WebInspector.Geometry.Point(event.x - this._canvasOrigin.x, event.y - this._canvasOrigin.y);
+        var thumbPoint = this._sliderThumbPosition();
+        if (clickedPoint.distanceTo(thumbPoint) >= WebInspector.CSSShadowEditor.sliderThumbRadius)
+            this._dragMove(event);
+        return true;
+    },
+
+    /**
+     * @param {!Event} event
+     */
+    _dragMove: function(event)
+    {
+        var point = new WebInspector.Geometry.Point(event.x - this._canvasOrigin.x, event.y - this._canvasOrigin.y);
+        var constrainedPoint = this._constrainPoint(point, this._innerCanvasSize);
+        var newX = Math.round((constrainedPoint.x / this._innerCanvasSize) * WebInspector.CSSShadowEditor.maxRange);
+        var newY = Math.round((constrainedPoint.y / this._innerCanvasSize) * WebInspector.CSSShadowEditor.maxRange);
+        this._model.setOffsetX(new WebInspector.CSSLength(newX, this._model.offsetX().unit || WebInspector.CSSShadowEditor.defaultUnit));
+        this._model.setOffsetY(new WebInspector.CSSLength(newY, this._model.offsetY().unit || WebInspector.CSSShadowEditor.defaultUnit));
+        this._xInput.value = this._model.offsetX().asCSSText();
+        this._yInput.value = this._model.offsetY().asCSSText();
+        this._xInput.classList.remove("invalid");
+        this._yInput.classList.remove("invalid");
+        this._updateCanvas(true);
+        this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
+    },
+
+    _onCanvasBlur: function()
+    {
+        this._updateCanvas(false);
+    },
+
+    /**
+     * @param {!Event} event
+     */
+    _onCanvasArrowKey: function(event)
+    {
+        var shiftX = 0;
+        var shiftY = 0;
+        if (event.key === "ArrowRight")
+            shiftX = 1;
+        else if (event.key === "ArrowLeft")
+            shiftX = -1;
+        else if (event.key === "ArrowUp")
+            shiftY = -1;
+        else if (event.key === "ArrowDown")
+            shiftY = 1;
+
+        if (!shiftX && !shiftY)
+            return;
+        event.consume(true);
+
+        if (shiftX) {
+            var offsetX = this._model.offsetX();
+            var newAmount = Number.constrain(offsetX.amount + shiftX, -WebInspector.CSSShadowEditor.maxRange, WebInspector.CSSShadowEditor.maxRange);
+            if (newAmount === offsetX.amount)
+                return;
+            this._model.setOffsetX(new WebInspector.CSSLength(newAmount, offsetX.unit || WebInspector.CSSShadowEditor.defaultUnit));
+            this._xInput.value = this._model.offsetX().asCSSText();
+            this._xInput.classList.remove("invalid");
+        }
+        if (shiftY) {
+            var offsetY = this._model.offsetY();
+            var newAmount = Number.constrain(offsetY.amount + shiftY, -WebInspector.CSSShadowEditor.maxRange, WebInspector.CSSShadowEditor.maxRange);
+            if (newAmount === offsetY.amount)
+                return;
+            this._model.setOffsetY(new WebInspector.CSSLength(newAmount, offsetY.unit || WebInspector.CSSShadowEditor.defaultUnit));
+            this._yInput.value = this._model.offsetY().asCSSText();
+            this._yInput.classList.remove("invalid");
+        }
+        this._updateCanvas(true);
+        this.dispatchEventToListeners(WebInspector.CSSShadowEditor.Events.ShadowChanged, this._model);
+    },
+
+    /**
+     * @param {!WebInspector.Geometry.Point} point
+     * @param {number} max
+     * @return {!WebInspector.Geometry.Point}
+     */
+    _constrainPoint: function(point, max)
+    {
+        if (Math.abs(point.x) <= max && Math.abs(point.y) <= max)
+            return new WebInspector.Geometry.Point(point.x, point.y);
+        return point.scale(max / Math.max(Math.abs(point.x), Math.abs(point.y)));
+    },
+
+    /**
+     * @return {!WebInspector.Geometry.Point}
+     */
+    _sliderThumbPosition: function()
+    {
+        var x = (this._model.offsetX().amount / WebInspector.CSSShadowEditor.maxRange) * this._innerCanvasSize;
+        var y = (this._model.offsetY().amount / WebInspector.CSSShadowEditor.maxRange) * this._innerCanvasSize;
+        return this._constrainPoint(new WebInspector.Geometry.Point(x, y), this._innerCanvasSize);
+    },
+
     __proto__: WebInspector.VBox.prototype
-}
\ No newline at end of file
+}
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
index 7cc889b3..7f1f374 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
@@ -1377,13 +1377,15 @@
  * @return {!Element}
  * @param {number} min
  * @param {number} max
+ * @param {number} tabIndex
  */
-function createSliderLabel(min, max)
+function createSliderLabel(min, max, tabIndex)
 {
     var element = createElement("label", "dt-slider");
     element.sliderElement.min = min;
     element.sliderElement.max = max;
     element.sliderElement.step = 1;
+    element.sliderElement.tabIndex = tabIndex;
     return element;
 }
 
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/bezierEditor.css b/third_party/WebKit/Source/devtools/front_end/ui/bezierEditor.css
similarity index 100%
rename from third_party/WebKit/Source/devtools/front_end/elements/bezierEditor.css
rename to third_party/WebKit/Source/devtools/front_end/ui/bezierEditor.css
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/cssShadowEditor.css b/third_party/WebKit/Source/devtools/front_end/ui/cssShadowEditor.css
index e6ad680f..8f1c777 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/cssShadowEditor.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/cssShadowEditor.css
@@ -10,10 +10,25 @@
 }
 
 .shadow-editor-field {
+    height: 24px;
     margin-top: 8px;
     font-size: 12px;
 }
 
+.shadow-editor-blur-field {
+    height: 24px;
+    margin-top: 40px;
+    font-size: 12px;
+}
+
+.shadow-editor-2D-slider {
+    position: absolute;
+    height: 88px;
+    width: 88px;
+    border: 1px solid rgba(0, 0, 0, 0.14);
+    border-radius: 2px;
+}
+
 .shadow-editor-label {
     display: inline-block;
     width: 52px;
@@ -69,7 +84,6 @@
     line-height: 16px;
     border: 1px solid rgba(0, 0, 0, 0.14);
     border-radius: 2px;
-    border-color: rgba(0, 0, 0, 0.14);
     background-color: #ffffff;
     color: #333;
     text-align: right;
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/module.json b/third_party/WebKit/Source/devtools/front_end/ui/module.json
index d474f09..2ae10ed7 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/ui/module.json
@@ -11,6 +11,8 @@
         "InspectorView.js",
         "ActionRegistry.js",
         "ShortcutRegistry.js",
+        "BezierEditor.js",
+        "BezierUI.js",
         "ColorSwatch.js",
         "Context.js",
         "ContextMenu.js",
@@ -51,6 +53,7 @@
         "ZoomManager.js"
     ],
     "resources": [
+        "bezierEditor.css",
         "bezierSwatch.css",
         "checkboxTextLabel.css",
         "closeButton.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/slider.css b/third_party/WebKit/Source/devtools/front_end/ui/slider.css
index 29f40327..b6d4d3a 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/slider.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/slider.css
@@ -8,7 +8,7 @@
     -webkit-appearance: none;
     margin: 0;
     padding: 0;
-    height: 12px;
+    height: 10px;
     width: 88px;
     outline: none;
     background: none;
@@ -41,4 +41,4 @@
 
 .dt-range-input:disabled::-webkit-slider-thumb {
     background-color: #bdbdbd;
-}
\ No newline at end of file
+}
diff --git a/third_party/WebKit/Source/devtools/scripts/concatenate_application_code.py b/third_party/WebKit/Source/devtools/scripts/concatenate_application_code.py
index 8831e6123..e6984e0 100755
--- a/third_party/WebKit/Source/devtools/scripts/concatenate_application_code.py
+++ b/third_party/WebKit/Source/devtools/scripts/concatenate_application_code.py
@@ -100,9 +100,6 @@
         AppBuilder.__init__(self, application_name, descriptors, application_dir, output_dir)
 
     def build_app(self):
-        for module in self.descriptors.application.values():
-            if 'type' in module and module['type'] == 'remoteInRelease':
-                module['type'] = 'remote'
         if self.descriptors.has_html:
             self._build_html()
         self._build_app_script()
diff --git a/third_party/WebKit/Source/devtools/scripts/run_inspector_tests.sh b/third_party/WebKit/Source/devtools/scripts/run_inspector_tests.sh
new file mode 100755
index 0000000..093ffe24
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/scripts/run_inspector_tests.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+# Copyright (c) 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.
+
+# Get the full directory path of this script regardless of where it's run from
+# Based on: http://stackoverflow.com/questions/59895/can-a-bash-script-tell-which-directory-it-is-stored-in
+SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd)"
+
+CHROMIUM_ROOT_PATH=${SCRIPT_PATH}"/../../../../.."
+OUT_PATH=${CHROMIUM_ROOT_PATH}"/out/Release"
+RUN_LAYOUT_TEST_PATH=${CHROMIUM_ROOT_PATH}"/blink/tools/run_layout_tests.py"
+
+INSPECTOR_TEST_SUITES="inspector inspector-protocol inspector-enabled http/tests/inspector"
+
+ninja -C ${OUT_PATH} -j 1000 chrome blink_tests
+${RUN_LAYOUT_TEST_PATH} ${INSPECTOR_TEST_SUITES} --child-processes=16 "$@"
diff --git a/third_party/WebKit/Source/modules/EventTargetModulesFactory.in b/third_party/WebKit/Source/modules/EventTargetModulesFactory.in
index 420fd1d..5ba198df 100644
--- a/third_party/WebKit/Source/modules/EventTargetModulesFactory.in
+++ b/third_party/WebKit/Source/modules/EventTargetModulesFactory.in
@@ -29,7 +29,7 @@
 modules/permissions/PermissionStatus
 modules/presentation/PresentationAvailability
 modules/presentation/PresentationConnection
-modules/presentation/PresentationReceiver
+modules/presentation/PresentationConnectionList
 modules/presentation/PresentationRequest
 modules/remoteplayback/RemotePlayback
 modules/remoteplayback/RemotePlaybackAvailability
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi
index 487a28a..6213a90 100644
--- a/third_party/WebKit/Source/modules/modules.gypi
+++ b/third_party/WebKit/Source/modules/modules.gypi
@@ -173,6 +173,7 @@
       'presentation/PresentationConnection.idl',
       'presentation/PresentationConnectionAvailableEvent.idl',
       'presentation/PresentationConnectionCloseEvent.idl',
+      'presentation/PresentationConnectionList.idl',
       'presentation/PresentationReceiver.idl',
       'presentation/PresentationRequest.idl',
       'push_messaging/PushEvent.idl',
@@ -1473,6 +1474,8 @@
       'presentation/PresentationConnectionAvailableEvent.h',
       'presentation/PresentationConnectionCloseEvent.cpp',
       'presentation/PresentationConnectionCloseEvent.h',
+      'presentation/PresentationConnectionList.cpp',
+      'presentation/PresentationConnectionList.h',
       'presentation/PresentationController.cpp',
       'presentation/PresentationController.h',
       'presentation/PresentationError.cpp',
@@ -1984,6 +1987,10 @@
       'websockets/WebSocketChannelClient.h',
       'websockets/WebSocketFrame.cpp',
       'websockets/WebSocketFrame.h',
+      'websockets/WebSocketHandle.h',
+      'websockets/WebSocketHandleImpl.cpp',
+      'websockets/WebSocketHandleImpl.h',
+      'websockets/WebSocketHandleClient.h',
       'websockets/WorkerWebSocketChannel.cpp',
       'websockets/WorkerWebSocketChannel.h',
       'webusb/NavigatorUSB.cpp',
diff --git a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
index 69b18f4..2bc713b 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentRequestDetailsTest.cpp
@@ -136,83 +136,79 @@
     testing::Values(
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataId, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataAmount, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataValue, PaymentTestRemoveKey, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestRemoveKey, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataLabel, PaymentTestRemoveKey, "", true, V8TypeError)));
 
 INSTANTIATE_TEST_CASE_P(EmptyData,
     PaymentRequestDetailsTest,
     testing::Values(
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailItem, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataId, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataValue, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
         DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataLabel, PaymentTestOverwriteValue, "", true, V8TypeError)));
 
 INSTANTIATE_TEST_CASE_P(ValidCurrencyCodeFormat,
     PaymentRequestDetailsTest,
     testing::Values(
         DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD")));
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1"),
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US"),
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD0"),
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd"),
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "ANYSTRING"),
+        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, ""),
 
-INSTANTIATE_TEST_CASE_P(InvalidCurrencyCodeFormat,
-    PaymentRequestDetailsTest,
-    testing::Values(
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USDO", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USDO", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USDO", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USDO", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USDO", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd", true, V8TypeError),
-        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "", true, V8TypeError)));
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD0"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "ANYSTRING"),
+        DetailsTestCase(PaymentTestDetailItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, ""),
+
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD0"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "ANYSTRING"),
+        DetailsTestCase(PaymentTestDetailShippingOption, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, ""),
+
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD0"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "ANYSTRING"),
+        DetailsTestCase(PaymentTestDetailModifierTotal, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, ""),
+
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US1"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "US"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "USD0"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "usd"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "ANYSTRING"),
+        DetailsTestCase(PaymentTestDetailModifierItem, PaymentTestDataCurrencyCode, PaymentTestOverwriteValue, "")));
+
 
 INSTANTIATE_TEST_CASE_P(ValidValueFormat,
     PaymentRequestDetailsTest,
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
index ca7e0d0..6a1fbc0 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.cpp
@@ -9,13 +9,16 @@
 
 namespace blink {
 
+// We limit the maximum length of the currency code to 2048 bytes for security reasons.
+static const int maxCurrencyCodeLength = 2048;
+
 bool PaymentsValidators::isValidCurrencyCodeFormat(const String& code, String* optionalErrorMessage)
 {
-    if (ScriptRegexp("^[A-Z]{3}$", TextCaseSensitive).match(code) == 0)
+    if (code.length() <= maxCurrencyCodeLength)
         return true;
 
     if (optionalErrorMessage)
-        *optionalErrorMessage = "'" + code + "' is not a valid ISO 4217 currency code, should be 3 upper case letters [A-Z]";
+        *optionalErrorMessage = "The currency code should be at most 2048 characters long";
 
     return false;
 }
@@ -26,7 +29,7 @@
         return true;
 
     if (optionalErrorMessage)
-        *optionalErrorMessage = "'" + amount + "' is not a valid ISO 20022 CurrencyAnd30Amount";
+        *optionalErrorMessage = "'" + amount + "' is not a valid amount format";
 
     return false;
 }
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
index 2ef1e37..6ee2499 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidators.h
@@ -16,7 +16,8 @@
     STATIC_ONLY(PaymentsValidators);
 
 public:
-    // Returns true if |code| is a valid ISO 4217 currency code.
+    // The most common identifiers are three-letter alphabetic codes as defined by [ISO4217] (for example, "USD" for US Dollars)
+    // however any string of at most 2048 characters is considered valid. Returns false if currency |code| is too long (greater than 2048).
     static bool isValidCurrencyCodeFormat(const String& code, String* optionalErrorMessage);
 
     // Returns true if |amount| is a valid currency code as defined in ISO 20022 CurrencyAnd30Amount.
diff --git a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
index bf5b982..4084833 100644
--- a/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
+++ b/third_party/WebKit/Source/modules/payments/PaymentsValidatorsTest.cpp
@@ -32,6 +32,24 @@
 class PaymentsCurrencyValidatorTest : public testing::TestWithParam<TestCase> {
 };
 
+const char* longString2048()
+{
+    static char longString[2049];
+    for (int i = 0; i < 2048; i++)
+        longString[i] = 'a';
+    longString[2048] = '\0';
+    return longString;
+}
+
+const char* longString2049()
+{
+    static char longString[2050];
+    for (int i = 0; i < 2049; i++)
+        longString[i] = 'a';
+    longString[2049] = '\0';
+    return longString;
+}
+
 TEST_P(PaymentsCurrencyValidatorTest, IsValidCurrencyCodeFormat)
 {
     String errorMessage;
@@ -44,13 +62,16 @@
 INSTANTIATE_TEST_CASE_P(CurrencyCodes,
     PaymentsCurrencyValidatorTest,
     testing::Values(
+        // Any string of at most 2048 characters can be a valid currency code
         TestCase("USD", true),
-        // Invalid currency code formats
-        TestCase("US1", false),
-        TestCase("US", false),
-        TestCase("USDO", false),
-        TestCase("usd", false),
-        TestCase("", false)));
+        TestCase("US1", true),
+        TestCase("US", true),
+        TestCase("USDO", true),
+        TestCase("usd", true),
+        TestCase("ANYSTRING", true),
+        TestCase("", true),
+        TestCase(longString2048(), true),
+        TestCase(longString2049(), false)));
 
 class PaymentsAmountValidatorTest : public testing::TestWithParam<TestCase> {
 };
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp
new file mode 100644
index 0000000..4a754dd
--- /dev/null
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp
@@ -0,0 +1,38 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/presentation/PresentationConnectionList.h"
+
+#include "modules/EventTargetModules.h"
+
+namespace blink {
+
+PresentationConnectionList::PresentationConnectionList(ExecutionContext* context)
+    : ContextLifecycleObserver(context)
+{
+}
+
+const AtomicString& PresentationConnectionList::interfaceName() const
+{
+    return EventTargetNames::PresentationConnectionList;
+}
+
+ExecutionContext* PresentationConnectionList::getExecutionContext() const
+{
+    return ContextLifecycleObserver::getExecutionContext();
+}
+
+const HeapVector<Member<PresentationConnection>>& PresentationConnectionList::connections() const
+{
+    return m_connections;
+}
+
+DEFINE_TRACE(PresentationConnectionList)
+{
+    visitor->trace(m_connections);
+    ContextLifecycleObserver::trace(visitor);
+    EventTargetWithInlineData::trace(visitor);
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.h b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.h
new file mode 100644
index 0000000..71b6c3f
--- /dev/null
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.h
@@ -0,0 +1,43 @@
+// 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 PresentationConnectionList_h
+#define PresentationConnectionList_h
+
+#include "core/dom/ContextLifecycleObserver.h"
+#include "core/events/EventTarget.h"
+#include "modules/presentation/PresentationConnection.h"
+#include "platform/heap/Handle.h"
+#include "platform/heap/Heap.h"
+
+namespace blink {
+
+// Implements the PresentationConnectionList interface from the Presentation API from
+// which represents set of presentation connections in the set of
+// presentation controllers.
+class PresentationConnectionList final
+    : public EventTargetWithInlineData
+    , public ContextLifecycleObserver {
+    USING_GARBAGE_COLLECTED_MIXIN(PresentationConnectionList);
+    DEFINE_WRAPPERTYPEINFO();
+public:
+    explicit PresentationConnectionList(ExecutionContext*);
+    ~PresentationConnectionList() = default;
+
+    // EventTarget implementation.
+    const AtomicString& interfaceName() const override;
+    ExecutionContext* getExecutionContext() const override;
+
+    const HeapVector<Member<PresentationConnection>>& connections() const;
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionavailable);
+
+    DECLARE_VIRTUAL_TRACE();
+
+private:
+    HeapVector<Member<PresentationConnection>> m_connections;
+};
+
+} // namespace blink
+
+#endif // PresentationConnectionList_h
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.idl b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.idl
new file mode 100644
index 0000000..06869b5
--- /dev/null
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.idl
@@ -0,0 +1,12 @@
+// 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.
+
+// https://w3c.github.io/presentation-api/#interface-presentationconnectionlist
+
+[
+    RuntimeEnabled=PresentationReceiver
+] interface PresentationConnectionList : EventTarget {
+    readonly attribute FrozenArray<PresentationConnection> connections;
+    attribute EventHandler onconnectionavailable;
+};
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp
index f7b4cba..fd03272d5 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.cpp
@@ -6,10 +6,9 @@
 
 #include "bindings/core/v8/ScriptPromise.h"
 #include "core/dom/DOMException.h"
-#include "core/dom/Document.h"
 #include "core/dom/ExceptionCode.h"
 #include "core/frame/LocalFrame.h"
-#include "modules/EventTargetModules.h"
+#include "modules/presentation/PresentationConnectionList.h"
 
 namespace blink {
 
@@ -18,29 +17,17 @@
 {
 }
 
-const AtomicString& PresentationReceiver::interfaceName() const
+ScriptPromise PresentationReceiver::connectionList(ScriptState* scriptState)
 {
-    return EventTargetNames::PresentationReceiver;
-}
+    if (!m_connectionListProperty)
+        m_connectionListProperty = new ConnectionListProperty(scriptState->getExecutionContext(), this, ConnectionListProperty::Loaded);
 
-ExecutionContext* PresentationReceiver::getExecutionContext() const
-{
-    return frame() ? frame()->document() : nullptr;
-}
-
-ScriptPromise PresentationReceiver::getConnection(ScriptState* scriptState)
-{
-    return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "PresentationReceiver::getConnection() is not implemented yet."));
-}
-
-ScriptPromise PresentationReceiver::getConnections(ScriptState* scriptState)
-{
-    return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError, "PresentationReceiver::getConnections() is not implemented yet."));
+    return m_connectionListProperty->promise(scriptState->world());
 }
 
 DEFINE_TRACE(PresentationReceiver)
 {
-    EventTargetWithInlineData::trace(visitor);
+    visitor->trace(m_connectionListProperty);
     DOMWindowProperty::trace(visitor);
 }
 
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h
index 88b93d43..c3571e8 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h
+++ b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.h
@@ -6,34 +6,37 @@
 #define PresentationReceiver_h
 
 #include "bindings/core/v8/ScriptPromise.h"
-#include "core/events/EventTarget.h"
+#include "bindings/core/v8/ScriptPromiseProperty.h"
+#include "bindings/core/v8/ScriptWrappable.h"
 #include "core/frame/DOMWindowProperty.h"
 #include "platform/heap/Handle.h"
 #include "platform/heap/Heap.h"
 
 namespace blink {
 
+class PresentationConnectionList;
+class PresentationReceiver;
+
+using ConnectionListProperty = ScriptPromiseProperty<Member<PresentationReceiver>, Member<PresentationConnectionList>, Member<DOMException>>;
+
 // Implements the PresentationReceiver interface from the Presentation API from
 // which websites can implement the receiving side of a presentation session.
 class PresentationReceiver final
-    : public EventTargetWithInlineData
-    , DOMWindowProperty {
+    : public GarbageCollected<PresentationReceiver>
+    , public ScriptWrappable
+    , public DOMWindowProperty {
     USING_GARBAGE_COLLECTED_MIXIN(PresentationReceiver);
     DEFINE_WRAPPERTYPEINFO();
 public:
-    PresentationReceiver(LocalFrame*);
+    explicit PresentationReceiver(LocalFrame*);
     ~PresentationReceiver() = default;
 
-    // EventTarget implementation.
-    const AtomicString& interfaceName() const override;
-    ExecutionContext* getExecutionContext() const override;
-
-    ScriptPromise getConnection(ScriptState*);
-    ScriptPromise getConnections(ScriptState*);
-
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionavailable);
+    ScriptPromise connectionList(ScriptState*);
 
     DECLARE_VIRTUAL_TRACE();
+
+private:
+    Member<ConnectionListProperty> m_connectionListProperty;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.idl b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.idl
index 32226f7e..09472c98 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationReceiver.idl
+++ b/third_party/WebKit/Source/modules/presentation/PresentationReceiver.idl
@@ -2,13 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// https://w3c.github.io/presentation-api/#interface-presentation
+// https://w3c.github.io/presentation-api/#idl-def-presentationreceiver
 
 [
     RuntimeEnabled=PresentationReceiver
-] interface PresentationReceiver : EventTarget {
-    [CallWith=ScriptState] Promise<PresentationConnection> getConnection();
-    [CallWith=ScriptState] Promise<sequence<PresentationConnection>> getConnections();
-
-    attribute EventHandler onconnectionavailable;
+] interface PresentationReceiver {
+    [SameObject, CallWith=ScriptState] readonly attribute Promise<PresentationConnectionList> connectionList;
 };
diff --git a/third_party/WebKit/Source/modules/webdatabase/Database.cpp b/third_party/WebKit/Source/modules/webdatabase/Database.cpp
index 5ee76aa..3f3b630 100644
--- a/third_party/WebKit/Source/modules/webdatabase/Database.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/Database.cpp
@@ -48,6 +48,7 @@
 #include "modules/webdatabase/StorageLog.h"
 #include "modules/webdatabase/sqlite/SQLiteStatement.h"
 #include "modules/webdatabase/sqlite/SQLiteTransaction.h"
+#include "platform/WaitableEvent.h"
 #include "platform/heap/SafePoint.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebDatabaseObserver.h"
@@ -259,15 +260,15 @@
 
 bool Database::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage)
 {
-    TaskSynchronizer synchronizer;
+    WaitableEvent event;
     if (!getDatabaseContext()->databaseThreadAvailable())
         return false;
 
     DatabaseTracker::tracker().prepareToOpenDatabase(this);
     bool success = false;
-    std::unique_ptr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &synchronizer, error, errorMessage, success);
+    std::unique_ptr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &event, error, errorMessage, success);
     getDatabaseContext()->databaseThread()->scheduleTask(std::move(task));
-    synchronizer.waitForTaskCompletion();
+    event.wait();
 
     return success;
 }
@@ -883,13 +884,13 @@
     // take strict turns in dealing with them. However, if the code changes,
     // this may not be true anymore.
     Vector<String> result;
-    TaskSynchronizer synchronizer;
+    WaitableEvent event;
     if (!getDatabaseContext()->databaseThreadAvailable())
         return result;
 
-    std::unique_ptr<DatabaseTableNamesTask> task = DatabaseTableNamesTask::create(this, &synchronizer, result);
+    std::unique_ptr<DatabaseTableNamesTask> task = DatabaseTableNamesTask::create(this, &event, result);
     getDatabaseContext()->databaseThread()->scheduleTask(std::move(task));
-    synchronizer.waitForTaskCompletion();
+    event.wait();
 
     return result;
 }
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp
index a0b9fba..5b67d98 100644
--- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.cpp
@@ -35,9 +35,9 @@
 
 namespace blink {
 
-DatabaseTask::DatabaseTask(Database* database, TaskSynchronizer* synchronizer)
+DatabaseTask::DatabaseTask(Database* database, WaitableEvent* completeEvent)
     : m_database(database)
-    , m_synchronizer(synchronizer)
+    , m_completeEvent(completeEvent)
 #if DCHECK_IS_ON()
     , m_complete(false)
 #endif
@@ -47,7 +47,7 @@
 DatabaseTask::~DatabaseTask()
 {
 #if DCHECK_IS_ON()
-    ASSERT(m_complete || !m_synchronizer);
+    DCHECK(m_complete || !m_completeEvent);
 #endif
 }
 
@@ -58,7 +58,7 @@
     ASSERT(!m_complete);
 #endif
 
-    if (!m_synchronizer && !m_database->getDatabaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) {
+    if (!m_completeEvent && !m_database->getDatabaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) {
         taskCancelled();
 #if DCHECK_IS_ON()
         m_complete = true;
@@ -71,8 +71,8 @@
     m_database->resetAuthorizer();
     doPerformTask();
 
-    if (m_synchronizer)
-        m_synchronizer->taskCompleted();
+    if (m_completeEvent)
+        m_completeEvent->signal();
 
 #if DCHECK_IS_ON()
     m_complete = true;
@@ -82,14 +82,14 @@
 // *** DatabaseOpenTask ***
 // Opens the database file and verifies the version matches the expected version.
 
-Database::DatabaseOpenTask::DatabaseOpenTask(Database* database, bool setVersionInNewDatabase, TaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
-    : DatabaseTask(database, synchronizer)
+Database::DatabaseOpenTask::DatabaseOpenTask(Database* database, bool setVersionInNewDatabase, WaitableEvent* completeEvent, DatabaseError& error, String& errorMessage, bool& success)
+    : DatabaseTask(database, completeEvent)
     , m_setVersionInNewDatabase(setVersionInNewDatabase)
     , m_error(error)
     , m_errorMessage(errorMessage)
     , m_success(success)
 {
-    ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
+    DCHECK(completeEvent); // A task with output parameters is supposed to be synchronous.
 }
 
 void Database::DatabaseOpenTask::doPerformTask()
@@ -110,8 +110,8 @@
 // *** DatabaseCloseTask ***
 // Closes the database.
 
-Database::DatabaseCloseTask::DatabaseCloseTask(Database* database, TaskSynchronizer* synchronizer)
-    : DatabaseTask(database, synchronizer)
+Database::DatabaseCloseTask::DatabaseCloseTask(Database* database, WaitableEvent* completeEvent)
+    : DatabaseTask(database, completeEvent)
 {
 }
 
@@ -168,11 +168,11 @@
 // *** DatabaseTableNamesTask ***
 // Retrieves a list of all tables in the database - for WebInspector support.
 
-Database::DatabaseTableNamesTask::DatabaseTableNamesTask(Database* database, TaskSynchronizer* synchronizer, Vector<String>& names)
-    : DatabaseTask(database, synchronizer)
+Database::DatabaseTableNamesTask::DatabaseTableNamesTask(Database* database, WaitableEvent* completeEvent, Vector<String>& names)
+    : DatabaseTask(database, completeEvent)
     , m_tableNames(names)
 {
-    ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
+    DCHECK(completeEvent); // A task with output parameters is supposed to be synchronous.
 }
 
 void Database::DatabaseTableNamesTask::doPerformTask()
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h
index d877a63..24a8cbc 100644
--- a/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h
+++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseTask.h
@@ -33,7 +33,7 @@
 #include "modules/webdatabase/DatabaseBasicTypes.h"
 #include "modules/webdatabase/DatabaseError.h"
 #include "modules/webdatabase/SQLTransactionBackend.h"
-#include "platform/TaskSynchronizer.h"
+#include "platform/WaitableEvent.h"
 #include "platform/heap/Handle.h"
 #include "wtf/PtrUtil.h"
 #include "wtf/Threading.h"
@@ -53,14 +53,14 @@
     Database* database() const { return m_database.get(); }
 
 protected:
-    DatabaseTask(Database*, TaskSynchronizer*);
+    DatabaseTask(Database*, WaitableEvent* completeEvent);
 
 private:
     virtual void doPerformTask() = 0;
     virtual void taskCancelled() { }
 
     CrossThreadPersistent<Database> m_database;
-    TaskSynchronizer* m_synchronizer;
+    WaitableEvent* m_completeEvent;
 
 #if DCHECK_IS_ON()
     virtual const char* debugTaskName() const = 0;
@@ -70,13 +70,13 @@
 
 class Database::DatabaseOpenTask final : public DatabaseTask {
 public:
-    static std::unique_ptr<DatabaseOpenTask> create(Database* db, bool setVersionInNewDatabase, TaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
+    static std::unique_ptr<DatabaseOpenTask> create(Database* db, bool setVersionInNewDatabase, WaitableEvent* completeEvent, DatabaseError& error, String& errorMessage, bool& success)
     {
-        return wrapUnique(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, error, errorMessage, success));
+        return wrapUnique(new DatabaseOpenTask(db, setVersionInNewDatabase, completeEvent, error, errorMessage, success));
     }
 
 private:
-    DatabaseOpenTask(Database*, bool setVersionInNewDatabase, TaskSynchronizer*, DatabaseError&, String& errorMessage, bool& success);
+    DatabaseOpenTask(Database*, bool setVersionInNewDatabase, WaitableEvent*, DatabaseError&, String& errorMessage, bool& success);
 
     void doPerformTask() override;
 #if DCHECK_IS_ON()
@@ -91,13 +91,13 @@
 
 class Database::DatabaseCloseTask final : public DatabaseTask {
 public:
-    static std::unique_ptr<DatabaseCloseTask> create(Database* db, TaskSynchronizer* synchronizer)
+    static std::unique_ptr<DatabaseCloseTask> create(Database* db, WaitableEvent* synchronizer)
     {
         return wrapUnique(new DatabaseCloseTask(db, synchronizer));
     }
 
 private:
-    DatabaseCloseTask(Database*, TaskSynchronizer*);
+    DatabaseCloseTask(Database*, WaitableEvent*);
 
     void doPerformTask() override;
 #if DCHECK_IS_ON()
@@ -131,13 +131,13 @@
 
 class Database::DatabaseTableNamesTask final : public DatabaseTask {
 public:
-    static std::unique_ptr<DatabaseTableNamesTask> create(Database* db, TaskSynchronizer* synchronizer, Vector<String>& names)
+    static std::unique_ptr<DatabaseTableNamesTask> create(Database* db, WaitableEvent* synchronizer, Vector<String>& names)
     {
         return wrapUnique(new DatabaseTableNamesTask(db, synchronizer, names));
     }
 
 private:
-    DatabaseTableNamesTask(Database*, TaskSynchronizer*, Vector<String>& names);
+    DatabaseTableNamesTask(Database*, WaitableEvent*, Vector<String>& names);
 
     void doPerformTask() override;
 #if DCHECK_IS_ON()
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
index 13a9234c..93996d39 100644
--- a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
+++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.cpp
@@ -34,6 +34,7 @@
 #include "modules/webdatabase/SQLTransactionCoordinator.h"
 #include "modules/webdatabase/StorageLog.h"
 #include "platform/CrossThreadFunctional.h"
+#include "platform/WaitableEvent.h"
 #include "platform/WebThreadSupportingGC.h"
 #include "public/platform/Platform.h"
 #include "wtf/PtrUtil.h"
@@ -77,7 +78,7 @@
 void DatabaseThread::terminate()
 {
     ASSERT(isMainThread());
-    TaskSynchronizer sync;
+    WaitableEvent sync;
     {
         MutexLocker lock(m_terminationRequestedMutex);
         ASSERT(!m_terminationRequested);
@@ -86,7 +87,7 @@
         STORAGE_DVLOG(1) << "DatabaseThread " << this << " was asked to terminate";
         m_thread->postTask(BLINK_FROM_HERE, crossThreadBind(&DatabaseThread::cleanupDatabaseThread, wrapCrossThreadPersistent(this)));
     }
-    sync.waitForTaskCompletion();
+    sync.wait();
     // The WebThread destructor blocks until all the tasks of the database
     // thread are processed. However, it shouldn't block at all because
     // the database thread has already finished processing the cleanup task.
@@ -121,7 +122,7 @@
 {
     m_thread->shutdown();
     if (m_cleanupSync) // Someone wanted to know when we were done cleaning up.
-        m_cleanupSync->taskCompleted();
+        m_cleanupSync->signal();
 }
 
 void DatabaseThread::recordDatabaseOpen(Database* database)
diff --git a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.h b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.h
index afe5454..a23aba1 100644
--- a/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.h
+++ b/third_party/WebKit/Source/modules/webdatabase/DatabaseThread.h
@@ -40,7 +40,7 @@
 class DatabaseTask;
 class SQLTransactionClient;
 class SQLTransactionCoordinator;
-class TaskSynchronizer;
+class WaitableEvent;
 
 class DatabaseThread : public GarbageCollectedFinalized<DatabaseThread> {
 public:
@@ -80,7 +80,7 @@
 
     std::unique_ptr<SQLTransactionClient> m_transactionClient;
     CrossThreadPersistent<SQLTransactionCoordinator> m_transactionCoordinator;
-    TaskSynchronizer* m_cleanupSync;
+    WaitableEvent* m_cleanupSync;
 
     Mutex m_terminationRequestedMutex;
     bool m_terminationRequested;
diff --git a/third_party/WebKit/Source/modules/websockets/DEPS b/third_party/WebKit/Source/modules/websockets/DEPS
index fec20a6..205fb70 100644
--- a/third_party/WebKit/Source/modules/websockets/DEPS
+++ b/third_party/WebKit/Source/modules/websockets/DEPS
@@ -7,6 +7,7 @@
     "+modules/EventTargetModules.h",
     "+modules/ModulesExport.h",
     "+modules/websockets",
+    "+mojo/public/cpp/bindings",
     "+platform",
     "+public/platform",
     "-web",
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
index 859fd645..c403fce62 100644
--- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
+++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.cpp
@@ -45,16 +45,11 @@
 #include "modules/websockets/InspectorWebSocketEvents.h"
 #include "modules/websockets/WebSocketChannelClient.h"
 #include "modules/websockets/WebSocketFrame.h"
+#include "modules/websockets/WebSocketHandleImpl.h"
 #include "platform/network/NetworkLog.h"
 #include "platform/network/WebSocketHandshakeRequest.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/Platform.h"
-#include "public/platform/WebSecurityOrigin.h"
-#include "public/platform/WebString.h"
-#include "public/platform/WebURL.h"
-#include "public/platform/WebVector.h"
-#include "public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h"
-#include "public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h"
 #include "wtf/PtrUtil.h"
 #include <memory>
 
@@ -136,7 +131,7 @@
 
 DocumentWebSocketChannel::DocumentWebSocketChannel(Document* document, WebSocketChannelClient* client, std::unique_ptr<SourceLocation> location, WebSocketHandle *handle)
     : ContextLifecycleObserver(document)
-    , m_handle(wrapUnique(handle ? handle : Platform::current()->createWebSocketHandle()))
+    , m_handle(wrapUnique(handle ? handle : new WebSocketHandleImpl()))
     , m_client(client)
     , m_identifier(createUniqueIdentifier())
     , m_sendingQuota(0)
@@ -175,14 +170,17 @@
         // it.
         protocol.split(", ", true, protocols);
     }
-    WebVector<WebString> webProtocols(protocols.size());
-    for (size_t i = 0; i < protocols.size(); ++i) {
-        webProtocols[i] = protocols[i];
-    }
 
-    if (document()->frame())
-        document()->frame()->loader().client()->dispatchWillOpenWebSocket(m_handle.get());
-    m_handle->connect(url, webProtocols, WebSecurityOrigin(getExecutionContext()->getSecurityOrigin()), document()->firstPartyForCookies(), document()->userAgent(), this);
+    if (document()->frame()) {
+        // Initialize the WebSocketHandle with the frame's InterfaceProvider to
+        // provide the WebSocket implementation with context about this frame.
+        // This is important so that the browser can show UI associated with
+        // the WebSocket (e.g., for certificate errors).
+        m_handle->initialize(document()->frame()->interfaceProvider());
+    } else {
+        m_handle->initialize(Platform::current()->interfaceProvider());
+    }
+    m_handle->connect(url, protocols, getExecutionContext()->getSecurityOrigin(), document()->firstPartyForCookies(), document()->userAgent(), this);
 
     flowControlIfNecessary();
     TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketCreate", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketCreateEvent::data(document(), m_identifier, url, protocol));
@@ -411,7 +409,7 @@
     return toDocument(context);
 }
 
-void DocumentWebSocketChannel::didConnect(WebSocketHandle* handle, const WebString& selectedProtocol, const WebString& extensions)
+void DocumentWebSocketChannel::didConnect(WebSocketHandle* handle, const String& selectedProtocol, const String& extensions)
 {
     NETWORK_DVLOG(1) << this << " didConnect(" << handle << ", " << String(selectedProtocol) << ", " << String(extensions) << ")";
 
@@ -422,7 +420,7 @@
     m_client->didConnect(selectedProtocol, extensions);
 }
 
-void DocumentWebSocketChannel::didStartOpeningHandshake(WebSocketHandle* handle, const WebSocketHandshakeRequestInfo& request)
+void DocumentWebSocketChannel::didStartOpeningHandshake(WebSocketHandle* handle, PassRefPtr<WebSocketHandshakeRequest> request)
 {
     NETWORK_DVLOG(1) << this << " didStartOpeningHandshake(" << handle << ")";
 
@@ -430,11 +428,11 @@
     ASSERT(handle == m_handle.get());
 
     TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketSendHandshakeRequest", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_identifier));
-    InspectorInstrumentation::willSendWebSocketHandshakeRequest(document(), m_identifier, &request.toCoreRequest());
-    m_handshakeRequest = WebSocketHandshakeRequest::create(request.toCoreRequest());
+    InspectorInstrumentation::willSendWebSocketHandshakeRequest(document(), m_identifier, request.get());
+    m_handshakeRequest = request;
 }
 
-void DocumentWebSocketChannel::didFinishOpeningHandshake(WebSocketHandle* handle, const WebSocketHandshakeResponseInfo& response)
+void DocumentWebSocketChannel::didFinishOpeningHandshake(WebSocketHandle* handle, const WebSocketHandshakeResponse* response)
 {
     NETWORK_DVLOG(1) << this << " didFinishOpeningHandshake(" << handle << ")";
 
@@ -442,11 +440,11 @@
     ASSERT(handle == m_handle.get());
 
     TRACE_EVENT_INSTANT1("devtools.timeline", "WebSocketReceiveHandshakeResponse", TRACE_EVENT_SCOPE_THREAD, "data", InspectorWebSocketEvent::data(document(), m_identifier));
-    InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(document(), m_identifier, m_handshakeRequest.get(), &response.toCoreResponse());
+    InspectorInstrumentation::didReceiveWebSocketHandshakeResponse(document(), m_identifier, m_handshakeRequest.get(), response);
     m_handshakeRequest.clear();
 }
 
-void DocumentWebSocketChannel::didFail(WebSocketHandle* handle, const WebString& message)
+void DocumentWebSocketChannel::didFail(WebSocketHandle* handle, const String& message)
 {
     NETWORK_DVLOG(1) << this << " didFail(" << handle << ", " << String(message) << ")";
 
@@ -511,7 +509,7 @@
     }
 }
 
-void DocumentWebSocketChannel::didClose(WebSocketHandle* handle, bool wasClean, unsigned short code, const WebString& reason)
+void DocumentWebSocketChannel::didClose(WebSocketHandle* handle, bool wasClean, unsigned short code, const String& reason)
 {
     NETWORK_DVLOG(1) << this << " didClose(" << handle << ", " << wasClean << ", " << code << ", " << String(reason) << ")";
 
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.h b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.h
index f56e613..dd678e3 100644
--- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.h
+++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannel.h
@@ -37,10 +37,10 @@
 #include "core/fileapi/FileError.h"
 #include "modules/ModulesExport.h"
 #include "modules/websockets/WebSocketChannel.h"
+#include "modules/websockets/WebSocketHandle.h"
+#include "modules/websockets/WebSocketHandleClient.h"
 #include "platform/heap/Handle.h"
 #include "platform/weborigin/KURL.h"
-#include "public/platform/modules/websockets/WebSocketHandle.h"
-#include "public/platform/modules/websockets/WebSocketHandleClient.h"
 #include "wtf/Deque.h"
 #include "wtf/PassRefPtr.h"
 #include "wtf/RefPtr.h"
@@ -54,8 +54,6 @@
 
 class Document;
 class WebSocketHandshakeRequest;
-class WebSocketHandshakeRequestInfo;
-class WebSocketHandshakeResponseInfo;
 
 // This class is a WebSocketChannel subclass that works with a Document in a
 // DOMWindow (i.e. works in the main thread).
@@ -116,12 +114,12 @@
     Document* document();
 
     // WebSocketHandleClient functions.
-    void didConnect(WebSocketHandle*, const WebString& selectedProtocol, const WebString& extensions) override;
-    void didStartOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeRequestInfo&) override;
-    void didFinishOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeResponseInfo&) override;
-    void didFail(WebSocketHandle*, const WebString& message) override;
-    void didReceiveData(WebSocketHandle*, bool fin, WebSocketHandle::MessageType, const char* data, size_t /* size */) override;
-    void didClose(WebSocketHandle*, bool wasClean, unsigned short code, const WebString& reason) override;
+    void didConnect(WebSocketHandle*, const String& selectedProtocol, const String& extensions) override;
+    void didStartOpeningHandshake(WebSocketHandle*, PassRefPtr<WebSocketHandshakeRequest>) override;
+    void didFinishOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeResponse*) override;
+    void didFail(WebSocketHandle*, const String& message) override;
+    void didReceiveData(WebSocketHandle*, bool fin, WebSocketHandle::MessageType, const char* data, size_t) override;
+    void didClose(WebSocketHandle*, bool wasClean, unsigned short code, const String& reason) override;
     void didReceiveFlowControl(WebSocketHandle*, int64_t quota) override;
     void didStartClosingHandshake(WebSocketHandle*) override;
 
diff --git a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
index 56494e6..a73eff7 100644
--- a/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
+++ b/third_party/WebKit/Source/modules/websockets/DocumentWebSocketChannelTest.cpp
@@ -10,14 +10,10 @@
 #include "core/testing/DummyPageHolder.h"
 #include "modules/websockets/DocumentWebSocketChannel.h"
 #include "modules/websockets/WebSocketChannelClient.h"
+#include "modules/websockets/WebSocketHandle.h"
+#include "modules/websockets/WebSocketHandleClient.h"
 #include "platform/heap/Handle.h"
 #include "platform/weborigin/KURL.h"
-#include "public/platform/WebSecurityOrigin.h"
-#include "public/platform/WebString.h"
-#include "public/platform/WebURL.h"
-#include "public/platform/WebVector.h"
-#include "public/platform/modules/websockets/WebSocketHandle.h"
-#include "public/platform/modules/websockets/WebSocketHandleClient.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/PtrUtil.h"
@@ -80,10 +76,11 @@
 
     ~MockWebSocketHandle() override { }
 
-    MOCK_METHOD6(connect, void(const WebURL&, const WebVector<WebString>&, const WebSecurityOrigin&, const WebURL&, const WebString&, WebSocketHandleClient*));
+    MOCK_METHOD1(initialize, void(InterfaceProvider*));
+    MOCK_METHOD6(connect, void(const KURL&, const Vector<String>&, SecurityOrigin*, const KURL&, const String&, WebSocketHandleClient*));
     MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, size_t));
     MOCK_METHOD1(flowControl, void(int64_t));
-    MOCK_METHOD2(close, void(unsigned short, const WebString&));
+    MOCK_METHOD2(close, void(unsigned short, const String&));
 };
 
 class DocumentWebSocketChannelTest : public ::testing::Test {
@@ -132,12 +129,13 @@
     {
         {
             InSequence s;
-            EXPECT_CALL(*handle(), connect(WebURL(KURL(KURL(), "ws://localhost/")), _, _, _, _, handleClient()));
+            EXPECT_CALL(*handle(), initialize(_));
+            EXPECT_CALL(*handle(), connect(KURL(KURL(), "ws://localhost/"), _, _, _, _, handleClient()));
             EXPECT_CALL(*handle(), flowControl(65536));
             EXPECT_CALL(*channelClient(), didConnect(String("a"), String("b")));
         }
         EXPECT_TRUE(channel()->connect(KURL(KURL(), "ws://localhost/"), "x"));
-        handleClient()->didConnect(handle(), WebString("a"), WebString("b"));
+        handleClient()->didConnect(handle(), String("a"), String("b"));
         ::testing::Mock::VerifyAndClearExpectations(this);
     }
 
@@ -158,25 +156,26 @@
     return memcmp(arg, p, len) == 0;
 }
 
-MATCHER_P(WebURLEq, urlString,
+MATCHER_P(KURLEq, urlString,
     std::string(negation ? "doesn't equal" : "equals")
     + " to \"" + urlString + "\""
 )
 {
-    WebURL url(KURL(KURL(), urlString));
-    *result_listener << "where the url is \"" << arg.string().utf8() << "\"";
+    KURL url(KURL(), urlString);
+    *result_listener << "where the url is \"" << arg.getString().utf8().data() << "\"";
     return arg == url;
 }
 
 TEST_F(DocumentWebSocketChannelTest, connectSuccess)
 {
-    WebVector<WebString> protocols;
-    WebSecurityOrigin origin;
+    Vector<String> protocols;
+    RefPtr<SecurityOrigin> origin;
 
     Checkpoint checkpoint;
     {
         InSequence s;
-        EXPECT_CALL(*handle(), connect(WebURLEq("ws://localhost/"), _, _, WebURLEq("http://example.com/"), _, handleClient())).WillOnce(DoAll(
+        EXPECT_CALL(*handle(), initialize(_));
+        EXPECT_CALL(*handle(), connect(KURLEq("ws://localhost/"), _, _, KURLEq("http://example.com/"), _, handleClient())).WillOnce(DoAll(
             SaveArg<1>(&protocols),
             SaveArg<2>(&origin)));
         EXPECT_CALL(*handle(), flowControl(65536));
@@ -196,10 +195,10 @@
     EXPECT_EQ(1U, protocols.size());
     EXPECT_STREQ("x", protocols[0].utf8().data());
 
-    EXPECT_STREQ("http://example.com", origin.toString().utf8().data());
+    EXPECT_STREQ("http://example.com", origin->toString().utf8().data());
 
     checkpoint.Call(1);
-    handleClient()->didConnect(handle(), WebString("a"), WebString("b"));
+    handleClient()->didConnect(handle(), String("a"), String("b"));
 }
 
 TEST_F(DocumentWebSocketChannelTest, sendText)
@@ -643,7 +642,7 @@
         EXPECT_CALL(*channelClient(), didStartClosingHandshake());
         EXPECT_CALL(checkpoint, Call(1));
 
-        EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason")));
+        EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
         EXPECT_CALL(checkpoint, Call(2));
 
         EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
@@ -669,7 +668,7 @@
     {
         InSequence s;
 
-        EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, WebString("close reason")));
+        EXPECT_CALL(*handle(), close(WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
         EXPECT_CALL(checkpoint, Call(1));
 
         EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHandshakeComplete, WebSocketChannel::CloseEventCodeNormalClosure, String("close reason")));
diff --git a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandle.h b/third_party/WebKit/Source/modules/websockets/WebSocketHandle.h
similarity index 75%
rename from third_party/WebKit/public/platform/modules/websockets/WebSocketHandle.h
rename to third_party/WebKit/Source/modules/websockets/WebSocketHandle.h
index 189a9bf..1b7e4a11 100644
--- a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandle.h
+++ b/third_party/WebKit/Source/modules/websockets/WebSocketHandle.h
@@ -31,21 +31,22 @@
 #ifndef WebSocketHandle_h
 #define WebSocketHandle_h
 
-#include "public/platform/WebCommon.h"
-#include "public/platform/WebVector.h"
+#include "wtf/Forward.h"
+#include "wtf/Vector.h"
+#include <stdint.h>
 
 namespace blink {
 
-class WebSecurityOrigin;
+class InterfaceProvider;
+class KURL;
+class SecurityOrigin;
 class WebSocketHandleClient;
-class WebString;
-class WebURL;
 
 // WebSocketHandle is an interface class designed to be a handle of WebSocket connection.
 // WebSocketHandle will be used together with WebSocketHandleClient.
 //
 // Once a WebSocketHandle is deleted there will be no notification to the corresponding WebSocketHandleClient.
-// Once a WebSocketHandleClient receives DidClose, any method of the corresponding WebSocketHandle can't be called.
+// Once a WebSocketHandleClient receives didClose, any method of the corresponding WebSocketHandle can't be called.
 
 class WebSocketHandle {
 public:
@@ -55,12 +56,17 @@
         MessageTypeBinary,
     };
 
-    virtual ~WebSocketHandle() { }
+    virtual ~WebSocketHandle() {}
 
-    virtual void connect(const WebURL&, const WebVector<WebString>& protocols, const WebSecurityOrigin&, const WebURL& first_party_for_cookies, const WebString& user_agent_override, WebSocketHandleClient*) = 0;
-    virtual void send(bool fin, MessageType, const char* data, size_t /* size */) = 0;
+    // This method may optionally be called before connect() to specify an
+    // InterfaceProvider to get a WebSocket instance. By default, connect() will
+    // use Platform::interfaceProvider().
+    virtual void initialize(InterfaceProvider*) = 0;
+
+    virtual void connect(const KURL&, const Vector<String>& protocols, SecurityOrigin*, const KURL& firstPartyForCookies, const String& userAgentOverride, WebSocketHandleClient*) = 0;
+    virtual void send(bool fin, MessageType, const char* data, size_t) = 0;
     virtual void flowControl(int64_t quota) = 0;
-    virtual void close(unsigned short code, const WebString& reason) = 0;
+    virtual void close(unsigned short code, const String& reason) = 0;
 };
 
 } // namespace blink
diff --git a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandleClient.h b/third_party/WebKit/Source/modules/websockets/WebSocketHandleClient.h
similarity index 81%
rename from third_party/WebKit/public/platform/modules/websockets/WebSocketHandleClient.h
rename to third_party/WebKit/Source/modules/websockets/WebSocketHandleClient.h
index 249d5d0..765e9f9 100644
--- a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandleClient.h
+++ b/third_party/WebKit/Source/modules/websockets/WebSocketHandleClient.h
@@ -31,28 +31,26 @@
 #ifndef WebSocketHandleClient_h
 #define WebSocketHandleClient_h
 
-#include "public/platform/WebCommon.h"
-#include "public/platform/WebString.h"
-#include "public/platform/modules/websockets/WebSocketHandle.h"
+#include "modules/websockets/WebSocketHandle.h"
+#include "wtf/Forward.h"
 
 namespace blink {
-
-class WebSocketHandshakeRequestInfo;
-class WebSocketHandshakeResponseInfo;
+class WebSocketHandshakeRequest;
+class WebSocketHandshakeResponse;
 
 class WebSocketHandleClient {
 public:
     // Called when the handle is opened.
-    virtual void didConnect(WebSocketHandle*, const WebString& selectedProtocol, const WebString& extensions) = 0;
+    virtual void didConnect(WebSocketHandle*, const String& selectedProtocol, const String& extensions) = 0;
 
     // Called when the browser starts the opening handshake.
     // This notification can be omitted when the inspector is not active.
-    virtual void didStartOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeRequestInfo&) = 0;
+    virtual void didStartOpeningHandshake(WebSocketHandle*, PassRefPtr<WebSocketHandshakeRequest>) = 0;
 
     // Called when the browser finishes the opening handshake.
     // This notification precedes didConnect.
     // This notification can be omitted when the inspector is not active.
-    virtual void didFinishOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeResponseInfo&) = 0;
+    virtual void didFinishOpeningHandshake(WebSocketHandle*, const WebSocketHandshakeResponse*) = 0;
 
     // Called when the browser is required to fail the connection.
     // |message| can be displayed in the inspector, but should not be passed
@@ -60,14 +58,14 @@
     // This message also implies that channel is closed with
     // (wasClean = false, code = 1006, reason = "") and
     // |handle| becomes unavailable.
-    virtual void didFail(WebSocketHandle* /* handle */, const WebString& message) = 0;
+    virtual void didFail(WebSocketHandle* /* handle */, const String& message) = 0;
 
     // Called when data are received.
-    virtual void didReceiveData(WebSocketHandle*, bool fin, WebSocketHandle::MessageType, const char* data, size_t /* size */) = 0;
+    virtual void didReceiveData(WebSocketHandle*, bool fin, WebSocketHandle::MessageType, const char* data, size_t) = 0;
 
     // Called when the handle is closed.
     // |handle| becomes unavailable once this notification arrives.
-    virtual void didClose(WebSocketHandle* /* handle */, bool wasClean, unsigned short code, const WebString& reason) = 0;
+    virtual void didClose(WebSocketHandle* /* handle */, bool wasClean, unsigned short code, const String& reason) = 0;
 
     virtual void didReceiveFlowControl(WebSocketHandle*, int64_t quota) = 0;
 
diff --git a/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.cpp b/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.cpp
new file mode 100644
index 0000000..3748b0f9
--- /dev/null
+++ b/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.cpp
@@ -0,0 +1,244 @@
+// 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 "modules/websockets/WebSocketHandleImpl.h"
+
+#include "modules/websockets/WebSocketHandleClient.h"
+#include "platform/network/NetworkLog.h"
+#include "platform/network/WebSocketHandshakeRequest.h"
+#include "platform/network/WebSocketHandshakeResponse.h"
+#include "platform/weborigin/KURL.h"
+#include "platform/weborigin/SecurityOrigin.h"
+#include "public/platform/InterfaceProvider.h"
+#include "public/platform/Platform.h"
+#include "public/platform/WebScheduler.h"
+#include "wtf/Functional.h"
+#include "wtf/text/WTFString.h"
+
+namespace blink {
+namespace {
+
+const uint16_t kAbnormalShutdownOpCode = 1006;
+
+} // namespace
+
+WebSocketHandleImpl::WebSocketHandleImpl()
+    : m_client(nullptr)
+    , m_clientBinding(this)
+{
+    NETWORK_DVLOG(1) << this << " created";
+}
+
+WebSocketHandleImpl::~WebSocketHandleImpl()
+{
+    NETWORK_DVLOG(1) << this << " deleted";
+
+    if (m_websocket)
+        m_websocket->StartClosingHandshake(kAbnormalShutdownOpCode, emptyString());
+}
+
+void WebSocketHandleImpl::initialize(InterfaceProvider* interfaceProvider)
+{
+    NETWORK_DVLOG(1) << this << " initialize(...)";
+
+    DCHECK(!m_websocket);
+    interfaceProvider->getInterface(mojo::GetProxy(&m_websocket));
+
+    m_websocket.set_connection_error_handler(
+        convertToBaseCallback(bind(&WebSocketHandleImpl::onConnectionError, unretained(this))));
+}
+
+void WebSocketHandleImpl::connect(const KURL& url, const Vector<String>& protocols, SecurityOrigin* origin, const KURL& firstPartyForCookies, const String& userAgentOverride, WebSocketHandleClient* client)
+{
+    DCHECK(m_websocket);
+
+    NETWORK_DVLOG(1) << this << " connect(" << url.getString() << ", " << origin->toString() << ")";
+
+    DCHECK(!m_client);
+    DCHECK(client);
+    m_client = client;
+
+    m_websocket->AddChannelRequest(
+        url,
+        protocols,
+        origin,
+        firstPartyForCookies,
+        userAgentOverride.isNull() ? emptyString() : userAgentOverride,
+        m_clientBinding.CreateInterfacePtrAndBind(
+            Platform::current()->currentThread()->scheduler()->loadingTaskRunner()->toSingleThreadTaskRunner()));
+}
+
+void WebSocketHandleImpl::send(bool fin, WebSocketHandle::MessageType type, const char* data, size_t size)
+{
+    DCHECK(m_websocket);
+
+    mojom::blink::WebSocketMessageType typeToPass;
+    switch (type) {
+    case WebSocketHandle::MessageTypeContinuation:
+        typeToPass = mojom::blink::WebSocketMessageType::CONTINUATION;
+        break;
+    case WebSocketHandle::MessageTypeText:
+        typeToPass = mojom::blink::WebSocketMessageType::TEXT;
+        break;
+    case WebSocketHandle::MessageTypeBinary:
+        typeToPass = mojom::blink::WebSocketMessageType::BINARY;
+        break;
+    default:
+        NOTREACHED();
+        return;
+    }
+
+    NETWORK_DVLOG(1) << this << " send(" << fin << ", " << typeToPass << ", " << "(data size = "  << size << "))";
+
+    // TODO(darin): Avoid this copy.
+    Vector<uint8_t> dataToPass(size);
+    std::copy(data, data + size, dataToPass.begin());
+
+    m_websocket->SendFrame(fin, typeToPass, dataToPass);
+}
+
+void WebSocketHandleImpl::flowControl(int64_t quota)
+{
+    DCHECK(m_websocket);
+
+    NETWORK_DVLOG(1) << this << " flowControl(" << quota << ")";
+
+    m_websocket->SendFlowControl(quota);
+}
+
+void WebSocketHandleImpl::close(unsigned short code, const String& reason)
+{
+    DCHECK(m_websocket);
+
+    NETWORK_DVLOG(1) << this << " close(" << code << ", " << reason << ")";
+
+    m_websocket->StartClosingHandshake(code, reason.isNull() ? emptyString() : reason);
+}
+
+void WebSocketHandleImpl::disconnect()
+{
+    m_websocket.reset();
+    m_client = nullptr;
+}
+
+void WebSocketHandleImpl::onConnectionError()
+{
+    // Our connection to the WebSocket was dropped. This could be due to
+    // exceeding the maximum number of concurrent websockets from this process.
+
+    // TODO(darin): Communicate a more specific error here (see crbug/634502).
+    OnFailChannel(
+        "Error in connection establishment: net:"
+        ":ERR_INSUFFICIENT_RESOURCES");
+}
+
+void WebSocketHandleImpl::OnFailChannel(const String& message)
+{
+    NETWORK_DVLOG(1) << this << " OnFailChannel(" << message << ")";
+
+    WebSocketHandleClient* client = m_client;
+    disconnect();
+    if (!client)
+        return;
+
+    client->didFail(this, message);
+    // |this| can be deleted here.
+}
+
+void WebSocketHandleImpl::OnStartOpeningHandshake(mojom::blink::WebSocketHandshakeRequestPtr request)
+{
+    NETWORK_DVLOG(1) << this << " OnStartOpeningHandshake(" << request->url.getString() << ")";
+
+    RefPtr<WebSocketHandshakeRequest> requestToPass = WebSocketHandshakeRequest::create(request->url);
+    for (size_t i = 0; i < request->headers.size(); ++i) {
+        const mojom::blink::HttpHeaderPtr& header = request->headers[i];
+        requestToPass->addHeaderField(AtomicString(header->name), AtomicString(header->value));
+    }
+    requestToPass->setHeadersText(request->headers_text);
+    m_client->didStartOpeningHandshake(this, requestToPass);
+}
+
+void WebSocketHandleImpl::OnFinishOpeningHandshake(mojom::blink::WebSocketHandshakeResponsePtr response)
+{
+    NETWORK_DVLOG(1) << this << " OnFinishOpeningHandshake(" << response->url.getString() << ")";
+
+    WebSocketHandshakeResponse responseToPass;
+    responseToPass.setStatusCode(response->status_code);
+    responseToPass.setStatusText(response->status_text);
+    for (size_t i = 0; i < response->headers.size(); ++i) {
+        const mojom::blink::HttpHeaderPtr& header = response->headers[i];
+        responseToPass.addHeaderField(AtomicString(header->name), AtomicString(header->value));
+    }
+    responseToPass.setHeadersText(response->headers_text);
+    m_client->didFinishOpeningHandshake(this, &responseToPass);
+}
+
+void WebSocketHandleImpl::OnAddChannelResponse(const String& protocol, const String& extensions)
+{
+    NETWORK_DVLOG(1) << this << " OnAddChannelResponse(" << protocol << ", " << extensions << ")";
+
+    if (!m_client)
+        return;
+
+    m_client->didConnect(this, protocol, extensions);
+    // |this| can be deleted here.
+}
+
+void WebSocketHandleImpl::OnDataFrame(bool fin, mojom::blink::WebSocketMessageType type, const Vector<uint8_t>& data)
+{
+    NETWORK_DVLOG(1) << this << " OnDataFrame(" << fin << ", " << type << ", " << "(data size = " << data.size() << "))";
+    if (!m_client)
+        return;
+
+    WebSocketHandle::MessageType typeToPass = WebSocketHandle::MessageTypeContinuation;
+    switch (type) {
+    case mojom::blink::WebSocketMessageType::CONTINUATION:
+        typeToPass = WebSocketHandle::MessageTypeContinuation;
+        break;
+    case mojom::blink::WebSocketMessageType::TEXT:
+        typeToPass = WebSocketHandle::MessageTypeText;
+        break;
+    case mojom::blink::WebSocketMessageType::BINARY:
+        typeToPass = WebSocketHandle::MessageTypeBinary;
+        break;
+    }
+    const char* dataToPass = reinterpret_cast<const char*>(data.isEmpty() ? nullptr : &data[0]);
+    m_client->didReceiveData(this, fin, typeToPass, dataToPass, data.size());
+    // |this| can be deleted here.
+}
+
+void WebSocketHandleImpl::OnFlowControl(int64_t quota)
+{
+    NETWORK_DVLOG(1) << this << " OnFlowControl(" << quota << ")";
+    if (!m_client)
+        return;
+
+    m_client->didReceiveFlowControl(this, quota);
+    // |this| can be deleted here.
+}
+
+void WebSocketHandleImpl::OnDropChannel(bool wasClean, uint16_t code, const String& reason)
+{
+    NETWORK_DVLOG(1) << this << " OnDropChannel(" << wasClean << ", " << code << ", " << reason << ")";
+
+    WebSocketHandleClient* client = m_client;
+    disconnect();
+    if (!client)
+        return;
+
+    client->didClose(this, wasClean, code, reason);
+    // |this| can be deleted here.
+}
+
+void WebSocketHandleImpl::OnClosingHandshake()
+{
+    NETWORK_DVLOG(1) << this << " OnClosingHandshake()";
+    if (!m_client)
+        return;
+
+    m_client->didStartClosingHandshake(this);
+    // |this| can be deleted here.
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.h b/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.h
new file mode 100644
index 0000000..daeb92a
--- /dev/null
+++ b/third_party/WebKit/Source/modules/websockets/WebSocketHandleImpl.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2013 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebSocketHandleImpl_h
+#define WebSocketHandleImpl_h
+
+#include "modules/websockets/WebSocketHandle.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "public/platform/modules/websockets/websocket.mojom-blink.h"
+
+namespace blink {
+
+class WebSocketHandleImpl : public WebSocketHandle, public mojom::blink::WebSocketClient {
+public:
+    WebSocketHandleImpl();
+    ~WebSocketHandleImpl() override;
+
+    void initialize(InterfaceProvider*) override;
+    void connect(const KURL&, const Vector<String>& protocols, SecurityOrigin*, const KURL& firstPartyForCookies, const String& userAgentOverride, WebSocketHandleClient*) override;
+    void send(bool fin, MessageType, const char* data, size_t) override;
+    void flowControl(int64_t quota) override;
+    void close(unsigned short code, const String& reason) override;
+
+private:
+    void disconnect();
+    void onConnectionError();
+
+    // mojom::blink::WebSocketClient methods:
+    void OnFailChannel(const String& reason) override;
+    void OnStartOpeningHandshake(mojom::blink::WebSocketHandshakeRequestPtr) override;
+    void OnFinishOpeningHandshake(mojom::blink::WebSocketHandshakeResponsePtr) override;
+    void OnAddChannelResponse(const String& selectedProtocol, const String& extensions) override;
+    void OnDataFrame(bool fin, mojom::blink::WebSocketMessageType, const Vector<uint8_t>& data) override;
+    void OnFlowControl(int64_t quota) override;
+    void OnDropChannel(bool wasClean, uint16_t code, const String& reason) override;
+    void OnClosingHandshake() override;
+
+    WebSocketHandleClient* m_client;
+
+    mojom::blink::WebSocketPtr m_websocket;
+    mojo::Binding<mojom::blink::WebSocketClient> m_clientBinding;
+};
+
+} // namespace blink
+
+#endif // WebSocketHandleImpl_h
diff --git a/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
index 3ab95c2..a774cda 100644
--- a/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
+++ b/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
@@ -388,10 +388,7 @@
     // content check must synchronously be conducted.
     WebSocketChannelSyncHelper syncHelper;
     m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&Bridge::connectOnMainThread, wrapCrossThreadPersistent(this), passed(location->clone()), wrapCrossThreadPersistent(m_workerGlobalScope->thread()->getWorkerThreadLifecycleContext()), url, protocol, crossThreadUnretained(&syncHelper)));
-    {
-        SafePointScope scope(BlinkGC::HeapPointersOnStack);
-        syncHelper.wait();
-    }
+    syncHelper.wait();
     return syncHelper.connectRequestResult();
 }
 
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn
index 2f14bbe..16528f3 100644
--- a/third_party/WebKit/Source/platform/BUILD.gn
+++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -16,11 +16,6 @@
 # Most targets in this file are private actions so use that as the default.
 visibility = [ ":*" ]
 
-heap_gypi = exec_script("//build/gypi_to_gn.py",
-                        [ rebase_path("heap/blink_heap.gypi") ],
-                        "scope",
-                        [ "heap/blink_heap.gypi" ])
-
 blink_platform_neon_files = [ "graphics/cpu/arm/WebGLImageConversionNEON.h" ]
 
 blink_platform_sse_files = [ "graphics/cpu/x86/WebGLImageConversionSSE.h" ]
@@ -192,44 +187,39 @@
 
 # Inspector protocol
 
-action("inspector_protocol_sources") {
-  script = "inspector_protocol/CodeGenerator.py"
-  deps = [
-    ":inspector_protocol_compatibility",
-  ]
-  sources = inspector_protocol_sources
+inspector_protocol_generate("inspector_protocol_sources") {
+  out_dir = blink_platform_output_dir
+
+  config_file = "v8_inspector/inspector_protocol_config.json"
   inputs = [
     "v8_inspector/js_protocol.json",
     "v8_inspector/inspector_protocol_config.json",
   ]
+
+  # This are relative to blink_platform_output_dir.
   outputs = [
-    "$blink_platform_output_dir/v8_inspector/protocol/Forward.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Protocol.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Protocol.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Console.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Console.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Debugger.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Debugger.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/HeapProfiler.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/HeapProfiler.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Profiler.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Profiler.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Runtime.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Runtime.h",
-    "$blink_platform_output_dir/v8_inspector/protocol/Schema.cpp",
-    "$blink_platform_output_dir/v8_inspector/protocol/Schema.h",
-    "$blink_platform_output_dir/v8_inspector/public/protocol/Debugger.h",
-    "$blink_platform_output_dir/v8_inspector/public/protocol/Runtime.h",
-    "$blink_platform_output_dir/v8_inspector/public/protocol/Schema.h",
+    "v8_inspector/protocol/Forward.h",
+    "v8_inspector/protocol/Protocol.cpp",
+    "v8_inspector/protocol/Protocol.h",
+    "v8_inspector/protocol/Console.cpp",
+    "v8_inspector/protocol/Console.h",
+    "v8_inspector/protocol/Debugger.cpp",
+    "v8_inspector/protocol/Debugger.h",
+    "v8_inspector/protocol/HeapProfiler.cpp",
+    "v8_inspector/protocol/HeapProfiler.h",
+    "v8_inspector/protocol/Profiler.cpp",
+    "v8_inspector/protocol/Profiler.h",
+    "v8_inspector/protocol/Runtime.cpp",
+    "v8_inspector/protocol/Runtime.h",
+    "v8_inspector/protocol/Schema.cpp",
+    "v8_inspector/protocol/Schema.h",
+    "v8_inspector/public/protocol/Debugger.h",
+    "v8_inspector/public/protocol/Runtime.h",
+    "v8_inspector/public/protocol/Schema.h",
   ]
 
-  args = [
-    "--jinja_dir",
-    rebase_path("../../../", root_build_dir),  # jinja is in chromium's third_party
-    "--output_base",
-    rebase_path(blink_platform_output_dir, root_build_dir),
-    "--config",
-    rebase_path("v8_inspector/inspector_protocol_config.json", root_build_dir),
+  deps = [
+    ":inspector_protocol_compatibility",
   ]
 }
 
@@ -508,40 +498,6 @@
   }
 }
 
-# GYP: blink_heap_unittests
-test("blink_heap_unittests") {
-  visibility = []  # Allow re-assignment of list.
-  visibility = [ "*" ]
-
-  sources = rebase_path(heap_gypi.platform_heap_test_files, ".", "heap")
-  sources += [ "heap/RunAllTests.cpp" ]
-
-  configs += [
-    "//third_party/WebKit/Source/wtf:wtf_config",
-    "//third_party/WebKit/Source:config",
-  ]
-
-  defines = [ "INSIDE_BLINK" ]
-
-  deps = [
-    ":platform",
-    ":test_support",
-    "//base",
-    "//base/test:test_support",
-    "//content/test:test_support",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//third_party/WebKit/Source/wtf",
-  ]
-  if (is_android) {
-    deps += [
-      "//base:base_java",
-      "//content/shell/android:content_shell_assets",
-      "//net/android:net_java",
-    ]
-  }
-}
-
 test("blink_platform_unittests") {
   visibility = []  # Allow re-assignment of list.
   visibility = [ "*" ]
diff --git a/third_party/WebKit/Source/platform/TaskSynchronizer.cpp b/third_party/WebKit/Source/platform/TaskSynchronizer.cpp
deleted file mode 100644
index 3e019dc8..0000000
--- a/third_party/WebKit/Source/platform/TaskSynchronizer.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "platform/TaskSynchronizer.h"
-
-#include "platform/heap/SafePoint.h"
-#include "platform/heap/ThreadState.h"
-
-namespace blink {
-
-TaskSynchronizer::TaskSynchronizer()
-    : m_taskCompleted(false)
-{
-}
-
-void TaskSynchronizer::waitForTaskCompletion()
-{
-    if (ThreadState::current()) {
-        // Prevent the deadlock between park request by other threads and blocking
-        // by m_synchronousCondition.
-        SafePointScope scope(BlinkGC::HeapPointersOnStack);
-        waitForTaskCompletionInternal();
-    } else {
-        // If this thread is already detached, we no longer need to enter a safe point scope.
-        waitForTaskCompletionInternal();
-    }
-}
-
-void TaskSynchronizer::waitForTaskCompletionInternal()
-{
-    m_synchronousMutex.lock();
-    while (!m_taskCompleted)
-        m_synchronousCondition.wait(m_synchronousMutex);
-    m_synchronousMutex.unlock();
-}
-
-void TaskSynchronizer::taskCompleted()
-{
-    m_synchronousMutex.lock();
-    m_taskCompleted = true;
-    m_synchronousCondition.signal();
-    m_synchronousMutex.unlock();
-}
-
-} // namespace blink
diff --git a/third_party/WebKit/Source/platform/TaskSynchronizer.h b/third_party/WebKit/Source/platform/TaskSynchronizer.h
deleted file mode 100644
index 4e18482..0000000
--- a/third_party/WebKit/Source/platform/TaskSynchronizer.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2007, 2008, 2013 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
- *     its contributors may be used to endorse or promote products derived
- *     from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TaskSynchronizer_h
-#define TaskSynchronizer_h
-
-#include "platform/PlatformExport.h"
-#include "wtf/Allocator.h"
-#include "wtf/Noncopyable.h"
-#include "wtf/Threading.h"
-#include "wtf/ThreadingPrimitives.h"
-
-namespace blink {
-
-// TaskSynchronizer can be used to wait for task completion.
-class PLATFORM_EXPORT TaskSynchronizer {
-    DISALLOW_NEW();
-    WTF_MAKE_NONCOPYABLE(TaskSynchronizer);
-public:
-    TaskSynchronizer();
-
-    // Called from a thread that waits for the task completion.
-    void waitForTaskCompletion();
-
-    // Called from a thread that executes the task.
-    void taskCompleted();
-
-private:
-    void waitForTaskCompletionInternal();
-
-    bool m_taskCompleted;
-    Mutex m_synchronousMutex;
-    ThreadCondition m_synchronousCondition;
-};
-
-} // namespace blink
-
-#endif // TaskSynchronizer_h
diff --git a/third_party/WebKit/Source/platform/WaitableEvent.cpp b/third_party/WebKit/Source/platform/WaitableEvent.cpp
index 3bbb8577..674a6ab 100644
--- a/third_party/WebKit/Source/platform/WaitableEvent.cpp
+++ b/third_party/WebKit/Source/platform/WaitableEvent.cpp
@@ -5,6 +5,9 @@
 #include "platform/WaitableEvent.h"
 
 #include "base/synchronization/waitable_event.h"
+#include "platform/heap/SafePoint.h"
+#include "platform/heap/ThreadState.h"
+#include "wtf/Optional.h"
 #include "wtf/PtrUtil.h"
 #include <vector>
 
@@ -30,7 +33,15 @@
 
 void WaitableEvent::wait()
 {
-    m_impl->Wait();
+    if (ThreadState::current()) {
+        // We only enter a safe point scope if the thread is attached, ex. never
+        // during shutdown.
+        // TODO(esprehn): Why can't SafePointScope do this for us?
+        SafePointScope scope(BlinkGC::HeapPointersOnStack);
+        m_impl->Wait();
+    } else {
+        m_impl->Wait();
+    }
 }
 
 void WaitableEvent::signal()
diff --git a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp
index cef7e6d..7595fc88 100644
--- a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp
+++ b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.cpp
@@ -29,7 +29,7 @@
 #include "platform/audio/HRTFDatabaseLoader.h"
 
 #include "platform/CrossThreadFunctional.h"
-#include "platform/TaskSynchronizer.h"
+#include "platform/WaitableEvent.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebTaskRunner.h"
 #include "public/platform/WebTraceLocation.h"
@@ -121,9 +121,9 @@
 
 // This cleanup task is needed just to make sure that the loader thread finishes
 // the load task and thus the loader thread doesn't touch m_thread any more.
-void HRTFDatabaseLoader::cleanupTask(TaskSynchronizer* sync)
+void HRTFDatabaseLoader::cleanupTask(WaitableEvent* sync)
 {
-    sync->taskCompleted();
+    sync->signal();
 }
 
 void HRTFDatabaseLoader::waitForLoaderThreadCompletion()
@@ -131,10 +131,10 @@
     if (!m_thread)
         return;
 
-    TaskSynchronizer sync;
+    WaitableEvent sync;
     // TODO(alexclarke): Should this be posted as a loading task?
     m_thread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBind(&HRTFDatabaseLoader::cleanupTask, crossThreadUnretained(this), crossThreadUnretained(&sync)));
-    sync.waitForTaskCompletion();
+    sync.wait();
     m_thread.reset();
 }
 
diff --git a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.h b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.h
index 8de2595..f587a75 100644
--- a/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.h
+++ b/third_party/WebKit/Source/platform/audio/HRTFDatabaseLoader.h
@@ -38,10 +38,9 @@
 
 namespace blink {
 
-class TaskSynchronizer;
+class WaitableEvent;
 
 // HRTFDatabaseLoader will asynchronously load the default HRTFDatabase in a new thread.
-
 class PLATFORM_EXPORT HRTFDatabaseLoader final : public RefCounted<HRTFDatabaseLoader> {
 public:
     // Lazily creates a HRTFDatabaseLoader (if not already created) for the given sample-rate
@@ -76,7 +75,7 @@
 
     // Called in asynchronous loading thread.
     void loadTask();
-    void cleanupTask(TaskSynchronizer*);
+    void cleanupTask(WaitableEvent*);
 
     // Holding a m_lock is required when accessing m_hrtfDatabase since we access it from multiple threads.
     Mutex m_lock;
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi
index 36b710d..8bae2321 100644
--- a/third_party/WebKit/Source/platform/blink_platform.gypi
+++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -111,8 +111,6 @@
       'StorageQuotaCallbacks.h',
       'Supplementable.cpp',
       'Supplementable.h',
-      'TaskSynchronizer.cpp',
-      'TaskSynchronizer.h',
       'Theme.cpp',
       'Theme.h',
       'ThemeTypes.h',
@@ -357,8 +355,6 @@
       'exported/WebServiceWorkerProxy.cpp',
       'exported/WebServiceWorkerRequest.cpp',
       'exported/WebServiceWorkerResponse.cpp',
-      'exported/WebSocketHandshakeRequestInfo.cpp',
-      'exported/WebSocketHandshakeResponseInfo.cpp',
       'exported/WebSourceInfo.cpp',
       'exported/WebSpeechSynthesisUtterance.cpp',
       'exported/WebSpeechSynthesisVoice.cpp',
diff --git a/third_party/WebKit/Source/platform/exported/WebSocketHandshakeRequestInfo.cpp b/third_party/WebKit/Source/platform/exported/WebSocketHandshakeRequestInfo.cpp
deleted file mode 100644
index 8b4e7a5..0000000
--- a/third_party/WebKit/Source/platform/exported/WebSocketHandshakeRequestInfo.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h"
-
-#include "platform/network/WebSocketHandshakeRequest.h"
-#include "public/platform/WebString.h"
-#include "public/platform/WebURL.h"
-
-namespace blink {
-
-WebSocketHandshakeRequestInfo::WebSocketHandshakeRequestInfo() : m_private(WebSocketHandshakeRequest::create())
-{
-}
-
-WebSocketHandshakeRequestInfo::~WebSocketHandshakeRequestInfo()
-{
-    m_private.reset();
-}
-
-void WebSocketHandshakeRequestInfo::setURL(const WebURL& url)
-{
-    m_private->setURL(url);
-}
-
-void WebSocketHandshakeRequestInfo::addHeaderField(const WebString& name, const WebString& value)
-{
-    m_private->addAndMergeHeader(name, value);
-}
-
-void WebSocketHandshakeRequestInfo::setHeadersText(const WebString& text)
-{
-    m_private->setHeadersText(text);
-}
-
-} // namespace blink
diff --git a/third_party/WebKit/Source/platform/exported/WebSocketHandshakeResponseInfo.cpp b/third_party/WebKit/Source/platform/exported/WebSocketHandshakeResponseInfo.cpp
deleted file mode 100644
index 14ccc9c..0000000
--- a/third_party/WebKit/Source/platform/exported/WebSocketHandshakeResponseInfo.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h"
-
-#include "platform/network/WebSocketHandshakeResponse.h"
-#include "public/platform/WebString.h"
-
-namespace blink {
-
-WebSocketHandshakeResponseInfo::WebSocketHandshakeResponseInfo() : m_private(new WebSocketHandshakeResponse)
-{
-}
-
-WebSocketHandshakeResponseInfo::~WebSocketHandshakeResponseInfo()
-{
-}
-
-void WebSocketHandshakeResponseInfo::setStatusCode(int statusCode)
-{
-    m_private->setStatusCode(statusCode);
-}
-
-void WebSocketHandshakeResponseInfo::setStatusText(const WebString& statusText)
-{
-    m_private->setStatusText(statusText);
-}
-
-void WebSocketHandshakeResponseInfo::addHeaderField(const WebString& name, const WebString& value)
-{
-    m_private->addHeaderField(name, value);
-}
-
-void WebSocketHandshakeResponseInfo::setHeadersText(const WebString& text)
-{
-    m_private->setHeadersText(text);
-}
-
-} // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/BUILD.gn b/third_party/WebKit/Source/platform/heap/BUILD.gn
index c2684be..f4e9ce2 100644
--- a/third_party/WebKit/Source/platform/heap/BUILD.gn
+++ b/third_party/WebKit/Source/platform/heap/BUILD.gn
@@ -2,12 +2,15 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//testing/test.gni")
+
 source_set("heap") {
   # This target is a logical part of the platform and only the platform target
   # should depend on it.
   visibility = [ "//third_party/WebKit/Source/platform" ]
 
   sources = [
+    "BlinkGC.h",
     "BlinkGCInterruptor.cpp",
     "BlinkGCInterruptor.h",
     "BlinkGCMemoryDumpProvider.cpp",
@@ -47,6 +50,7 @@
     "TraceTraits.h",
     "Visitor.cpp",
     "Visitor.h",
+    "WrapperVisitor.h",
   ]
 
   defines = [ "BLINK_PLATFORM_IMPLEMENTATION=1" ]
@@ -66,3 +70,35 @@
     "//v8",
   ]
 }
+
+test("blink_heap_unittests") {
+  sources = [
+    "BlinkGCMemoryDumpProviderTest.cpp",
+    "HeapTest.cpp",
+    "PersistentTest.cpp",
+    "RunAllTests.cpp",
+  ]
+
+  configs += [
+    "//third_party/WebKit/Source/wtf:wtf_config",
+    "//third_party/WebKit/Source:config",
+    "//third_party/WebKit/Source:inside_blink",
+  ]
+
+  deps = [
+    "//base",
+    "//base/test:test_support",
+    "//content/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//third_party/WebKit/Source/platform:test_support",
+    "//third_party/WebKit/Source/wtf",
+  ]
+  if (is_android) {
+    deps += [
+      "//base:base_java",
+      "//content/shell/android:content_shell_assets",
+      "//net/android:net_java",
+    ]
+  }
+}
diff --git a/third_party/WebKit/Source/platform/heap/blink_heap.gypi b/third_party/WebKit/Source/platform/heap/blink_heap.gypi
deleted file mode 100644
index 39941e47..0000000
--- a/third_party/WebKit/Source/platform/heap/blink_heap.gypi
+++ /dev/null
@@ -1,109 +0,0 @@
-#
-# Copyright (C) 2013 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-#     * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-
-{
-  'variables': {
-    'platform_heap_files': [
-      'BlinkGC.h',
-      'BlinkGCInterruptor.cpp',
-      'BlinkGCInterruptor.h',
-      'BlinkGCMemoryDumpProvider.cpp',
-      'BlinkGCMemoryDumpProvider.h',
-      'CallbackStack.cpp',
-      'CallbackStack.h',
-      'GCInfo.cpp',
-      'GCInfo.h',
-      'GCTaskRunner.h',
-      'GarbageCollected.h',
-      'Handle.h',
-      'Heap.cpp',
-      'Heap.h',
-      'HeapAllocator.cpp',
-      'HeapAllocator.h',
-      'HeapPage.cpp',
-      'HeapPage.h',
-      'InlinedGlobalMarkingVisitor.h',
-      'MarkingVisitor.h',
-      'MarkingVisitorImpl.h',
-      'Member.h',
-      'PageMemory.cpp',
-      'PageMemory.h',
-      'PagePool.cpp',
-      'PagePool.h',
-      'Persistent.h',
-      'PersistentNode.cpp',
-      'PersistentNode.h',
-      'SafePoint.cpp',
-      'SafePoint.h',
-      'SelfKeepAlive.h',
-      'StackFrameDepth.cpp',
-      'StackFrameDepth.h',
-      'ThreadState.cpp',
-      'ThreadState.h',
-      'ThreadingTraits.h',
-      'TraceTraits.h',
-      'Visitor.cpp',
-      'Visitor.h',
-      'WrapperVisitor.h',
-    ],
-    'platform_heap_test_files': [
-      'BlinkGCMemoryDumpProviderTest.cpp',
-      'HeapTest.cpp',
-      'PersistentTest.cpp',
-    ],
-    'conditions': [
-      ['target_arch == "arm"', {
-        'platform_heap_asm_files': [
-          'asm/SaveRegisters_arm.S',
-        ],
-      }],
-      ['target_arch == "arm64"', {
-        'platform_heap_asm_files': [
-          'asm/SaveRegisters_arm64.S',
-        ],
-      }],
-      ['target_arch == "mipsel"', {
-        'platform_heap_asm_files': [
-          'asm/SaveRegisters_mips.S',
-        ],
-      }],
-      ['target_arch == "mips64el"', {
-        'platform_heap_asm_files': [
-          'asm/SaveRegisters_mips64.S',
-        ],
-      }],
-      ['target_arch == "ia32" or target_arch == "x64"', {
-        'platform_heap_asm_files': [
-          'asm/SaveRegisters_x86.asm',
-        ],
-      }],
-    ],
-  },
-}
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py b/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
index 48c422a..97eda508 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
+++ b/third_party/WebKit/Source/platform/inspector_protocol/CodeGenerator.py
@@ -32,6 +32,21 @@
             return collections.namedtuple('X', keys)(*values)
         return json.loads(data, object_hook=json_object_hook)
 
+    def init_defaults(config_tuple, path, defaults):
+        keys = list(config_tuple._fields)  # pylint: disable=E1101
+        values = [getattr(config_tuple, k) for k in keys]
+        for i in xrange(len(keys)):
+            if hasattr(values[i], "_fields"):
+                values[i] = init_defaults(values[i], path + "." + keys[i], defaults)
+        for optional in defaults:
+            if optional.find(path + ".") != 0:
+                continue
+            optional_key = optional[len(path) + 1:]
+            if optional_key.find(".") == -1 and optional_key not in keys:
+                keys.append(optional_key)
+                values.append(defaults[optional])
+        return collections.namedtuple('X', keys)(*values)
+
     try:
         cmdline_parser = optparse.OptionParser()
         cmdline_parser.add_option("--output_base")
@@ -58,14 +73,23 @@
         config_json_file = open(config_file, "r")
         config_json_string = config_json_file.read()
         config_partial = json_to_object(config_json_string, output_base, config_base)
-        keys = list(config_partial._fields)  # pylint: disable=E1101
-        values = [getattr(config_partial, k) for k in keys]
-        for optional in ["imported", "exported", "lib"]:
-            if optional not in keys:
-                keys.append(optional)
-                values.append(False)
         config_json_file.close()
-        return (jinja_dir, config_file, collections.namedtuple('X', keys)(*values))
+        defaults = {
+            ".imported": False,
+            ".imported.export_macro": "",
+            ".imported.export_header": False,
+            ".imported.header": False,
+            ".imported.package": False,
+            ".protocol.export_macro": "",
+            ".protocol.export_header": False,
+            ".exported": False,
+            ".exported.export_macro": "",
+            ".exported.export_header": False,
+            ".lib": False,
+            ".lib.export_macro": "",
+            ".lib.export_header": False,
+        }
+        return (jinja_dir, config_file, init_defaults(config_partial, "", defaults))
     except Exception:
         # Work with python 2 and 3 http://docs.python.org/py3k/howto/pyporting.html
         exc = sys.exc_info()[1]
@@ -320,6 +344,10 @@
     return False
 
 
+def format_include(header):
+    return "\"" + header + "\"" if header[0] not in "<\"" else header
+
+
 def read_protocol_file(file_name, json_api):
     input_file = open(file_name, "r")
     json_string = input_file.read()
@@ -391,7 +419,8 @@
             "join_arrays": join_arrays,
             "resolve_type": functools.partial(resolve_type, protocol),
             "type_definition": functools.partial(type_definition, protocol),
-            "has_disable": has_disable
+            "has_disable": has_disable,
+            "format_include": format_include,
         }
 
         if domain["domain"] in protocol.generate_domains:
@@ -404,7 +433,8 @@
 
     if config.lib:
         template_context = {
-            "config": config
+            "config": config,
+            "format_include": format_include,
         }
 
         lib_templates_dir = os.path.join(module_path, "lib")
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni b/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni
index 324062e..4b161a09 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni
+++ b/third_party/WebKit/Source/platform/inspector_protocol/inspector_protocol.gni
@@ -2,31 +2,81 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-inspector_protocol_sources =
-    get_path_info([
-                    "lib/Allocator_h.template",
-                    "lib/Array_h.template",
-                    "lib/BackendCallback_h.template",
-                    "lib/Collections_h.template",
-                    "lib/DispatcherBase_cpp.template",
-                    "lib/DispatcherBase_h.template",
-                    "lib/ErrorSupport_cpp.template",
-                    "lib/ErrorSupport_h.template",
-                    "lib/Forward_h.template",
-                    "lib/FrontendChannel_h.template",
-                    "lib/Maybe_h.template",
-                    "lib/Object_cpp.template",
-                    "lib/Object_h.template",
-                    "lib/Parser_cpp.template",
-                    "lib/Parser_h.template",
-                    "lib/Protocol_cpp.template",
-                    "lib/ValueConversions_h.template",
-                    "lib/Values_cpp.template",
-                    "lib/Values_h.template",
-                    "templates/Exported_h.template",
-                    "templates/Imported_h.template",
-                    "templates/TypeBuilder_cpp.template",
-                    "templates/TypeBuilder_h.template",
-                    "CodeGenerator.py",
-                  ],
-                  "abspath")
+# This template will generate inspector protocol source code. The code will
+# not be compiled, use get_target_outputs(<name>) to compile them.
+#
+# Inputs
+#
+#   config_file  (required)
+#       Path to json file specifying inspector protocol configuration.
+#
+#   out_dir  (required)
+#       Path to put the generated files in. It must be inside output or
+#       generated file directory.
+#
+#   outputs (required)
+#       Files generated. Relative to out_dir.
+#
+#   inputs  (optional)
+#       Extra inputs specified by the config file.
+template("inspector_protocol_generate") {
+  assert(defined(invoker.config_file))
+  assert(defined(invoker.out_dir))
+  assert(defined(invoker.outputs))
+
+  inspector_protocol_dir =
+      "//third_party/WebKit/Source/platform/inspector_protocol"
+
+  action(target_name) {
+    script = "$inspector_protocol_dir/CodeGenerator.py"
+
+    inputs = [
+      invoker.config_file,
+      "$inspector_protocol_dir/lib/Allocator_h.template",
+      "$inspector_protocol_dir/lib/Array_h.template",
+      "$inspector_protocol_dir/lib/BackendCallback_h.template",
+      "$inspector_protocol_dir/lib/Collections_h.template",
+      "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
+      "$inspector_protocol_dir/lib/DispatcherBase_h.template",
+      "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
+      "$inspector_protocol_dir/lib/ErrorSupport_h.template",
+      "$inspector_protocol_dir/lib/Forward_h.template",
+      "$inspector_protocol_dir/lib/FrontendChannel_h.template",
+      "$inspector_protocol_dir/lib/Maybe_h.template",
+      "$inspector_protocol_dir/lib/Object_cpp.template",
+      "$inspector_protocol_dir/lib/Object_h.template",
+      "$inspector_protocol_dir/lib/Parser_cpp.template",
+      "$inspector_protocol_dir/lib/Parser_h.template",
+      "$inspector_protocol_dir/lib/Protocol_cpp.template",
+      "$inspector_protocol_dir/lib/ValueConversions_h.template",
+      "$inspector_protocol_dir/lib/Values_cpp.template",
+      "$inspector_protocol_dir/lib/Values_h.template",
+      "$inspector_protocol_dir/templates/Exported_h.template",
+      "$inspector_protocol_dir/templates/Imported_h.template",
+      "$inspector_protocol_dir/templates/TypeBuilder_cpp.template",
+      "$inspector_protocol_dir/templates/TypeBuilder_h.template",
+    ]
+    if (defined(invoker.inputs)) {
+      inputs += invoker.inputs
+    }
+
+    args = [
+      "--jinja_dir",
+      rebase_path("//third_party/", root_build_dir),  # jinja is in chromium's third_party
+      "--output_base",
+      rebase_path(invoker.out_dir, root_build_dir),
+      "--config",
+      rebase_path(invoker.config_file, root_build_dir),
+    ]
+
+    outputs = get_path_info(rebase_path(invoker.outputs, ".", invoker.out_dir),
+                            "abspath")
+
+    forward_variables_from(invoker,
+                           [
+                             "visibility",
+                             "deps",
+                             "public_deps",
+                           ])
+  }
+}
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template
index ca1f118f..3c8fc15b3 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/BackendCallback_h.template
@@ -11,7 +11,7 @@
 namespace {{namespace}} {
 {% endfor %}
 
-class {{config.class_export.macro}} BackendCallback {
+class {{config.lib.export_macro}} BackendCallback {
 public:
     virtual ~BackendCallback() { }
     virtual void sendFailure(const ErrorString&) = 0;
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template
index 0c769331..17fd870 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/DispatcherBase_h.template
@@ -17,11 +17,11 @@
 
 class WeakPtr;
 
-class {{config.class_export.macro}} DispatcherBase {
+class {{config.lib.export_macro}} DispatcherBase {
     PROTOCOL_DISALLOW_COPY(DispatcherBase);
 public:
     static const char kInvalidRequest[];
-    class {{config.class_export.macro}} WeakPtr {
+    class {{config.lib.export_macro}} WeakPtr {
     public:
         explicit WeakPtr(DispatcherBase*);
         ~WeakPtr();
@@ -32,7 +32,7 @@
         DispatcherBase* m_dispatcher;
     };
 
-    class {{config.class_export.macro}} Callback : public protocol::BackendCallback {
+    class {{config.lib.export_macro}} Callback : public protocol::BackendCallback {
     public:
         Callback(std::unique_ptr<WeakPtr> backendImpl, int callId);
         virtual ~Callback();
@@ -76,7 +76,7 @@
     protocol::HashSet<WeakPtr*> m_weakPtrs;
 };
 
-class {{config.class_export.macro}} UberDispatcher {
+class {{config.lib.export_macro}} UberDispatcher {
     PROTOCOL_DISALLOW_COPY(UberDispatcher);
 public:
     explicit UberDispatcher(FrontendChannel*);
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template
index ac4783e..9d2a192 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/ErrorSupport_h.template
@@ -11,7 +11,7 @@
 namespace {{namespace}} {
 {% endfor %}
 
-class {{config.class_export.macro}} ErrorSupport {
+class {{config.lib.export_macro}} ErrorSupport {
 public:
     ErrorSupport();
     ErrorSupport(String* errorString);
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template
index b1b1f8bb..2ad3897 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/Forward_h.template
@@ -5,9 +5,11 @@
 #ifndef {{"_".join(config.protocol.namespace)}}_Forward_h
 #define {{"_".join(config.protocol.namespace)}}_Forward_h
 
-#include "{{config.class_export.header}}"
-#include "{{config.lib.platform_header}}"
-#include "{{config.lib.string_header}}"
+{% if config.lib.export_header %}
+#include {{format_include(config.lib.export_header)}}
+{% endif %}
+#include {{format_include(config.lib.platform_header)}}
+#include {{format_include(config.lib.string_header)}}
 
 #include <vector>
 
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template
index 64701e6..8b653b58 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/FrontendChannel_h.template
@@ -9,7 +9,7 @@
 namespace {{namespace}} {
 {% endfor %}
 
-class {{config.class_export.macro}} FrontendChannel {
+class {{config.lib.export_macro}} FrontendChannel {
 public:
     virtual ~FrontendChannel() { }
     virtual void sendProtocolResponse(int callId, const String& message) = 0;
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template
index 611b794..4ccd88bd 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/Object_h.template
@@ -13,7 +13,7 @@
 namespace {{namespace}} {
 {% endfor %}
 
-class {{config.class_export.macro}} Object {
+class {{config.lib.export_macro}} Object {
 public:
     static std::unique_ptr<Object> parse(protocol::Value*, ErrorSupport*);
     ~Object();
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template
index 5172438..7b2a29b6c 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/Parser_h.template
@@ -12,8 +12,8 @@
 namespace {{namespace}} {
 {% endfor %}
 
-{{config.class_export.macro}} std::unique_ptr<Value> parseJSON(const uint8_t*, unsigned);
-{{config.class_export.macro}} std::unique_ptr<Value> parseJSON(const uint16_t*, unsigned);
+{{config.lib.export_macro}} std::unique_ptr<Value> parseJSON(const uint8_t*, unsigned);
+{{config.lib.export_macro}} std::unique_ptr<Value> parseJSON(const uint16_t*, unsigned);
 
 {% for namespace in config.protocol.namespace %}
 } // namespace {{namespace}}
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template b/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template
index 9199ab25..8f75ef2 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/lib/Values_h.template
@@ -17,7 +17,7 @@
 class DictionaryValue;
 class Value;
 
-class {{config.class_export.macro}} Value {
+class {{config.lib.export_macro}} Value {
     PROTOCOL_DISALLOW_COPY(Value);
 public:
     virtual ~Value() { }
@@ -63,7 +63,7 @@
     ValueType m_type;
 };
 
-class {{config.class_export.macro}} FundamentalValue : public Value {
+class {{config.lib.export_macro}} FundamentalValue : public Value {
 public:
     static std::unique_ptr<FundamentalValue> create(bool value)
     {
@@ -98,7 +98,7 @@
     };
 };
 
-class {{config.class_export.macro}} StringValue : public Value {
+class {{config.lib.export_macro}} StringValue : public Value {
 public:
     static std::unique_ptr<StringValue> create(const String& value)
     {
@@ -121,7 +121,7 @@
     String m_stringValue;
 };
 
-class {{config.class_export.macro}} SerializedValue : public Value {
+class {{config.lib.export_macro}} SerializedValue : public Value {
 public:
     static std::unique_ptr<SerializedValue> create(const String& value)
     {
@@ -138,7 +138,7 @@
     String m_serializedValue;
 };
 
-class {{config.class_export.macro}} DictionaryValue : public Value {
+class {{config.lib.export_macro}} DictionaryValue : public Value {
 public:
     using Entry = std::pair<String, Value*>;
     static std::unique_ptr<DictionaryValue> create()
@@ -205,7 +205,7 @@
     std::vector<String> m_order;
 };
 
-class {{config.class_export.macro}} ListValue : public Value {
+class {{config.lib.export_macro}} ListValue : public Value {
 public:
     static std::unique_ptr<ListValue> create()
     {
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json b/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json
index f21398d..82d7845d 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json
+++ b/third_party/WebKit/Source/platform/inspector_protocol/sample_config.json
@@ -3,7 +3,9 @@
         "path": "./relative/path/protocol/sample_protocol.json",
         "package": "include/generated/files/like/this",
         "output": "place/generated/files/here",
-        "namespace": ["sample_project", "protocol"]
+        "namespace": ["sample_project", "protocol"],
+        "export_macro": "LIB_EXPORT",
+        "export_header": "lib/lib_export.h"
     },
 
     "exported": {
@@ -12,12 +14,15 @@
         "string_header": "include/exported/string.h",
         "string_in": "String",
         "string_out": "String",
-        "to_string_out": "toString(%s)"
+        "to_string_out": "toString(%s)",
+        "export_macro": "LIB_EXPORT",
+        "export_header": "lib/lib_export.h"
     },
 
     "imported": {
         "path": "../relative/path/imported_protocol.json",
-        "package": "include/imported/files/like/this",
+        "package": "either/include/imported/files/from/here",
+        "header": "or/include/them/all/together/like/this/imported_protocol.h",
         "to_imported_string": "toImportedString(%s)",
         "from_imported_string": "fromImportedString(%s)",
         "namespace": ["imported_project", "protocol"]
@@ -27,11 +32,8 @@
         "package": "include/lib/files/like/this",
         "output": "place/generated/lib/files/here",
         "string_header": "string/implementation.h",
-        "platform_header": "platform/implementation.h"
-    },
-
-    "class_export": {
-        "macro": "LIB_EXPORT",
-        "header": "lib/lib_export.h"
+        "platform_header": "platform/implementation.h",
+        "export_macro": "LIB_EXPORT",
+        "export_header": "lib/lib_export.h"
     }
 }
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template b/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template
index d0c76d8..3357f95 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/templates/Exported_h.template
@@ -7,8 +7,10 @@
 #ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_api_h
 #define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_api_h
 
-#include "{{config.class_export.header}}"
-#include "{{config.exported.string_header}}"
+{% if config.exported.export_header %}
+#include {{format_include(config.exported.export_header)}}
+{% endif %}
+#include {{format_include(config.exported.string_header)}}
 
 {% for namespace in config.protocol.namespace %}
 namespace {{namespace}} {
@@ -22,7 +24,7 @@
 
 namespace {{type.id}}Enum {
       {% for literal in type.enum %}
-{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}};
+{{config.exported.export_macro}} extern const char* {{ literal | dash_to_camelcase}};
       {% endfor %}
 } // {{type.id}}Enum
     {% endif %}
@@ -34,7 +36,7 @@
 namespace {{command.name | to_title_case}} {
 namespace {{param.name | to_title_case}}Enum {
         {% for literal in param.enum %}
-{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}};
+{{config.exported.export_macro}} extern const char* {{ literal | dash_to_camelcase}};
         {% endfor %}
 } // {{param.name | to_title_case}}Enum
 } // {{command.name | to_title_case }}
@@ -46,7 +48,7 @@
   {% for type in domain.types %}
     {% if not (type.type == "object") or not ("properties" in type) or not (type.exported) %}{% continue %}{% endif %}
 
-class {{config.class_export.macro}} {{type.id}} {
+class {{config.exported.export_macro}} {{type.id}} {
 public:
     virtual {{config.exported.string_out}} toJSONString() const = 0;
     virtual ~{{type.id}}() { }
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template b/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template
index afd9ce7..c23b8fe 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/templates/Imported_h.template
@@ -8,7 +8,7 @@
 #define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_imported_h
 
 #include "{{config.protocol.package}}/Protocol.h"
-#include "{{config.imported.package}}/{{domain.domain}}.h"
+#include {{format_include(config.imported.header if config.imported.header else "\"%s/%s.h\"" % (config.imported.package, domain.domain))}}
 
 {% for namespace in config.protocol.namespace %}
 namespace {{namespace}} {
diff --git a/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template b/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template
index e0d782d..b72cdf220 100644
--- a/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template
+++ b/third_party/WebKit/Source/platform/inspector_protocol/templates/TypeBuilder_h.template
@@ -7,7 +7,9 @@
 #ifndef {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h
 #define {{"_".join(config.protocol.namespace)}}_{{domain.domain}}_h
 
-#include "{{config.class_export.header}}"
+{% if config.protocol.export_header %}
+#include {{format_include(config.protocol.export_header)}}
+{% endif %}
 #include "{{config.protocol.package}}/Protocol.h"
 // For each imported domain we generate a ValueConversions struct instead of a full domain definition
 // and include Domain::API version from there.
@@ -43,7 +45,7 @@
 
 namespace {{type.id}}Enum {
       {% for literal in type.enum %}
-{{config.class_export.macro}} extern const char* {{ literal | dash_to_camelcase}};
+{{config.protocol.export_macro}} extern const char* {{ literal | dash_to_camelcase}};
       {% endfor %}
 } // namespace {{type.id}}Enum
     {% endif %}
@@ -55,7 +57,7 @@
 namespace {{command.name | to_title_case}} {
 namespace {{param.name | to_title_case}}Enum {
         {% for literal in param.enum %}
-{{config.class_export.macro}} extern const char* {{literal | dash_to_camelcase}};
+{{config.protocol.export_macro}} extern const char* {{literal | dash_to_camelcase}};
         {% endfor %}
 } // {{param.name | to_title_case}}Enum
 } // {{command.name | to_title_case }}
@@ -69,7 +71,7 @@
     {% set type_def = type_definition(domain.domain + "." + type.id)%}
 
 // {{type.description}}
-class {{config.class_export.macro}} {{type.id}} {% if type.exported %}: public API::{{type.id}} {% endif %}{
+class {{config.protocol.export_macro}} {{type.id}} {% if type.exported %}: public API::{{type.id}} {% endif %}{
     PROTOCOL_DISALLOW_COPY({{type.id}});
 public:
     static std::unique_ptr<{{type.id}}> parse(protocol::Value* value, ErrorSupport* errors);
@@ -78,7 +80,7 @@
     {% for property in type.properties %}
       {% if "enum" in property %}
 
-    struct {{config.class_export.macro}} {{property.name | to_title_case}}Enum {
+    struct {{config.protocol.export_macro}} {{property.name | to_title_case}}Enum {
         {% for literal in property.enum %}
         static const char* {{literal | dash_to_camelcase}};
         {% endfor %}
@@ -181,13 +183,13 @@
 
 // ------------- Backend interface.
 
-class {{config.class_export.macro}} Backend {
+class {{config.protocol.export_macro}} Backend {
 public:
   {% for command in domain.commands %}
     {% if "redirect" in command %}{% continue %}{% endif %}
     {% if ("handlers" in command) and not ("renderer" in command["handlers"]) %}{% continue %}{% endif %}
     {% if "async" in command %}
-    class {{config.class_export.macro}} {{command.name | to_title_case}}Callback : public BackendCallback {
+    class {{config.protocol.export_macro}} {{command.name | to_title_case}}Callback : public BackendCallback {
     public:
         virtual void sendSuccess(
             {%- for parameter in command.returns -%}
@@ -238,7 +240,7 @@
 
 // ------------- Frontend interface.
 
-class {{config.class_export.macro}} Frontend {
+class {{config.protocol.export_macro}} Frontend {
 public:
     Frontend(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { }
   {% for event in domain.events %}
@@ -261,7 +263,7 @@
 
 // ------------- Dispatcher.
 
-class {{config.class_export.macro}} Dispatcher {
+class {{config.protocol.export_macro}} Dispatcher {
 public:
     static void wire(UberDispatcher*, Backend*);
 
@@ -271,7 +273,7 @@
 
 // ------------- Metainfo.
 
-class {{config.class_export.macro}} Metainfo {
+class {{config.protocol.export_macro}} Metainfo {
 public:
     using BackendClass = Backend;
     using FrontendClass = Frontend;
diff --git a/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.cpp b/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.cpp
index 26fe8ab..aca0676c 100644
--- a/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.cpp
+++ b/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.cpp
@@ -69,9 +69,9 @@
 
 MHTMLArchive* MHTMLArchive::create(const KURL& url, PassRefPtr<SharedBuffer> data)
 {
-    // MHTML pages can only be loaded from local URLs and http/https URLs.
+    // MHTML pages can only be loaded from local URLs, http/https URLs, and content URLs(Android specific).
     // The latter is now allowed due to full sandboxing enforcement on MHTML pages.
-    if (!SchemeRegistry::shouldTreatURLSchemeAsLocal(url.protocol()) && !url.protocolIsInHTTPFamily())
+    if (!canLoadArchive(url))
         return nullptr;
 
     MHTMLParser parser(data);
@@ -91,6 +91,21 @@
     return archive;
 }
 
+bool MHTMLArchive::canLoadArchive(const KURL& url)
+{
+    // MHTML pages can only be loaded from local URLs, http/https URLs, and content URLs(Android specific).
+    // The latter is now allowed due to full sandboxing enforcement on MHTML pages.
+    if (SchemeRegistry::shouldTreatURLSchemeAsLocal(url.protocol()))
+        return true;
+    if (url.protocolIsInHTTPFamily())
+        return true;
+#if OS(ANDROID)
+    if (url.protocolIs("content"))
+        return true;
+#endif
+    return false;
+}
+
 void MHTMLArchive::generateMHTMLHeader(
     const String& boundary, const String& title, const String& mimeType,
     SharedBuffer& outputBuffer)
diff --git a/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.h b/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.h
index a05fa1c1..2eece57 100644
--- a/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.h
+++ b/third_party/WebKit/Source/platform/mhtml/MHTMLArchive.h
@@ -98,6 +98,7 @@
 
     void setMainResource(ArchiveResource*);
     void addSubresource(ArchiveResource*);
+    static bool canLoadArchive(const KURL&);
 
     Member<ArchiveResource> m_mainResource;
     SubArchiveResources m_subresources;
diff --git a/third_party/WebKit/Source/platform/v8_inspector/inspector_protocol_config.json b/third_party/WebKit/Source/platform/v8_inspector/inspector_protocol_config.json
index d2115b1..e627d5e 100644
--- a/third_party/WebKit/Source/platform/v8_inspector/inspector_protocol_config.json
+++ b/third_party/WebKit/Source/platform/v8_inspector/inspector_protocol_config.json
@@ -3,7 +3,9 @@
         "path": "js_protocol.json",
         "package": "platform/v8_inspector/protocol",
         "output": "v8_inspector/protocol",
-        "namespace": ["v8_inspector", "protocol"]
+        "namespace": ["v8_inspector", "protocol"],
+        "export_macro": "PLATFORM_EXPORT",
+        "export_header": "platform/PlatformExport.h"
     },
 
     "exported": {
@@ -12,18 +14,17 @@
         "string_header": "platform/v8_inspector/public/StringBuffer.h",
         "string_in": "StringView",
         "string_out": "std::unique_ptr<StringBuffer>",
-        "to_string_out": "StringBufferImpl::adopt(%s)"
+        "to_string_out": "StringBufferImpl::adopt(%s)",
+        "export_macro": "PLATFORM_EXPORT",
+        "export_header": "platform/PlatformExport.h"
     },
 
     "lib": {
         "package": "platform/v8_inspector/protocol",
         "output": "v8_inspector/protocol",
         "string_header": "platform/v8_inspector/StringUtil.h",
-        "platform_header": "platform/v8_inspector/ProtocolPlatform.h"
-    },
-
-    "class_export": {
-        "macro": "PLATFORM_EXPORT",
-        "header": "platform/PlatformExport.h"
+        "platform_header": "platform/v8_inspector/ProtocolPlatform.h",
+        "export_macro": "PLATFORM_EXPORT",
+        "export_header": "platform/PlatformExport.h"
     }
 }
diff --git a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
index d854625..d010d78 100644
--- a/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
+++ b/third_party/WebKit/Source/web/FrameLoaderClientImpl.cpp
@@ -909,11 +909,6 @@
     m_webFrame->client()->didChangeFrameOwnerProperties(WebFrame::fromFrame(frameElement->contentFrame()), WebFrameOwnerProperties(frameElement->scrollingMode(), frameElement->marginWidth(), frameElement->marginHeight(), frameElement->allowFullscreen(), frameElement->delegatedPermissions()));
 }
 
-void FrameLoaderClientImpl::dispatchWillOpenWebSocket(WebSocketHandle* handle)
-{
-    m_webFrame->client()->willOpenWebSocket(handle);
-}
-
 void FrameLoaderClientImpl::dispatchWillStartUsingPeerConnectionHandler(WebRTCPeerConnectionHandler* handler)
 {
     m_webFrame->client()->willStartUsingPeerConnectionHandler(handler);
diff --git a/third_party/WebKit/Source/web/FrameLoaderClientImpl.h b/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
index 52d4cf79..582f9d5 100644
--- a/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
+++ b/third_party/WebKit/Source/web/FrameLoaderClientImpl.h
@@ -155,8 +155,6 @@
     void didAddContentSecurityPolicy(const String& headerValue, ContentSecurityPolicyHeaderType, ContentSecurityPolicyHeaderSource) override;
     void didChangeFrameOwnerProperties(HTMLFrameElementBase*) override;
 
-    void dispatchWillOpenWebSocket(WebSocketHandle*) override;
-
     void dispatchWillStartUsingPeerConnectionHandler(WebRTCPeerConnectionHandler*) override;
 
     bool allowWebGL(bool enabledPerSettings) override;
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
index 1c7732c..86c93cf 100644
--- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
+++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.cpp
@@ -772,19 +772,13 @@
     return false;
 }
 
-bool WebFrameWidgetImpl::caretOrSelectionRange(size_t* location, size_t* length)
+WebRange WebFrameWidgetImpl::caretOrSelectionRange()
 {
     LocalFrame* focused = focusedLocalFrameInWidget();
     if (!focused)
-        return false;
+        return WebRange();
 
-    PlainTextRange selectionOffsets = focused->inputMethodController().getSelectionOffsets();
-    if (selectionOffsets.isNull())
-        return false;
-
-    *location = selectionOffsets.start();
-    *length = selectionOffsets.length();
-    return true;
+    return focused->inputMethodController().getSelectionOffsets();
 }
 
 void WebFrameWidgetImpl::setTextDirection(WebTextDirection direction)
diff --git a/third_party/WebKit/Source/web/WebFrameWidgetImpl.h b/third_party/WebKit/Source/web/WebFrameWidgetImpl.h
index 34e3310..8cb6410b 100644
--- a/third_party/WebKit/Source/web/WebFrameWidgetImpl.h
+++ b/third_party/WebKit/Source/web/WebFrameWidgetImpl.h
@@ -108,7 +108,7 @@
     bool selectionBounds(WebRect& anchor, WebRect& focus) const override;
     bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const override;
     bool isSelectionAnchorFirst() const override;
-    bool caretOrSelectionRange(size_t* location, size_t* length) override;
+    WebRange caretOrSelectionRange() override;
     void setTextDirection(WebTextDirection) override;
     bool isAcceleratedCompositingActive() const override;
     void willCloseLayerTreeView() override;
diff --git a/third_party/WebKit/Source/web/WebRange.cpp b/third_party/WebKit/Source/web/WebRange.cpp
index a877e8a4..05d91f0 100644
--- a/third_party/WebKit/Source/web/WebRange.cpp
+++ b/third_party/WebKit/Source/web/WebRange.cpp
@@ -54,6 +54,15 @@
     m_end =range.endPosition().computeOffsetInContainerNode();
 }
 
+WebRange::WebRange(const PlainTextRange& range)
+{
+    if (range.isNull())
+        return;
+
+    m_start = range.start();
+    m_end = range.end();
+}
+
 EphemeralRange WebRange::createEphemeralRange(LocalFrame* frame) const
 {
     Element* selectionRoot = frame->selection().rootEditableElement();
diff --git a/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp b/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp
index f51f09a1..125dd4cd 100644
--- a/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp
+++ b/third_party/WebKit/Source/web/WebSharedWorkerImpl.cpp
@@ -199,6 +199,11 @@
     return m_networkProvider->serviceWorkerID(dataSource);
 }
 
+InterfaceProvider* WebSharedWorkerImpl::interfaceProvider()
+{
+    return Platform::current()->interfaceProvider();
+}
+
 void WebSharedWorkerImpl::sendProtocolMessage(int sessionId, int callId, const WebString& message, const WebString& state)
 {
     m_client->sendDevToolsMessage(sessionId, callId, message, state);
diff --git a/third_party/WebKit/Source/web/WebSharedWorkerImpl.h b/third_party/WebKit/Source/web/WebSharedWorkerImpl.h
index 90ea06f..25376102 100644
--- a/third_party/WebKit/Source/web/WebSharedWorkerImpl.h
+++ b/third_party/WebKit/Source/web/WebSharedWorkerImpl.h
@@ -91,6 +91,7 @@
     void didFinishDocumentLoad(WebLocalFrame*) override;
     bool isControlledByServiceWorker(WebDataSource&) override;
     int64_t serviceWorkerID(WebDataSource&) override;
+    InterfaceProvider* interfaceProvider() override;
 
     // WebDevToolsAgentClient overrides.
     void sendProtocolMessage(int sessionId, int callId, const WebString&, const WebString&) override;
diff --git a/third_party/WebKit/Source/web/WebViewFrameWidget.cpp b/third_party/WebKit/Source/web/WebViewFrameWidget.cpp
index 2f3102d..dcc5b6a5 100644
--- a/third_party/WebKit/Source/web/WebViewFrameWidget.cpp
+++ b/third_party/WebKit/Source/web/WebViewFrameWidget.cpp
@@ -182,9 +182,9 @@
     return m_webView->isSelectionAnchorFirst();
 }
 
-bool WebViewFrameWidget::caretOrSelectionRange(size_t* location, size_t* length)
+WebRange WebViewFrameWidget::caretOrSelectionRange()
 {
-    return m_webView->caretOrSelectionRange(location, length);
+    return m_webView->caretOrSelectionRange();
 }
 
 void WebViewFrameWidget::setTextDirection(WebTextDirection direction)
diff --git a/third_party/WebKit/Source/web/WebViewFrameWidget.h b/third_party/WebKit/Source/web/WebViewFrameWidget.h
index 11dfba68..4da770b 100644
--- a/third_party/WebKit/Source/web/WebViewFrameWidget.h
+++ b/third_party/WebKit/Source/web/WebViewFrameWidget.h
@@ -75,7 +75,7 @@
     bool selectionBounds(WebRect& anchor, WebRect& focus) const override;
     bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const override;
     bool isSelectionAnchorFirst() const override;
-    bool caretOrSelectionRange(size_t* location, size_t* length) override;
+    WebRange caretOrSelectionRange() override;
     void setTextDirection(WebTextDirection) override;
     bool isAcceleratedCompositingActive() const override;
     bool isWebView() const override { return false; }
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
index 42b213ca..6a5ae67 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -2713,19 +2713,13 @@
     return m_pagePopup.get();
 }
 
-bool WebViewImpl::caretOrSelectionRange(size_t* location, size_t* length)
+WebRange WebViewImpl::caretOrSelectionRange()
 {
     const LocalFrame* focused = focusedLocalFrameInWidget();
     if (!focused)
-        return false;
+        return WebRange();
 
-    PlainTextRange selectionOffsets = focused->inputMethodController().getSelectionOffsets();
-    if (selectionOffsets.isNull())
-        return false;
-
-    *location = selectionOffsets.start();
-    *length = selectionOffsets.length();
-    return true;
+    return focused->inputMethodController().getSelectionOffsets();
 }
 
 void WebViewImpl::setTextDirection(WebTextDirection direction)
diff --git a/third_party/WebKit/Source/web/WebViewImpl.h b/third_party/WebKit/Source/web/WebViewImpl.h
index 26e93e7..6e323813 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.h
+++ b/third_party/WebKit/Source/web/WebViewImpl.h
@@ -152,7 +152,7 @@
     bool selectionBounds(WebRect& anchor, WebRect& focus) const override;
     bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const override;
     bool isSelectionAnchorFirst() const override;
-    bool caretOrSelectionRange(size_t* location, size_t* length) override;
+    WebRange caretOrSelectionRange() override;
     void setTextDirection(WebTextDirection) override;
     bool isAcceleratedCompositingActive() const override;
     void willCloseLayerTreeView() override;
diff --git a/third_party/WebKit/Source/web/tests/MHTMLTest.cpp b/third_party/WebKit/Source/web/tests/MHTMLTest.cpp
index 57d252c..08a8ce2e 100644
--- a/third_party/WebKit/Source/web/tests/MHTMLTest.cpp
+++ b/third_party/WebKit/Source/web/tests/MHTMLTest.cpp
@@ -241,11 +241,17 @@
     addTestResources();
     RefPtr<SharedBuffer> data = serialize("Test Serialization", "text/html", MHTMLArchive::UseDefaultEncoding);
     KURL httpURL = toKURL("http://www.example.com");
+    KURL contentURL = toKURL("content://foo");
     KURL fileURL = toKURL("file://foo");
     KURL specialSchemeURL = toKURL("fooscheme://bar");
 
-    // MHTMLArchives can only be initialized from local schemes and http/https schemes.
+    // MHTMLArchives can only be initialized from local schemes, http/https schemes, and content scheme(Android specific).
     EXPECT_NE(nullptr, MHTMLArchive::create(httpURL, data.get()));
+#if OS(ANDROID)
+    EXPECT_NE(nullptr, MHTMLArchive::create(contentURL, data.get()));
+#else
+    EXPECT_EQ(nullptr, MHTMLArchive::create(contentURL, data.get()));
+#endif
     EXPECT_NE(nullptr, MHTMLArchive::create(fileURL, data.get()));
     EXPECT_EQ(nullptr, MHTMLArchive::create(specialSchemeURL, data.get()));
     SchemeRegistry::registerURLSchemeAsLocal("fooscheme");
diff --git a/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp
index e78a0eb..66da4461 100644
--- a/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp
+++ b/third_party/WebKit/Source/web/tests/ResizeObserverTest.cpp
@@ -4,9 +4,14 @@
 
 #include "core/observer/ResizeObserver.h"
 
+#include "bindings/core/v8/ScriptController.h"
+#include "bindings/core/v8/ScriptSourceCode.h"
+#include "bindings/core/v8/V8GCController.h"
 #include "core/observer/ResizeObservation.h"
 #include "core/observer/ResizeObserverCallback.h"
+#include "core/observer/ResizeObserverController.h"
 #include "platform/testing/UnitTestHelpers.h"
+#include "public/web/WebHeap.h"
 #include "web/WebViewImpl.h"
 #include "web/tests/sim/SimCompositor.h"
 #include "web/tests/sim/SimDisplayItemList.h"
@@ -50,9 +55,9 @@
  * modify target size
  * oubservationSizeOutOfSync == true
  */
-class ResizeObservationUnitTest : public SimTest { };
+class ResizeObserverUnitTest : public SimTest { };
 
-TEST_F(ResizeObservationUnitTest, ObserveSchedulesFrame)
+TEST_F(ResizeObserverUnitTest, ResizeObservationSize)
 {
     SimRequest mainResource("https://example.com/", "text/html");
     loadURL("https://example.com/");
@@ -95,4 +100,51 @@
     ASSERT_EQ(svgObservation->targetDepth() - domObservation->targetDepth(), (size_t)1);
 }
 
+TEST_F(ResizeObserverUnitTest, TestMemoryLeaks)
+{
+
+    ResizeObserverController& controller = document().ensureResizeObserverController();
+    const HeapHashSet<WeakMember<ResizeObserver>>& observers = controller.observers();
+    ASSERT_EQ(observers.size(), 0U);
+    v8::HandleScope scope(v8::Isolate::GetCurrent());
+
+    ScriptController& script = document().executingFrame()->script();
+
+    //
+    // Test whether ResizeObserver is kept alive by direct JS reference
+    //
+    script.executeScriptInMainWorldAndReturnValue(
+        ScriptSourceCode("var ro = new ResizeObserver( entries => {});"),
+        ScriptController::ExecuteScriptWhenScriptsDisabled);
+    ASSERT_EQ(observers.size(), 1U);
+    script.executeScriptInMainWorldAndReturnValue(
+        ScriptSourceCode("ro = undefined;"),
+        ScriptController::ExecuteScriptWhenScriptsDisabled);
+    V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent());
+    WebHeap::collectAllGarbageForTesting();
+    ASSERT_EQ(observers.isEmpty(), true);
+
+    //
+    // Test whether ResizeObserver is kept alive by an Element
+    //
+    script.executeScriptInMainWorldAndReturnValue(
+        ScriptSourceCode(
+            "var ro = new ResizeObserver( () => {});"
+            "var el = document.createElement('div');"
+            "ro.observe(el);"
+            "ro = undefined;"
+        ),
+        ScriptController::ExecuteScriptWhenScriptsDisabled);
+    ASSERT_EQ(observers.size(), 1U);
+    V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent());
+    WebHeap::collectAllGarbageForTesting();
+    ASSERT_EQ(observers.size(), 1U);
+    script.executeScriptInMainWorldAndReturnValue(
+        ScriptSourceCode("el = undefined;"),
+        ScriptController::ExecuteScriptWhenScriptsDisabled);
+    V8GCController::collectAllGarbageForTesting(v8::Isolate::GetCurrent());
+    WebHeap::collectAllGarbageForTesting();
+    ASSERT_EQ(observers.isEmpty(), true);
+}
+
 } // namespace blink
diff --git a/third_party/WebKit/Source/web/tests/WebViewTest.cpp b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
index c07d091f..ebda5112b4 100644
--- a/third_party/WebKit/Source/web/tests/WebViewTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebViewTest.cpp
@@ -1734,6 +1734,30 @@
     EXPECT_EQ(WebInputEventResult::HandledSystem, webView->handleInputEvent(event));
 }
 
+TEST_F(WebViewTest, showContextMenuOnLongPressingLinks)
+{
+    URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()),
+        WebString::fromUTF8("long_press_links_and_images.html"));
+
+    URLTestHelpers::registerMockedURLLoad(toKURL("http://www.test.com/foo.png"), "white-1x1.png");
+    WebViewImpl* webView = m_webViewHelper.initializeAndLoad(
+        m_baseURL + "long_press_links_and_images.html", true);
+
+    webView->settingsImpl()->setTouchDragDropEnabled(true);
+    webView->resize(WebSize(500, 300));
+    webView->updateAllLifecyclePhases();
+    runPendingTasks();
+
+    WebString anchorTagId = WebString::fromUTF8("anchorTag");
+    WebString imageTagId = WebString::fromUTF8("imageTag");
+
+    EXPECT_TRUE(tapElementById(WebInputEvent::GestureLongPress, anchorTagId));
+    EXPECT_STREQ("anchor contextmenu", webView->mainFrame()->document().title().utf8().data());
+
+    EXPECT_TRUE(tapElementById(WebInputEvent::GestureLongPress, imageTagId));
+    EXPECT_STREQ("image contextmenu", webView->mainFrame()->document().title().utf8().data());
+}
+
 TEST_F(WebViewTest, LongPressEmptyEditableSelection)
 {
     URLTestHelpers::registerMockedURLFromBaseURL(WebString::fromUTF8(m_baseURL.c_str()),
@@ -1848,10 +1872,10 @@
     WebString image = WebString::fromUTF8("purpleimage");
 
     EXPECT_TRUE(tapElementById(WebInputEvent::GestureLongPress, image));
-    size_t location, length;
-    EXPECT_TRUE(webView->caretOrSelectionRange(&location, &length));
-    EXPECT_EQ(0UL, location);
-    EXPECT_EQ(1UL, length);
+    WebRange range = webView->caretOrSelectionRange();
+    EXPECT_FALSE(range.isNull());
+    EXPECT_EQ(0, range.startOffset());
+    EXPECT_EQ(1, range.length());
 }
 
 TEST_F(WebViewTest, BlinkCaretAfterLongPress)
@@ -1916,11 +1940,10 @@
     WebLocalFrameImpl* frame = webView->mainFrameImpl();
     EXPECT_EQ(testWord, std::string(frame->selectionAsText().utf8().data()));
 
-    size_t location;
-    size_t length;
-    EXPECT_TRUE(webView->caretOrSelectionRange(&location, &length));
-    EXPECT_EQ(location, 0UL);
-    EXPECT_EQ(length, testWord.length());
+    WebRange range = webView->caretOrSelectionRange();
+    EXPECT_FALSE(range.isNull());
+    EXPECT_EQ(0, range.startOffset());
+    EXPECT_EQ(static_cast<int>(testWord.length()), range.length());
 }
 
 static void configueCompositingWebView(WebSettings* settings)
diff --git a/third_party/WebKit/Source/web/tests/data/long_press_links_and_images.html b/third_party/WebKit/Source/web/tests/data/long_press_links_and_images.html
new file mode 100644
index 0000000..ea0b29fe7
--- /dev/null
+++ b/third_party/WebKit/Source/web/tests/data/long_press_links_and_images.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+ <script>
+   function onLoad() {
+    var anchor = document.getElementById("anchorTag");
+    anchor.addEventListener("dragstart", function(event) { document.title = "anchor dragstart"; });
+    anchor.addEventListener("contextmenu", function(event) { document.title = "anchor contextmenu"; });
+
+    var image = document.getElementById("imageTag");
+    image.addEventListener("dragstart", function(event) { document.title = "image dragstart"; });
+    image.addEventListener("contextmenu", function(event) { document.title = "image contextmenu"; })
+  }
+</script>
+</head>
+<body onload="onLoad()">
+  <a id="anchorTag" href="http://www.example.com">Link to example.com</a>
+    <img id="imageTag" src="foo.png" width="100" height="100"> Link to an image. </img>
+</body>
+<html>
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_parser_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_parser_unittest.py
index 85e340d..56735b3 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_parser_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_parser_unittest.py
@@ -201,7 +201,6 @@
         test_path = '/some/madeup/path/'
         parser = TestParser(test_path + 'somefile.html', MockHost(), options)
         test_info = parser.analyze_test(test_contents=test_html)
-
         self.assertEqual(test_info, None, 'test should have been skipped')
 
     def test_analyze_non_html_file(self):
@@ -210,3 +209,9 @@
         parser = TestParser(os.path.join(os.path.dirname(__file__), 'test_parser.py'), MockHost())
         test_info = parser.analyze_test()
         self.assertEqual(test_info, None, 'no tests should have been found in this file')
+
+    def test_parser_initialization_non_existent_file(self):
+        parser = TestParser('some/bogus/path.html', MockHost())
+        self.assertEqual(parser.filename, 'some/bogus/path.html')
+        self.assertIsNone(parser.test_doc)
+        self.assertIsNone(parser.ref_doc)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
index 7851f28..40029a0 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations.py
@@ -293,8 +293,8 @@
             testharness.js tests that required new baselines to be downloaded
             from `webkit-patch rebaseline-from-try-jobs`.
         """
-        tests = self.host.executive.run_command(['git', 'diff', 'master', '--name-only']).splitlines()
-        tests_to_rebaseline, tests_results = self.get_tests_to_rebaseline(tests, tests_results)
+        modified_files = self.host.executive.run_command(['git', 'diff', 'master', '--name-only']).splitlines()
+        tests_to_rebaseline, tests_results = self.get_tests_to_rebaseline(modified_files, tests_results)
         if tests_to_rebaseline:
             webkit_patch = self.host.filesystem.join(
                 self.finder.chromium_base(), self.finder.webkit_base(), self.finder.path_to_script('webkit-patch'))
@@ -304,10 +304,11 @@
                 'rebaseline-cl',
                 '--verbose',
                 '--no-trigger-jobs',
+                '--only-changed-tests',
             ] + tests_to_rebaseline)
         return tests_results
 
-    def get_tests_to_rebaseline(self, tests, tests_results):
+    def get_tests_to_rebaseline(self, modified_files, tests_results):
         """Returns a list of tests to download new baselines for.
 
         Creates a list of tests to rebaseline depending on the tests' platform-
@@ -315,7 +316,9 @@
         due to a baseline mismatch (rather than crash or timeout).
 
         Args:
-            tests: A list of new imported tests.
+            modified_files: A list of paths to modified files (which should
+                be added, removed or modified files in the imported w3c
+                directory), relative to the Chromium checkout root.
             tests_results: A dictionary of failing tests results.
 
         Returns:
@@ -326,9 +329,9 @@
         tests_to_rebaseline = set()
         layout_tests_rel_path = self.host.filesystem.relpath(
             self.finder.layout_tests_dir(), self.finder.chromium_base())
-        for test in tests:
-            test_path = self.host.filesystem.relpath(test, layout_tests_rel_path)
-            if self.is_js_test(test) and tests_results.get(test_path):
+        for file_path in modified_files:
+            test_path = self.host.filesystem.relpath(file_path, layout_tests_rel_path)
+            if self.is_js_test(test_path) and tests_results.get(test_path):
                 for platform in tests_results[test_path].keys():
                     if tests_results[test_path][platform]['actual'] not in ['CRASH', 'TIMEOUT']:
                         del tests_results[test_path][platform]
@@ -336,6 +339,14 @@
         return list(tests_to_rebaseline), tests_results
 
     def is_js_test(self, test_path):
-        absolute_path = self.host.filesystem.join(self.finder.chromium_base(), test_path)
+        """Checks whether a given file is a testharness.js test.
+
+        Args:
+            test_path: A file path relative to the layout tests directory.
+                This might correspond to a deleted file or a non-test.
+        """
+        absolute_path = self.host.filesystem.join(self.finder.layout_tests_dir(), test_path)
         test_parser = TestParser(absolute_path, self.host)
+        if not test_parser.test_doc:
+            return False
         return test_parser.is_jstest()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations_unittest.py
index 433bf72..a3928dc 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/update_w3c_test_expectations_unittest.py
@@ -199,24 +199,28 @@
         self.assertEqual(value, 'dont copy me\n\n# Tests added from W3C auto import bot\n[ ] but copy me')
 
     def test_is_js_test_true(self):
-        self.host.filesystem.files['/mock-checkout/foo/bar.html'] = '''
-        <script src="/resources/testharness.js"></script>'''
+        self.host.filesystem.files['/mock-checkout/third_party/WebKit/LayoutTests/foo/bar.html'] = (
+            '<script src="/resources/testharness.js"></script>')
         line_adder = W3CExpectationsLineAdder(self.host)
         self.assertTrue(line_adder.is_js_test('foo/bar.html'))
 
     def test_is_js_test_false(self):
-        self.host.filesystem.files['/mock-checkout/foo/bar.html'] = '''
-        <script src="ref-test.html"></script>'''
+        self.host.filesystem.files['/mock-checkout/third_party/WebKit/LayoutTests/foo/bar.html'] = (
+            '<script src="ref-test.html"></script>')
+        line_adder = W3CExpectationsLineAdder(self.host)
+        self.assertFalse(line_adder.is_js_test('foo/bar.html'))
+
+    def test_is_js_test_non_existent_file(self):
         line_adder = W3CExpectationsLineAdder(self.host)
         self.assertFalse(line_adder.is_js_test('foo/bar.html'))
 
     def test_get_test_to_rebaseline(self):
         self.host = MockHost()
-        self.host.filesystem.files['/mock-checkout/imported/fake/test/path.html'] = '''
-                <script src="/resources/testharness.js"></script>'''
+        self.host.filesystem.files['/mock-checkout/third_party/WebKit/LayoutTests/imported/fake/test/path.html'] = (
+            '<script src="/resources/testharness.js"></script>')
         line_adder = W3CExpectationsLineAdder(self.host)
-        tests = ['imported/fake/test/path.html']
-        test_dict = {'../../../imported/fake/test/path.html': self.mock_dict_two['imported/fake/test/path.html']}
+        tests = ['third_party/WebKit/LayoutTests/imported/fake/test/path.html']
+        test_dict = {'imported/fake/test/path.html': self.mock_dict_two['imported/fake/test/path.html']}
         tests_to_rebaseline, tests_results = line_adder.get_tests_to_rebaseline(tests, test_dict)
-        self.assertEqual(tests_to_rebaseline, ['../../../imported/fake/test/path.html'])
+        self.assertEqual(tests_to_rebaseline, ['imported/fake/test/path.html'])
         self.assertEqual(tests_results, test_dict)
diff --git a/third_party/WebKit/public/BUILD.gn b/third_party/WebKit/public/BUILD.gn
index 4ab7ae7..28769c56 100644
--- a/third_party/WebKit/public/BUILD.gn
+++ b/third_party/WebKit/public/BUILD.gn
@@ -52,8 +52,8 @@
   public_deps = [
     "//third_party/WebKit/Source/core",
     "//third_party/WebKit/Source/modules",
-    "//third_party/WebKit/Source/platform:blink_heap_unittests",
     "//third_party/WebKit/Source/platform:blink_platform_unittests",
+    "//third_party/WebKit/Source/platform/heap:blink_heap_unittests",
     "//third_party/WebKit/Source/web",
     "//third_party/WebKit/Source/web:webkit_unit_tests",
     "//third_party/WebKit/Source/wtf:wtf_unittests",
@@ -684,9 +684,10 @@
     "platform/modules/permissions/permission.mojom",
     "platform/modules/permissions/permission_status.mojom",
     "platform/modules/presentation/presentation.mojom",
+    "platform/modules/websockets/websocket.mojom",
   ]
-
   public_deps = [
+    "//url/mojo:url_mojom_gurl",
     "//url/mojo:url_mojom_origin",
   ]
 
diff --git a/third_party/WebKit/public/platform/Platform.h b/third_party/WebKit/public/platform/Platform.h
index b08300f0..f1d90b5f 100644
--- a/third_party/WebKit/public/platform/Platform.h
+++ b/third_party/WebKit/public/platform/Platform.h
@@ -107,7 +107,6 @@
 class WebScrollbarBehavior;
 class WebSecurityOrigin;
 class WebServiceWorkerCacheStorage;
-class WebSocketHandle;
 class WebSpeechSynthesizer;
 class WebSpeechSynthesizerClient;
 class WebStorageNamespace;
@@ -304,9 +303,6 @@
     // May return null.
     virtual WebPrescientNetworking* prescientNetworking() { return nullptr; }
 
-    // Returns a new WebSocketHandle instance.
-    virtual WebSocketHandle* createWebSocketHandle() { return nullptr; }
-
     // Returns the User-Agent string.
     virtual WebString userAgent() { return WebString(); }
 
diff --git a/third_party/WebKit/public/platform/modules/payments/payment_request.mojom b/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
index dc29676..161240f 100644
--- a/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
+++ b/third_party/WebKit/public/platform/modules/payments/payment_request.mojom
@@ -36,7 +36,9 @@
 // browser shows the amount in UI and forwards it on to the payment app, if it
 // requires the amount.
 struct PaymentCurrencyAmount {
-  // ISO 4217 currency code. Three upper case ASCII letters.
+  // The most common identifiers are three-letter alphabetic codes as defined
+  // by [ISO4217] (for example, "USD" for US Dollars), however any string of at
+  // most 2048 characters is considered valid.
   string currency;
 
   // ISO 20022 CurrencyAnd30Amount. Up to 30 total digits. Up to 10 fraction
diff --git a/third_party/WebKit/public/platform/modules/websockets/OWNERS b/third_party/WebKit/public/platform/modules/websockets/OWNERS
index c1f23ed..c33a575 100644
--- a/third_party/WebKit/public/platform/modules/websockets/OWNERS
+++ b/third_party/WebKit/public/platform/modules/websockets/OWNERS
@@ -1,2 +1,5 @@
 tyoshino@chromium.org
 yhirano@chromium.org
+
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h b/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h
deleted file mode 100644
index 0ab3a9a..0000000
--- a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeRequestInfo.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebSocketHandshakeRequestInfo_h
-#define WebSocketHandshakeRequestInfo_h
-
-#include "public/platform/WebCommon.h"
-#include "public/platform/WebNonCopyable.h"
-#include "public/platform/WebPrivatePtr.h"
-
-namespace blink {
-
-class WebString;
-class WebSocketHandshakeRequest;
-class WebURL;
-
-class WebSocketHandshakeRequestInfo : public WebNonCopyable {
-public:
-    BLINK_PLATFORM_EXPORT WebSocketHandshakeRequestInfo();
-    BLINK_PLATFORM_EXPORT ~WebSocketHandshakeRequestInfo();
-
-    BLINK_PLATFORM_EXPORT void setURL(const WebURL&);
-    BLINK_PLATFORM_EXPORT void addHeaderField(const WebString& name, const WebString& value);
-    BLINK_PLATFORM_EXPORT void setHeadersText(const WebString&);
-
-#if INSIDE_BLINK
-    BLINK_PLATFORM_EXPORT const WebSocketHandshakeRequest& toCoreRequest() const { return *m_private.get(); }
-#endif // INSIDE_BLINK
-
-private:
-    WebPrivatePtr<WebSocketHandshakeRequest> m_private;
-};
-
-} // namespace blink
-
-#endif // WebSocketHandshakeRequestInfo_h
diff --git a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h b/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h
deleted file mode 100644
index ec8847f..0000000
--- a/third_party/WebKit/public/platform/modules/websockets/WebSocketHandshakeResponseInfo.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WebSocketHandshakeResponseInfo_h
-#define WebSocketHandshakeResponseInfo_h
-
-#include "public/platform/WebCommon.h"
-#include "public/platform/WebNonCopyable.h"
-#include <memory>
-
-namespace blink {
-
-class WebString;
-class WebSocketHandshakeResponse;
-
-class WebSocketHandshakeResponseInfo : public WebNonCopyable {
-public:
-    BLINK_PLATFORM_EXPORT WebSocketHandshakeResponseInfo();
-    BLINK_PLATFORM_EXPORT ~WebSocketHandshakeResponseInfo();
-
-    BLINK_PLATFORM_EXPORT void setStatusCode(int);
-    BLINK_PLATFORM_EXPORT void setStatusText(const WebString&);
-    BLINK_PLATFORM_EXPORT void addHeaderField(const WebString& name, const WebString& value);
-    BLINK_PLATFORM_EXPORT void setHeadersText(const WebString&);
-
-#if INSIDE_BLINK
-    BLINK_PLATFORM_EXPORT const WebSocketHandshakeResponse& toCoreResponse() const { return *m_private.get(); }
-#endif // INSIDE_BLINK
-
-private:
-    std::unique_ptr<WebSocketHandshakeResponse> m_private;
-};
-
-} // namespace blink
-
-#endif // WebSocketHandshakeResponseInfo_h
diff --git a/content/common/websocket.mojom b/third_party/WebKit/public/platform/modules/websockets/websocket.mojom
similarity index 99%
rename from content/common/websocket.mojom
rename to third_party/WebKit/public/platform/modules/websockets/websocket.mojom
index 120f4e96..be0d4cf 100644
--- a/content/common/websocket.mojom
+++ b/third_party/WebKit/public/platform/modules/websockets/websocket.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-module content.mojom;
+module blink.mojom;
 
 import "url/mojo/origin.mojom";
 import "url/mojo/url.mojom";
diff --git a/third_party/WebKit/public/web/WebFrameClient.h b/third_party/WebKit/public/web/WebFrameClient.h
index 523b2d7..83e75a3 100644
--- a/third_party/WebKit/public/web/WebFrameClient.h
+++ b/third_party/WebKit/public/web/WebFrameClient.h
@@ -90,7 +90,6 @@
 class WebMediaSession;
 class WebMediaStream;
 class WebServiceWorkerProvider;
-class WebSocketHandle;
 class WebPlugin;
 class WebPresentationClient;
 class WebPushClient;
@@ -545,11 +544,6 @@
         unsigned long long newQuotaInBytes,
         WebStorageQuotaCallbacks) { }
 
-    // WebSocket -----------------------------------------------------
-
-    // A WebSocket object is going to open a new WebSocket connection.
-    virtual void willOpenWebSocket(WebSocketHandle*) { }
-
     // MediaStream -----------------------------------------------------
 
     // A new WebRTCPeerConnectionHandler is created.
diff --git a/third_party/WebKit/public/web/WebRange.h b/third_party/WebKit/public/web/WebRange.h
index a80d545..d02cb32 100644
--- a/third_party/WebKit/public/web/WebRange.h
+++ b/third_party/WebKit/public/web/WebRange.h
@@ -39,12 +39,14 @@
 namespace blink {
 
 class LocalFrame;
+class PlainTextRange;
 class Range;
 class WebString;
 
 class WebRange final {
 public:
     BLINK_EXPORT WebRange(int start, int length);
+    BLINK_EXPORT WebRange() {}
 
     int startOffset() const { return m_start; }
     int endOffset() const { return m_end; }
@@ -54,11 +56,14 @@
 
 #if BLINK_IMPLEMENTATION
     WebRange(const EphemeralRange&);
+    WebRange(const PlainTextRange&);
 
     EphemeralRange createEphemeralRange(LocalFrame*) const;
 #endif
 
 private:
+    // Note that this also matches the values for gfx::Range::InvalidRange
+    // for easy conversion.
     int m_start = -1;
     int m_end = -1;
 };
diff --git a/third_party/WebKit/public/web/WebWidget.h b/third_party/WebKit/public/web/WebWidget.h
index fa3c4fa..ea39de5 100644
--- a/third_party/WebKit/public/web/WebWidget.h
+++ b/third_party/WebKit/public/web/WebWidget.h
@@ -40,6 +40,7 @@
 #include "../platform/WebSize.h"
 #include "../platform/WebTopControlsState.h"
 #include "WebCompositionUnderline.h"
+#include "WebRange.h"
 #include "WebTextDirection.h"
 #include "WebTextInputInfo.h"
 
@@ -193,11 +194,8 @@
     // (i.e its anchor is its start).
     virtual bool isSelectionAnchorFirst() const { return false; }
 
-    // Fetch the current selection range of this WebWidget. If there is no
-    // selection, it will output a 0-length range with the location at the
-    // caret. Returns true and fills the out-paramters on success; returns false
-    // on failure.
-    virtual bool caretOrSelectionRange(size_t* location, size_t* length) { return false; }
+    // Fetch the current selection range of this WebWidget.
+    virtual WebRange caretOrSelectionRange() { return WebRange(); }
 
     // Changes the text direction of the selected input node.
     virtual void setTextDirection(WebTextDirection) { }
diff --git a/third_party/libvpx/generate_gypi.sh b/third_party/libvpx/generate_gypi.sh
index 13086d76..811200c 100755
--- a/third_party/libvpx/generate_gypi.sh
+++ b/third_party/libvpx/generate_gypi.sh
@@ -458,10 +458,11 @@
   # array entries.
   local vals=($(git --no-pager log -1 --format="%cd%n%H" \
     --date=format:"%A %B %d %Y"))
-  sed -E -i '' \
+  sed -E -i.bak \
     -e "s/^(Date:)[[:space:]]+.*$/\1 ${vals[0]}/" \
     -e "s/^(Commit:)[[:space:]]+[a-f0-9]{40}/\1 ${vals[1]}/" \
     ${BASE_DIR}/README.chromium
+  rm ${BASE_DIR}/README.chromium.bak
   cat <<EOF
 
 README.chromium updated with:
diff --git a/tools/auto_bisect/fetch_build.py b/tools/auto_bisect/fetch_build.py
index 27cd668..321bc82 100644
--- a/tools/auto_bisect/fetch_build.py
+++ b/tools/auto_bisect/fetch_build.py
@@ -22,12 +22,12 @@
 import sys
 import zipfile
 
-_CATAPULT_BASE_PATH = os.path.abspath(os.path.join(
+_PY_UTILS_PATH = os.path.abspath(os.path.join(
     os.path.dirname(__file__), '..', '..', 'third_party', 'catapult',
-    'catapult_base'))
-if _CATAPULT_BASE_PATH not in sys.path:
-  sys.path.insert(1, _CATAPULT_BASE_PATH)
-from catapult_base import cloud_storage
+    'common', 'py_utils'))
+if _PY_UTILS_PATH not in sys.path:
+  sys.path.insert(1, _PY_UTILS_PATH)
+from py_utils import cloud_storage
 
 import bisect_utils
 
diff --git a/tools/clang/plugins/FindBadConstructsAction.cpp b/tools/clang/plugins/FindBadConstructsAction.cpp
index 3fedd8f..df9b57a 100644
--- a/tools/clang/plugins/FindBadConstructsAction.cpp
+++ b/tools/clang/plugins/FindBadConstructsAction.cpp
@@ -47,21 +47,12 @@
     if (args[i] == "check-base-classes") {
       // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed.
       options_.check_base_classes = true;
-    } else if (args[i] == "enforce-in-pdf") {
-      // TODO(thestig): This is now always on. Remove support for this flag once
-      // the build no longer passes it in.
     } else if (args[i] == "enforce-in-thirdparty-webkit") {
       options_.enforce_in_thirdparty_webkit = true;
     } else if (args[i] == "check-enum-last-value") {
       // TODO(tsepez): Enable this by default once http://crbug.com/356815
       // and http://crbug.com/356816 are fixed.
       options_.check_enum_last_value = true;
-    } else if (args[i] == "check-templates") {
-      // TODO(thakis): This is now always on. Remove support for this flag once
-      // the build no longer passes it in.
-    } else if (args[i] == "follow-macro-expansion") {
-      // TODO(thakis): This is now always on. Remove support for this flag once
-      // the build no longer passes it in.
     } else if (args[i] == "no-realpath") {
       options_.no_realpath = true;
     } else if (args[i] == "check-ipc") {
diff --git a/tools/clang/plugins/tests/test.py b/tools/clang/plugins/tests/test.py
index 67ad6c4..b712a60 100755
--- a/tools/clang/plugins/tests/test.py
+++ b/tools/clang/plugins/tests/test.py
@@ -19,7 +19,6 @@
   """Test harness for the Chrome style plugin."""
 
   def AdjustClangArguments(self, clang_cmd):
-    self.AddPluginArg(clang_cmd, 'follow-macro-expansion')
     clang_cmd.extend([
         # Skip code generation
         '-fsyntax-only',
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index e089b09..c0d63f3 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -110,7 +110,8 @@
       'Android Remoting Tests': 'none',
       'Android Tests (trial)(dbg)': 'none',
       'Android Tests (x86 emulator)': 'android_gn_debug_static_bot_x86',
-      'Android Builder (dbg)': 'android_gn_debug_static_bot',
+      'Android VR Tests': 'none',
+      'Android Builder (dbg)': 'android_gn_debug_static_bot_vr_shell',
       'Android deterministic':
         'android_without_codecs_gn_release_bot_minimal_symbols',
       'Browser Side Navigation Linux': 'gn_release_bot',
@@ -1111,6 +1112,10 @@
       'android', 'gn', 'debug_static_bot', 'x86',
     ],
 
+    'android_gn_debug_static_bot_vr_shell': [
+      'android', 'gn', 'debug_static_bot', 'vr_shell',
+    ],
+
     'android_gn_debug_static_minimal_symbols_mipsel': [
       'android', 'gn', 'debug', 'static', 'minimal_symbols', 'mipsel',
     ],
@@ -2447,6 +2452,10 @@
       'gyp_defines': 'v8_enable_verify_heap=1',
     },
 
+    'vr_shell': {
+      'gn_args': 'enable_vr_shell=true',
+    },
+
     'win_analyze': {
       'gn_args': 'use_vs_code_analysis=true',
       'gyp_defines': 'win_analyze=1',
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index bdd59a9..f306e4e 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4292,90 +4292,13 @@
   </summary>
 </histogram>
 
-<histogram name="Bluetooth.Web.Android.onCharacteristicRead.Status"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>onCharacteristicRead 'status' values.</summary>
-</histogram>
+<histogram name="Bluetooth.Web.Android" enum="AndroidGATTStatusResult">
+<!-- Name completed by histogram_suffixes name="AndroidGATTEvents" -->
 
-<histogram name="Bluetooth.Web.Android.onCharacteristicWrite.Status"
-    enum="AndroidGATTStatusResult">
   <owner>jyasskin@chromium.org</owner>
   <owner>ortuno@chromium.org</owner>
   <owner>scheib@chromium.org</owner>
-  <summary>onCharacteristicWrite 'status' values..</summary>
-</histogram>
-
-<histogram
-    name="Bluetooth.Web.Android.onConnectionStateChange.Status.Connected"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>
-    onConnectionStateChange 'status' values received in the connected state.
-  </summary>
-</histogram>
-
-<histogram
-    name="Bluetooth.Web.Android.onConnectionStateChange.Status.Disconnected"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>
-    onConnectionStateChange 'status' values received in the disconnected state.
-  </summary>
-</histogram>
-
-<histogram
-    name="Bluetooth.Web.Android.onConnectionStateChange.Status.InvalidState"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>
-    onConnectionStateChange 'status' values received in an unhandled 'state'.
-  </summary>
-</histogram>
-
-<histogram name="Bluetooth.Web.Android.onDescriptorRead.Status"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>onDescriptorRead 'status' values.</summary>
-</histogram>
-
-<histogram name="Bluetooth.Web.Android.onDescriptorWrite.Status"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>onDescriptorWrite 'status' values..</summary>
-</histogram>
-
-<histogram name="Bluetooth.Web.Android.onServicesDiscovered.Status.Connected"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>
-    onServicesDiscovered 'status' values received in the connected state.
-  </summary>
-</histogram>
-
-<histogram
-    name="Bluetooth.Web.Android.onServicesDiscovered.Status.Disconnected"
-    enum="AndroidGATTStatusResult">
-  <owner>jyasskin@chromium.org</owner>
-  <owner>ortuno@chromium.org</owner>
-  <owner>scheib@chromium.org</owner>
-  <summary>
-    onServicesDiscovered 'status' values received in the disconnected state.
-  </summary>
+  <summary>'status' values returned by Android GATT event.</summary>
 </histogram>
 
 <histogram name="Bluetooth.Web.Blacklist.ParsedNonEmptyString"
@@ -24228,7 +24151,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.ChromeProcessCount">
+<histogram name="Memory.ChromeProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24273,6 +24196,15 @@
   </summary>
 </histogram>
 
+<histogram name="Memory.ExtensionProcessCount" units="processes">
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kenjibaheux@google.com</owner>
+  <owner>kouhei@chromium.org</owner>
+  <summary>
+    The count of active extension processes.  Recorded once per UMA ping.
+  </summary>
+</histogram>
+
 <histogram name="Memory.GlyphPagesPerLoad">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
@@ -24418,7 +24350,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.OtherProcessCount">
+<histogram name="Memory.OtherProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24456,7 +24388,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.PepperPluginBrokerProcessCount">
+<histogram name="Memory.PepperPluginBrokerProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24466,7 +24398,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.PepperPluginProcessCount">
+<histogram name="Memory.PepperPluginProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24488,7 +24420,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.PluginProcessCount">
+<histogram name="Memory.PluginProcessCount" units="processes">
   <obsolete>
     Deprecated due to NPAPI removal.
   </obsolete>
@@ -24517,7 +24449,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.ProcessCount">
+<histogram name="Memory.ProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24579,7 +24511,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.RendererProcessCount">
+<histogram name="Memory.RendererProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
@@ -24987,6 +24919,16 @@
   </summary>
 </histogram>
 
+<histogram name="Memory.Swap.Zygote" units="KB">
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kenjibaheux@google.com</owner>
+  <owner>kouhei@chromium.org</owner>
+  <summary>
+    The swap used by the zygote process.  Recorded once per UMA ping if the
+    system has swapped.
+  </summary>
+</histogram>
+
 <histogram name="Memory.Total" units="MB">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
@@ -25029,11 +24971,23 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.WorkerProcessCount">
+<histogram name="Memory.WorkerProcessCount" units="processes">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kenjibaheux@google.com</owner>
   <owner>kouhei@chromium.org</owner>
-  <summary>TBD.</summary>
+  <summary>
+    The count of active worker processes.  Recorded once per UMA ping.
+  </summary>
+</histogram>
+
+<histogram name="Memory.Zygote" units="KB">
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kenjibaheux@google.com</owner>
+  <owner>kouhei@chromium.org</owner>
+  <summary>
+    The private working set used by the zygote process.  Each zygote process
+    provides one sample.  Recorded once per UMA ping.
+  </summary>
 </histogram>
 
 <histogram name="MemoryAndroid.DeviceMemoryClass">
@@ -66966,6 +66920,15 @@
   </summary>
 </histogram>
 
+<histogram name="WebRTC.PeerConnection.DtlsHandshakeError"
+    enum="DtlsHandshakeError">
+  <owner>zhihuang@chromium.org</owner>
+  <summary>
+    Records the error whenever the Dtls handshake fails. There are only two
+    types of errors, incompatitable cipher suite and unknown error, for now.
+  </summary>
+</histogram>
+
 <histogram name="WebRTC.PeerConnection.IPMetrics" enum="PeerConnectionCounters">
   <owner>mallinath@chromium.org</owner>
   <summary>
@@ -75121,6 +75084,11 @@
   <int value="6" label="SRTP_NULL_SHA1_32"/>
 </enum>
 
+<enum name="DtlsHandshakeError" type="int">
+  <int value="0" label="Incompatible cipher suite"/>
+  <int value="1" label="Unknown error"/>
+</enum>
+
 <enum name="DumpOutcome" type="int">
   <int value="0" label="Success"/>
   <int value="1" label="Failure"/>
@@ -80277,6 +80245,7 @@
   <int value="1539" label="DraggableAttribute"/>
   <int value="1540" label="CleanScriptElementWithNonce"/>
   <int value="1541" label="PotentiallyInjectedScriptElementWithNonce"/>
+  <int value="1542" label="PendingStylesheetAddedAfterBodyStarted"/>
 </enum>
 
 <enum name="FetchRequestMode" type="int">
@@ -97773,8 +97742,9 @@
 
 <enum name="WebFontCacheHit" type="int">
   <int value="0" label="Miss"/>
-  <int value="1" label="Hit"/>
+  <int value="1" label="Hit disk cache"/>
   <int value="2" label="Served from data URL"/>
+  <int value="3" label="Hit memory cache"/>
 </enum>
 
 <enum name="WebFontDiskCacheHit" type="int">
@@ -98372,6 +98342,23 @@
   <affected-histogram name="Android.DownloadManager.InitialCount"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="AndroidGATTEvents" separator=".">
+  <suffix name="onCharacteristicRead.Status"/>
+  <suffix name="onCharacteristicWrite.Status"/>
+  <suffix name="onConnectionStateChange.Status.Connected"
+      label="While Connected"/>
+  <suffix name="onConnectionStateChange.Status.Disconnected"
+      label="While Disonnected"/>
+  <suffix name="onConnectionStateChange.Status.InvalidState"
+      label="While InvalidState"/>
+  <suffix name="onDescriptorRead.Status"/>
+  <suffix name="onDescriptorWrite.Status"/>
+  <suffix name="onServicesDiscovered.Status.Connected" label="While Connected"/>
+  <suffix name="onServicesDiscovered.Status.Disconnected"
+      label="While Disconnected"/>
+  <affected-histogram name="Bluetooth.Web.Android"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="AndroidGetAccountsTypes">
   <suffix name="AccountManager" label="Using Android AccountManager API"/>
   <suffix name="GoogleAuthUtil" label="Using GoogleAuthUtil API"/>
@@ -103007,6 +102994,9 @@
   <suffix name="Clients.FromGoogleSearch"
       label="PageLoadMetrics that are a result of a navigation from a Google
              web search"/>
+  <suffix name="Clients.CssScanner"
+      label="Metrics from pages scanned by the preload scanner for @import
+             CSS rules"/>
   <suffix name="Clients.DataReductionProxy"
       label="PageLoadMetrics that are a result of a navigation through the
              data reduction proxy."/>
diff --git a/tools/perf/PRESUBMIT.py b/tools/perf/PRESUBMIT.py
index 3d8f91a..36d9a15 100644
--- a/tools/perf/PRESUBMIT.py
+++ b/tools/perf/PRESUBMIT.py
@@ -44,10 +44,10 @@
   old_sys_path = sys.path
   try:
     perf_dir = input_api.PresubmitLocalPath()
-    catapult_path = os.path.abspath(os.path.join(
-        perf_dir, '..', '..', 'third_party', 'catapult', 'catapult_base'))
-    sys.path.insert(1, catapult_path)
-    from catapult_base import cloud_storage  # pylint: disable=import-error
+    py_utils_path = os.path.abspath(os.path.join(
+        perf_dir, '..', '..', 'third_party', 'catapult', 'common', 'py_utils'))
+    sys.path.insert(1, py_utils_path)
+    from py_utils import cloud_storage  # pylint: disable=import-error
   finally:
     sys.path = old_sys_path
 
diff --git a/tools/perf/benchmarks/battor.py b/tools/perf/benchmarks/battor.py
index 1cfaf8d..53ef3e4f 100644
--- a/tools/perf/benchmarks/battor.py
+++ b/tools/perf/benchmarks/battor.py
@@ -130,3 +130,14 @@
   @classmethod
   def Name(cls):
     return 'battor.trivial_pages'
+
+@benchmark.Enabled('mac')
+class BattOrSteadyStatePages(_BattOrBenchmark):
+
+  def CreateStorySet(self, options):
+    # We want it to wait for 30 seconds to be comparable to legacy power tests.
+    return page_sets.IdleAfterLoadingStories(wait_in_seconds=30)
+
+  @classmethod
+  def Name(cls):
+    return 'battor.steady_state'
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index b4f2e910..7036826c 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -49,6 +49,12 @@
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:news:reddit',  # pylint: disable=line-too-long
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:social:facebook',  # pylint: disable=line-too-long
   'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.load:news:cnn',  # pylint: disable=line-too-long
+
+  # Permenently disabled from smoke test for being long-running.
+  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.long_running:tools:gmail-foreground',  # pylint: disable=line-too-long
+  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.long_running:tools:gmail-background',  # pylint: disable=line-too-long
+  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.long_running:tools:gmail-foreground',  # pylint: disable=line-too-long
+  'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_desktop.long_running:tools:gmail-background',  # pylint: disable=line-too-long
 })
 
 
diff --git a/tools/perf/core/minidump_unittest.py b/tools/perf/core/minidump_unittest.py
index bc9255d1..d4ffac5 100644
--- a/tools/perf/core/minidump_unittest.py
+++ b/tools/perf/core/minidump_unittest.py
@@ -11,7 +11,8 @@
 
 class BrowserMinidumpTest(tab_test_case.TabTestCase):
   @decorators.Isolated
-  @decorators.Enabled('mac')
+  # Disabled tests due to flakiness: http://crbug.com/641469
+  @decorators.Disabled('all')
   def testSymbolizeMinidump(self):
     # Wait for the browser to restart fully before crashing
     self._LoadPageThenWait('var sam = "car";', 'sam')
@@ -44,7 +45,8 @@
 
 
   @decorators.Isolated
-  @decorators.Enabled('mac')
+  # Disabled tests due to flakiness: http://crbug.com/641469
+  @decorators.Disabled('all')
   def testMultipleCrashMinidumps(self):
     # Wait for the browser to restart fully before crashing
     self._LoadPageThenWait('var cat = "dog";', 'cat')
diff --git a/tools/perf/core/path_util.py b/tools/perf/core/path_util.py
index 09956b6..27ea09c1 100644
--- a/tools/perf/core/path_util.py
+++ b/tools/perf/core/path_util.py
@@ -14,10 +14,6 @@
   return chromium_config.GetChromiumSrcDir()
 
 
-def GetCatapultBaseDir():
-  return os.path.join(
-      GetChromiumSrcDir(), 'third_party', 'catapult', 'catapult_base')
-
 
 def GetTelemetryDir():
   return chromium_config.GetTelemetryDir()
@@ -41,7 +37,8 @@
     sys.path.insert(1, telemetry_path)
 
 
-def AddCatapultBaseToPath():
-  catapult_base_path = GetCatapultBaseDir()
-  if catapult_base_path not in sys.path:
-    sys.path.insert(1, catapult_base_path)
+def AddPyUtilsToPath():
+  py_utils_dir = os.path.join(
+      GetChromiumSrcDir(), 'third_party', 'catapult', 'common', 'py_utils')
+  if py_utils_dir not in sys.path:
+    sys.path.insert(1, py_utils_dir)
diff --git a/tools/perf/core/trybot_command.py b/tools/perf/core/trybot_command.py
index 7d97fb5..a53a5a3 100644
--- a/tools/perf/core/trybot_command.py
+++ b/tools/perf/core/trybot_command.py
@@ -3,13 +3,14 @@
 # found in the LICENSE file.
 
 import argparse
-import os
+import json
 import logging
+import os
 import platform
 import re
 import subprocess
 import urllib2
-import json
+
 
 from core import path_util
 
@@ -20,9 +21,6 @@
 from telemetry.util import matching
 
 
-CHROMIUM_CONFIG_FILENAME = 'tools/run-perf-test.cfg'
-BLINK_CONFIG_FILENAME = 'Tools/run-perf-test.cfg'
-SUCCESS, NO_CHANGES, ERROR = range(3)
 # Unsupported Perf bisect bots.
 EXCLUDED_BOTS = {
     'win_xp_perf_bisect',  # Goma issues: crbug.com/330900
@@ -57,20 +55,23 @@
 ]
 
 # Default try bot to use incase builbot is unreachable.
-DEFAULT_TRYBOTS =  [
+DEFAULT_TRYBOTS = [
     'linux_perf_bisect',
     'mac_10_11_perf_bisect',
     'winx64_10_perf_bisect',
     'android_s5_perf_bisect',
 ]
 
-assert not set(DEFAULT_TRYBOTS) & set(EXCLUDED_BOTS),  ( 'A trybot cannot '
-    'present in both Default as well as Excluded bots lists.')
+CHROMIUM_SRC_PATH = path_util.GetChromiumSrcDir()
+
+assert not set(DEFAULT_TRYBOTS) & set(EXCLUDED_BOTS), (
+    'A trybot cannot present in both Default as well as Excluded bots lists.')
+
 
 class TrybotError(Exception):
 
   def __str__(self):
-    return '%s\nError running tryjob.' % self.args[0]
+    return '(ERROR) Perf Try Job: %s' % self.args[0]
 
 
 def _GetTrybotList(builders):
@@ -89,7 +90,7 @@
 
 
 def _GetBuilderNames(trybot_name, builders):
-  """ Return platform and its available bot name as dictionary."""
+  """Return platform and its available bot name as dictionary."""
   os_names = ['linux', 'android', 'mac', 'win']
   if 'all' not in trybot_name:
     bot = ['%s_perf_bisect' % trybot_name.replace('-', '_')]
@@ -125,22 +126,42 @@
   return platform_and_bots
 
 
-def _RunProcess(cmd):
-  logging.debug('Running process: "%s"', ' '.join(cmd))
-  proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  out, err = proc.communicate()
-  returncode = proc.poll()
-  return (returncode, out, err)
-
-
 _GIT_CMD = 'git'
+
+
 if platform.system() == 'Windows':
   # On windows, the git command is installed as 'git.bat'
   _GIT_CMD = 'git.bat'
 
 
+def RunGit(cmd, msg_on_error='', ignore_return_code=False):
+  """Runs the git command with the given arguments.
+
+  Args:
+    cmd: git command arguments.
+    msg_on_error: Message to be displayed on git command error.
+    ignore_return_code: Ignores the return code for git command.
+
+  Returns:
+    The output of the git command as string.
+
+  Raises:
+    TrybotError: This exception is raised when git command fails.
+  """
+  proc = subprocess.Popen(
+      [_GIT_CMD] + cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  output, err = proc.communicate()
+  returncode = proc.poll()
+  if returncode:
+    if ignore_return_code:
+      return None
+    raise TrybotError('%s. \n%s' % (msg_on_error, err))
+
+  return output
+
+
 class Trybot(command_line.ArgParseCommand):
-  """ Run telemetry perf benchmark on trybot """
+  """Run telemetry perf benchmark on trybot."""
 
   usage = 'botname benchmark_name [<benchmark run options>]'
   _builders = None
@@ -159,10 +180,10 @@
       # In case of any kind of exception, allow tryjobs to use default trybots.
       # Possible exception are ssl.SSLError, urllib2.URLError,
       # socket.timeout, socket.error.
-      except Exception:
+      except Exception:  # pylint: disable=broad-except
         # Incase of any exception return default trybots.
         print ('WARNING: Unable to reach builbot to retrieve trybot '
-            'information, tryjob will use default trybots.')
+               'information, tryjob will use default trybots.')
         cls._builders = DEFAULT_TRYBOTS
       else:
         builders = json.loads(f.read()).keys()
@@ -189,9 +210,9 @@
       if arg == '--browser' or arg.startswith('--browser='):
         parser.error('--browser=... is not allowed when running trybot.')
     all_benchmarks = discover.DiscoverClasses(
-      start_dir=path_util.GetPerfBenchmarksDir(),
-      top_level_dir=path_util.GetPerfDir(),
-      base_class=benchmark.Benchmark).values()
+        start_dir=path_util.GetPerfBenchmarksDir(),
+        top_level_dir=path_util.GetPerfDir(),
+        base_class=benchmark.Benchmark).values()
     all_benchmark_names = [b.Name() for b in all_benchmarks]
     all_benchmarks_by_names = {b.Name(): b for b in all_benchmarks}
     benchmark_class = all_benchmarks_by_names.get(options.benchmark_name, None)
@@ -199,9 +220,9 @@
       possible_benchmark_names = matching.GetMostLikelyMatchedObject(
           all_benchmark_names, options.benchmark_name)
       parser.error(
-         'No benchmark named "%s". Do you mean any of those benchmarks '
-         'below?\n%s' %
-         (options.benchmark_name, '\n'.join(possible_benchmark_names)))
+          'No benchmark named "%s". Do you mean any of those benchmarks '
+          'below?\n%s' % (
+              options.benchmark_name, '\n'.join(possible_benchmark_names)))
     is_benchmark_disabled, reason = cls.IsBenchmarkDisabledOnTrybotPlatform(
         benchmark_class, options.trybot)
     also_run_disabled_option = '--also-run-disabled-tests'
@@ -211,7 +232,7 @@
 
   @classmethod
   def IsBenchmarkDisabledOnTrybotPlatform(cls, benchmark_class, trybot_name):
-    """ Return whether benchmark will be disabled on trybot platform.
+    """Return whether benchmark will be disabled on trybot platform.
 
     Note that we cannot tell with certainty whether the benchmark will be
     disabled on the trybot platform since the disable logic in ShouldDisable()
@@ -282,89 +303,19 @@
     if extra_args is None:
       extra_args = []
     self._InitializeBuilderNames(options.trybot)
-
-    arguments = [options.benchmark_name] + extra_args
-
-    # First check if there are chromium changes to upload.
-    status = self._AttemptTryjob(CHROMIUM_CONFIG_FILENAME, arguments)
-    if status not in [SUCCESS, ERROR]:
-      # If we got here, there are no chromium changes to upload. Try blink.
-      os.chdir('third_party/WebKit/')
-      status = self._AttemptTryjob(BLINK_CONFIG_FILENAME, arguments)
-      os.chdir('../..')
-      if status not in [SUCCESS, ERROR]:
-        logging.error('No local changes found in chromium or blink trees. '
-                      'browser=%s argument sends local changes to the '
-                      'perf trybot(s): %s.', options.trybot,
-                      self._builder_names.values())
-        return 1
-    return 0
-
-  def _UpdateConfigAndRunTryjob(self, bot_platform, cfg_file_path, arguments):
-    """Updates perf config file, uploads changes and excutes perf try job.
-
-    Args:
-      bot_platform: Name of the platform to be generated.
-      cfg_file_path: Perf config file path.
-
-    Returns:
-      (result, msg) where result is one of:
-          SUCCESS if a tryjob was sent
-          NO_CHANGES if there was nothing to try,
-          ERROR if a tryjob was attempted but an error encountered
-          and msg is an error message if an error was encountered, or rietveld
-          url if success, otherwise throws TrybotError exception.
-    """
-    config = self._GetPerfConfig(bot_platform, arguments)
-    config_to_write = 'config = %s' % json.dumps(
-        config, sort_keys=True, indent=2, separators=(',', ': '))
-
     try:
-      with open(cfg_file_path, 'r') as config_file:
-        if config_to_write == config_file.read():
-          return NO_CHANGES, ''
-    except IOError:
-      msg = 'Cannot find %s. Please run from src dir.' % cfg_file_path
-      return (ERROR, msg)
-
-    with open(cfg_file_path, 'w') as config_file:
-      config_file.write(config_to_write)
-    # Commit the config changes locally.
-    returncode, out, err = _RunProcess(
-        [_GIT_CMD, 'commit', '-a', '-m', 'bisect config: %s' % bot_platform])
-    if returncode:
-      raise TrybotError('Could not commit bisect config change for %s,'
-                        ' error %s' % (bot_platform, err))
-    # Upload the CL to rietveld and run a try job.
-    returncode, out, err = _RunProcess([
-        _GIT_CMD, 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-        'CL for perf tryjob on %s' % bot_platform
-    ])
-    if returncode:
-      raise TrybotError('Could not upload to rietveld for %s, error %s' %
-                        (bot_platform, err))
-
-    match = re.search(r'https://codereview.chromium.org/[\d]+', out)
-    if not match:
-      raise TrybotError('Could not upload CL to rietveld for %s! Output %s' %
-                        (bot_platform, out))
-    rietveld_url = match.group(0)
-    # Generate git try command for available bots.
-    git_try_command = [_GIT_CMD, 'cl', 'try', '-m', 'tryserver.chromium.perf']
-    for bot in self._builder_names[bot_platform]:
-      git_try_command.extend(['-b', bot])
-    returncode, out, err = _RunProcess(git_try_command)
-    if returncode:
-      raise TrybotError('Could not try CL for %s, error %s' %
-                        (bot_platform, err))
-
-    return (SUCCESS, rietveld_url)
+      self._AttemptTryjob(CHROMIUM_SRC_PATH, options, extra_args)
+    except TrybotError, error:
+      print error
+      return 1
+    return 0
 
   def _GetPerfConfig(self, bot_platform, arguments):
     """Generates the perf config for try job.
 
     Args:
       bot_platform: Name of the platform to be generated.
+      arguments: Command line arguments.
 
     Returns:
       A dictionary with perf config parameters.
@@ -374,7 +325,7 @@
 
     # Always set verbose logging for later debugging
     if '-v' not in arguments and '--verbose' not in arguments:
-        arguments.append('--verbose')
+      arguments.append('--verbose')
 
     # Generate the command line for the perf trybots
     target_arch = 'ia32'
@@ -384,17 +335,15 @@
           'Trybot does not suport --chrome-root option set directly '
           'through command line since it may contain references to your local '
           'directory')
-    if bot_platform in ['win', 'win-x64']:
-      arguments.insert(0, 'python tools\\perf\\run_benchmark')
-    else:
-      arguments.insert(0, './tools/perf/run_benchmark')
 
+    arguments.insert(0, 'src/tools/perf/run_benchmark')
     if bot_platform == 'android':
       arguments.insert(1, '--browser=android-chromium')
     elif any('x64' in bot for bot in self._builder_names[bot_platform]):
       arguments.insert(1, '--browser=release_x64')
       target_arch = 'x64'
     else:
+
       arguments.insert(1, '--browser=release')
 
     command = ' '.join(arguments)
@@ -407,100 +356,113 @@
         'target_arch': target_arch,
     }
 
-  def _AttemptTryjob(self, cfg_file_path, arguments):
-    """Attempts to run a tryjob from the current directory.
-
-    This is run once for chromium, and if it returns NO_CHANGES, once for blink.
+  def _GetRepoAndBranchName(self, repo_path):
+    """Gets the repository name and working branch name.
 
     Args:
-      cfg_file_path: Path to the config file for the try job.
+      repo_path: Path to the repository.
 
     Returns:
-      Returns SUCCESS if a tryjob was sent, NO_CHANGES if there was nothing to
-      try, ERROR if a tryjob was attempted but an error encountered.
+      Repository name and branch name as tuple.
+
+    Raises:
+      TrybotError: This exception is raised for the following cases:
+        1. Try job is for non-git repository or in invalid branch.
+        2. Un-committed changes in the current branch.
+        3. No local commits in the current branch.
     """
-    source_repo = 'chromium'
-    if cfg_file_path == BLINK_CONFIG_FILENAME:
-      source_repo = 'blink'
+    # If command runs successfully, then the output will be repo root path.
+    # and current branch name.
+    output = RunGit(['rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+                    ('%s is not a git repository, must be in a git repository '
+                     'to send changes to trybots' % os.getcwd()))
 
-    # TODO(prasadv): This method is quite long, we should consider refactor
-    # this by extracting to helper methods.
-    returncode, original_branchname, err = _RunProcess(
-        [_GIT_CMD, 'rev-parse', '--abbrev-ref', 'HEAD'])
-    if returncode:
-      msg = 'Must be in a git repository to send changes to trybots.'
-      if err:
-        msg += '\nGit error: %s' % err
-      logging.error(msg)
-      return ERROR
+    repo_info = output.split()
+    # Assuming the base directory name is same as repo project name set in
+    # codereviews.settings file.
+    repo_name = os.path.basename(repo_info[0]).strip()
+    branch_name = repo_info[1].strip()
 
-    original_branchname = original_branchname.strip()
+    if branch_name == 'HEAD':
+      raise TrybotError('Not on a valid branch, looks like branch '
+                        'is dettached. [branch:%s]' % branch_name)
 
     # Check if the tree is dirty: make sure the index is up to date and then
     # run diff-index
-    _RunProcess([_GIT_CMD, 'update-index', '--refresh', '-q'])
-    returncode, out, err = _RunProcess([_GIT_CMD, 'diff-index', 'HEAD'])
-    if out:
-      logging.error(
-          'Cannot send a try job with a dirty tree. Commit locally first.')
-      return ERROR
+    RunGit(['update-index', '--refresh', '-q'], ignore_return_code=True)
+    output = RunGit(['diff-index', 'HEAD'])
+    if output:
+      raise TrybotError(
+          'Cannot send a try job with a dirty tree. Please commit '
+          'your changes locally first in %s repository.' % repo_path)
 
     # Make sure the tree does have local commits.
-    returncode, out, err = _RunProcess(
-        [_GIT_CMD, 'log', 'origin/master..HEAD'])
-    if not out:
-      return NO_CHANGES
+    output = RunGit(['footers', 'HEAD'])
+    if output:
+      raise TrybotError('No local changes found in %s repository.' % repo_path)
 
-    # Create/check out the telemetry-tryjob branch, and edit the configs
-    # for the tryjob there.
-    returncode, out, err = _RunProcess(
-        [_GIT_CMD, 'checkout', '-b', 'telemetry-tryjob'])
-    if returncode:
-      logging.error('Error creating branch telemetry-tryjob. '
-                    'Please delete it if it exists.\n%s', err)
-      return ERROR
-    try:
-      returncode, out, err = _RunProcess(
-          [_GIT_CMD, 'branch', '--set-upstream-to', 'origin/master'])
-      if returncode:
-        logging.error('Error in git branch --set-upstream-to: %s', err)
-        return ERROR
-      for bot_platform in self._builder_names:
-        if not self._builder_names[bot_platform]:
-          logging.warning('No builder is found for %s', bot_platform)
-          continue
-        try:
-          results, output = self._UpdateConfigAndRunTryjob(
-              bot_platform, cfg_file_path, arguments)
-          if results == ERROR:
-            logging.error(output)
-            return ERROR
-          elif results == NO_CHANGES:
-            print ('Skip the try job run on %s because it has been tried in '
-                   'previous try job run. ' % bot_platform)
-          else:
-            print ('Uploaded %s try job to rietveld for %s platform. '
-                   'View progress at %s' % (source_repo, bot_platform, output))
-        except TrybotError, err:
-          print err
-          logging.error(err)
-    finally:
-      # Checkout original branch and delete telemetry-tryjob branch.
-      # TODO(prasadv): This finally block could be extracted out to be a
-      # separate function called _CleanupBranch.
-      returncode, out, err = _RunProcess(
-          [_GIT_CMD, 'checkout', original_branchname])
-      if returncode:
-        logging.error('Could not check out %s. Please check it out and '
-                      'manually delete the telemetry-tryjob branch. '
-                      ': %s', original_branchname, err)
-        return ERROR  # pylint: disable=lost-exception
-      logging.info('Checked out original branch: %s', original_branchname)
-      returncode, out, err = _RunProcess(
-          [_GIT_CMD, 'branch', '-D', 'telemetry-tryjob'])
-      if returncode:
-        logging.error('Could not delete telemetry-tryjob branch. '
-                      'Please delete it manually: %s', err)
-        return ERROR  # pylint: disable=lost-exception
-      logging.info('Deleted temp branch: telemetry-tryjob')
-    return SUCCESS
+    return (repo_name, branch_name)
+
+  def _AttemptTryjob(self, repo_path, options, extra_args):
+    """Attempts to run a tryjob from a repo directory.
+
+    Args:
+      repo_path: Path to the repository.
+      options: Command line arguments to run benchmark.
+      extra_args: Extra arugments to run benchmark.
+    """
+    repo_name, branch_name = self._GetRepoAndBranchName(repo_path)
+
+    arguments = [options.benchmark_name] + extra_args
+
+    rietveld_url = self._UploadPatchToRietveld(repo_name, options)
+    print ('\nUploaded try job to rietveld.\nview progress here %s.'
+           '\n\tRepo Name: %s\n\tPath: %s\n\tBranch: %s' % (
+               rietveld_url, repo_name, repo_path, branch_name))
+
+    for bot_platform in self._builder_names:
+      if not self._builder_names[bot_platform]:
+        logging.warning('No builder is found for %s', bot_platform)
+        continue
+      try:
+        self._RunTryJob(bot_platform, arguments)
+      except TrybotError, err:
+        print err
+
+  def _UploadPatchToRietveld(self, repo_name, options):
+    """Uploads the patch to rietveld and returns rietveld URL."""
+    output = RunGit(['cl', 'upload', '-f', '--bypass-hooks', '-m',
+                     ('CL for %s perf tryjob to run %s benchmark '
+                      'on %s platform(s)' % (
+                          repo_name, options.benchmark_name, options.trybot))],
+                    'Could not upload to rietveld for %s' % repo_name)
+
+    match = re.search(r'https://codereview.chromium.org/[\d]+', output)
+    if not match:
+      raise TrybotError('Could not upload CL to rietveld for %s! Output %s' %
+                        (repo_name, output))
+    return match.group(0)
+
+  def _RunTryJob(self, bot_platform, arguments):
+    """Executes perf try job with benchmark test properties.
+
+    Args:
+      bot_platform: Name of the platform to be generated.
+      arguments: Command line arguments.
+
+    Raises:
+      TrybotError: When trybot fails to upload CL or run git try.
+    """
+    config = self._GetPerfConfig(bot_platform, arguments)
+
+    # Generate git try command for available bots.
+    git_try_command = ['cl', 'try', '-m', 'tryserver.chromium.perf']
+
+     # Add Perf Test config to git try --properties arg.
+    git_try_command.extend(['-p', 'perf_try_config=%s' % json.dumps(config)])
+
+    for bot in self._builder_names[bot_platform]:
+      git_try_command.extend(['-b', bot])
+
+    RunGit(git_try_command, 'Could not try CL for %s' % bot_platform)
+    print 'Perf Try job sent to rietveld for %s platform.' % bot_platform
diff --git a/tools/perf/core/trybot_command_unittest.py b/tools/perf/core/trybot_command_unittest.py
index 4d7aa2bf..68897a3 100644
--- a/tools/perf/core/trybot_command_unittest.py
+++ b/tools/perf/core/trybot_command_unittest.py
@@ -2,17 +2,16 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 import argparse
-import logging
 import json
+import logging
+import os
 import StringIO
+import sys
 import unittest
 
-import mock
-
-from telemetry import benchmark
-from telemetry.testing import system_stub
-
 from core import trybot_command
+import mock
+from telemetry import benchmark
 
 
 class FakeProcess(object):
@@ -40,8 +39,6 @@
     self._mock_subprocess = self._subprocess_patcher.start()
     self._urllib2_patcher = mock.patch('core.trybot_command.urllib2')
     self._urllib2_mock = self._urllib2_patcher.start()
-    self._stubs = system_stub.Override(trybot_command,
-                                       ['sys', 'open', 'os'])
     # Always set git command to 'git' to simplify testing across platforms.
     self._original_git_cmd = trybot_command._GIT_CMD
     trybot_command._GIT_CMD = 'git'
@@ -49,7 +46,6 @@
   def tearDown(self):
     logging.getLogger().removeHandler(self.stream_handler)
     self.log_output.close()
-    self._stubs.Restore()
     self._subprocess_patcher.stop()
     self._urllib2_patcher.stop()
     # Reset the cached builders in trybot_command
@@ -58,7 +54,6 @@
 
   def _ExpectProcesses(self, expected_args_list):
     counter = [-1]
-
     def side_effect(args, **kwargs):
       if not expected_args_list:
         self.fail(
@@ -74,8 +69,8 @@
     self._mock_subprocess.Popen.side_effect = side_effect
 
   def _MockBuilderList(self):
-    ExcludedBots = trybot_command.EXCLUDED_BOTS
-    builders = [bot for bot in self._builder_list if bot not in ExcludedBots]
+    excluded_bots = trybot_command.EXCLUDED_BOTS
+    builders = [bot for bot in self._builder_list if bot not in excluded_bots]
     return builders
 
   def _MockTryserverJson(self, bots_dict):
@@ -83,6 +78,34 @@
     data.read.return_value = json.dumps(bots_dict)
     self._urllib2_mock.urlopen.return_value = data
 
+  def _AssertTryBotExceptions(self, message, func, *args):
+    with self.assertRaises(trybot_command.TrybotError) as e:
+      func(*args)
+    self.assertIn(message, e.exception.message)
+
+  def _SetupTrybotCommand(self, try_json_dict, trybot):
+    self._MockTryserverJson(try_json_dict)
+    command = trybot_command.Trybot()
+    command._InitializeBuilderNames(trybot)
+    return command
+
+  def _GetConfigForTrybot(self, name, platform, extra_benchmark_args=None):
+    bot = '%s_perf_bisect' % name.replace('', '').replace('-', '_')
+    command = self._SetupTrybotCommand({bot: 'stuff'}, name)
+    options = argparse.Namespace(trybot=name, benchmark_name='sunspider')
+    extra_benchmark_args = extra_benchmark_args or []
+    arguments = [options.benchmark_name] + extra_benchmark_args
+    cfg = command._GetPerfConfig(platform, arguments)
+
+    return cfg, command
+
+  def _ExpectedGitTryTestArgs(self, test_name, browser, target_arch='ia32'):
+    return ('perf_try_config={'
+            '"repeat_count": "1", "command": "src/tools/perf/run_benchmark '
+            '--browser=%s %s --verbose", "max_time_minutes": "120", '
+            '"target_arch": "%s", "truncate_percent": "0"}' % (
+                browser, test_name, target_arch))
+
   def testFindAllBrowserTypesList(self):
     self._MockTryserverJson({
         'android_nexus4_perf_bisect': 'stuff',
@@ -255,55 +278,72 @@
         sorted(command._builder_names.get('linux')))
 
   def testNoGit(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
     self._ExpectProcesses((
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (128, None, None)),
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (128, None, None)),
     ))
-    options = argparse.Namespace(trybot='android', benchmark_name='dromaeo')
-    command.Run(options)
-    self.assertEquals(
-        'Must be in a git repository to send changes to trybots.\n',
-        self.log_output.getvalue())
+    self._AssertTryBotExceptions(
+        ('%s is not a git repository, must be in a git repository to send '
+         'changes to trybots.' % os.getcwd()),
+        command._GetRepoAndBranchName,
+        trybot_command.CHROMIUM_SRC_PATH
+    )
+
+  def testDettachedBranch(self):
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    self._ExpectProcesses((
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nHEAD\n', None)),
+    ))
+    self._AssertTryBotExceptions(
+        'Not on a valid branch, looks like branch is dettached. [branch:HEAD]',
+        command._GetRepoAndBranchName,
+        trybot_command.CHROMIUM_SRC_PATH
+    )
 
   def testDirtyTree(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
     self._ExpectProcesses((
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nbr\n', None)),
         (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
         (['git', 'diff-index', 'HEAD'], (0, 'dirty tree', None)),
     ))
-    options = argparse.Namespace(trybot='android-nexus4', benchmark_name='foo')
-    command = trybot_command.Trybot()
-    command.Run(options, [])
-    self.assertEquals(
-        'Cannot send a try job with a dirty tree. Commit locally first.\n',
-        self.log_output.getvalue())
+    self._AssertTryBotExceptions(
+        'Cannot send a try job with a dirty tree.',
+        command._GetRepoAndBranchName,
+        trybot_command.CHROMIUM_SRC_PATH
+    )
 
   def testNoLocalCommits(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
     self._ExpectProcesses((
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nbr\n', None)),
         (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
         (['git', 'diff-index', 'HEAD'], (0, '', None)),
-        (['git', 'log', 'origin/master..HEAD'], (0, '', None)),
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
-        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
-        (['git', 'diff-index', 'HEAD'], (0, '', None)),
-        (['git', 'log', 'origin/master..HEAD'], (0, '', None)),
+        (['git', 'footers', 'HEAD'], (0, 'CL footers', None)),
     ))
+    self._AssertTryBotExceptions(
+        'No local changes found in %s repository.' %
+        trybot_command.CHROMIUM_SRC_PATH,
+        command._GetRepoAndBranchName,
+        trybot_command.CHROMIUM_SRC_PATH
+    )
 
-    options = argparse.Namespace(trybot='android-nexus4', benchmark_name='foo')
-    command.Run(options)
+  def testGetRepoAndBranchName(self):
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    self._ExpectProcesses((
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nbr\n', None)),
+        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
+        (['git', 'diff-index', 'HEAD'], (0, '', None)),
+        (['git', 'footers', 'HEAD'], (0, '', None)),
+    ))
     self.assertEquals(
-        ('No local changes found in chromium or blink trees. '
-         'browser=android-nexus4 argument sends local changes to the '
-         'perf trybot(s): '
-         '[[\'android_nexus4_perf_bisect\']].\n'),
-        self.log_output.getvalue())
+        command._GetRepoAndBranchName(
+            trybot_command.CHROMIUM_SRC_PATH), ('src', 'br'))
 
   def testErrorOnBrowserArgSpecified(self):
     parser = trybot_command.Trybot.CreateParser()
@@ -313,131 +353,62 @@
       trybot_command.Trybot.ProcessCommandLineArgs(
           parser, options, extra_args, None)
 
-  def testBranchCheckoutFails(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    self._ExpectProcesses((
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
-        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
-        (['git', 'diff-index', 'HEAD'], (0, '', None)),
-        (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)),
-        (['git', 'checkout', '-b', 'telemetry-tryjob'],
-         (1, None, 'fatal: A branch named \'telemetry-try\' already exists.')),
-    ))
-
-    command = trybot_command.Trybot()
-    options = argparse.Namespace(trybot='android-nexus4', benchmark_name='foo')
-    command.Run(options, [])
-    self.assertEquals(
-        ('Error creating branch telemetry-tryjob. '
-         'Please delete it if it exists.\n'
-         'fatal: A branch named \'telemetry-try\' already exists.\n'),
-        self.log_output.getvalue())
-
-  def _GetConfigForTrybot(self, name, platform, branch, cfg_filename,
-                          is_blink=False, extra_benchmark_args=None):
-    bot = '%s_perf_bisect' % name.replace('', '').replace('-', '_')
-    self._MockTryserverJson({bot: 'stuff'})
-    first_processes = ()
-    if is_blink:
-      first_processes = (
-          (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, 'br', None)),
-          (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
-          (['git', 'diff-index', 'HEAD'], (0, '', None)),
-          (['git', 'log', 'origin/master..HEAD'], (0, '', None))
-      )
-    self._ExpectProcesses(first_processes + (
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'], (0, branch, None)),
-        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
-        (['git', 'diff-index', 'HEAD'], (0, '', None)),
-        (['git', 'log', 'origin/master..HEAD'], (0, 'logs here', None)),
-        (['git', 'checkout', '-b', 'telemetry-tryjob'], (0, None, None)),
-        (['git', 'branch', '--set-upstream-to', 'origin/master'],
-         (0, None, None)),
-        (['git', 'commit', '-a', '-m', 'bisect config: %s' % platform],
-         (0, None, None)),
-        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on %s' % platform],
-         (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b', bot],
-         (0, None, None)),
-        (['git', 'checkout', branch], (0, None, None)),
-        (['git', 'branch', '-D', 'telemetry-tryjob'], (0, None, None))
-    ))
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-
-    options = argparse.Namespace(trybot=name, benchmark_name='sunspider')
-    command = trybot_command.Trybot()
-    extra_benchmark_args = extra_benchmark_args or []
-    command.Run(options, extra_benchmark_args)
-    return cfg.getvalue()
-
   def testConfigAndroid(self):
-    config = self._GetConfigForTrybot(
-        'android-nexus4', 'android', 'somebranch',
-        'tools/run-perf-test.cfg')
+    config, _ = self._GetConfigForTrybot('android-nexus4', 'android')
     self.assertEquals(
-        ('config = {\n'
-         '  "command": "./tools/perf/run_benchmark '
-         '--browser=android-chromium sunspider --verbose",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "ia32",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
+        {'command': ('src/tools/perf/run_benchmark '
+                     '--browser=android-chromium sunspider --verbose'),
+         'max_time_minutes': '120',
+         'repeat_count': '1',
+         'target_arch': 'ia32',
+         'truncate_percent': '0'
+        }, config)
 
   def testConfigMac(self):
-    config = self._GetConfigForTrybot(
-        'mac-10-9', 'mac', 'currentwork', 'tools/run-perf-test.cfg')
+    config, _ = self._GetConfigForTrybot('mac-10-9', 'mac')
     self.assertEquals(
-        ('config = {\n'
-         '  "command": "./tools/perf/run_benchmark '
-         '--browser=release sunspider --verbose",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "ia32",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
+        {'command': ('src/tools/perf/run_benchmark '
+                     '--browser=release sunspider --verbose'),
+         'max_time_minutes': '120',
+         'repeat_count': '1',
+         'target_arch': 'ia32',
+         'truncate_percent': '0'
+        }, config)
 
   def testConfigWinX64(self):
-    config = self._GetConfigForTrybot(
-        'win-x64', 'win-x64', 'currentwork', 'tools/run-perf-test.cfg')
+    config, _ = self._GetConfigForTrybot('win-x64', 'win-x64')
+
     self.assertEquals(
-        ('config = {\n'
-         '  "command": "python tools\\\\perf\\\\run_benchmark '
-         '--browser=release_x64 sunspider --verbose",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "x64",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
+        {'command': ('src/tools/perf/run_benchmark '
+                     '--browser=release_x64 sunspider --verbose'),
+         'max_time_minutes': '120',
+         'repeat_count': '1',
+         'target_arch': 'x64',
+         'truncate_percent': '0'
+        }, config)
 
   def testVerboseOptionIsNotAddedTwice(self):
-    config = self._GetConfigForTrybot(
-        'win-x64', 'win-x64', 'currentwork', 'tools/run-perf-test.cfg',
-        extra_benchmark_args=['-v'])
+    config, _ = self._GetConfigForTrybot(
+        'win-x64', 'win-x64', extra_benchmark_args=['-v'])
     self.assertEquals(
-        ('config = {\n'
-         '  "command": "python tools\\\\perf\\\\run_benchmark '
-         '--browser=release_x64 sunspider -v",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "x64",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
+        {'command': ('src/tools/perf/run_benchmark '
+                     '--browser=release_x64 sunspider -v'),
+         'max_time_minutes': '120',
+         'repeat_count': '1',
+         'target_arch': 'x64',
+         'truncate_percent': '0'
+        }, config)
 
   def testConfigWinX64WithNoHyphen(self):
-    config = self._GetConfigForTrybot(
-        'winx64nvidia', 'win-x64', 'currentwork', 'tools/run-perf-test.cfg')
+    config, _ = self._GetConfigForTrybot('winx64nvidia', 'win-x64')
     self.assertEquals(
-        ('config = {\n'
-         '  "command": "python tools\\\\perf\\\\run_benchmark '
-         '--browser=release_x64 sunspider --verbose",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "x64",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
+        {'command': ('src/tools/perf/run_benchmark '
+                     '--browser=release_x64 sunspider --verbose'),
+         'max_time_minutes': '120',
+         'repeat_count': '1',
+         'target_arch': 'x64',
+         'truncate_percent': '0'
+        }, config)
 
   def testUnsupportedTrybot(self):
     self.assertRaises(
@@ -447,188 +418,155 @@
         {'win_perf_bisect': 'stuff'}
     )
 
-  def testConfigBlink(self):
-    config = self._GetConfigForTrybot(
-        'mac-10-9', 'mac', 'blinkbranch',
-        'Tools/run-perf-test.cfg', True)
-    self.assertEquals(
-        ('config = {\n'
-         '  "command": "./tools/perf/run_benchmark '
-         '--browser=release sunspider --verbose",\n'
-         '  "max_time_minutes": "120",\n'
-         '  "repeat_count": "1",\n'
-         '  "target_arch": "ia32",\n'
-         '  "truncate_percent": "0"\n'
-         '}'), config)
-
-  def testUpdateConfigGitCommitTrybotError(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+  def testUploadPatchToRietveldGitCommandFailed(self):
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
     self._ExpectProcesses((
-        (['git', 'commit', '-a', '-m', 'bisect config: android'],
-         (128, 'None', 'commit failed')),
         (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on android'],
+          ('CL for src perf tryjob to run sunspider benchmark on linux '
+           'platform(s)')],
+         (128, None, None)),
+    ))
+    self._AssertTryBotExceptions(
+        'Could not upload to rietveld for src',
+        command._UploadPatchToRietveld,
+        'src',
+        options
+    )
+
+  def testUploadPatchToRietveldNoURLMatchFound(self):
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
+    self._ExpectProcesses((
+        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
+          ('CL for src perf tryjob to run sunspider benchmark on linux '
+           'platform(s)')],
+         (0, 'stuff https://dummy.chromium.org/12345 stuff', None)),
+    ))
+    self._AssertTryBotExceptions(
+        'Could not upload CL to rietveld for src!',
+        command._UploadPatchToRietveld,
+        'src',
+        options
+    )
+
+  def testUploadPatchToRietveldOnSuccess(self):
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
+    self._ExpectProcesses((
+        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
+          ('CL for src perf tryjob to run sunspider benchmark on linux '
+           'platform(s)')],
          (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'android_nexus4_perf_bisect'], (0, None, None))))
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-    self.assertRaises(
-        trybot_command.TrybotError, command._UpdateConfigAndRunTryjob,
-        'android', cfg_filename, [])
+    ))
+    self.assertEquals(command._UploadPatchToRietveld('src', options),
+                      'https://codereview.chromium.org/12345')
 
-  def testUpdateConfigGitUploadTrybotError(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+  def testRunTryJobFailed(self):
+    test_args = self._ExpectedGitTryTestArgs('sunspider', 'release')
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
+    arguments = [options.benchmark_name] + []
     self._ExpectProcesses((
-        (['git', 'commit', '-a', '-m', 'bisect config: android'],
-         (0, 'None', None)),
-        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on android'],
-         (128, None, 'error')),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'android_nexus4_perf_bisect'], (0, None, None))))
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-    self.assertRaises(
-        trybot_command.TrybotError, command._UpdateConfigAndRunTryjob,
-        'android', cfg_filename, [])
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', test_args,
+          '-b',
+          'linux_perf_bisect'], (128, None, None)),))
+    self._AssertTryBotExceptions(
+        'Could not try CL for linux',
+        command._RunTryJob, 'linux', arguments)
 
-  def testUpdateConfigGitTryTrybotError(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+  def testRunTryJobSuccess(self):
+    test_args = self._ExpectedGitTryTestArgs('sunspider', 'release')
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
+    arguments = [options.benchmark_name] + []
     self._ExpectProcesses((
-        (['git', 'commit', '-a', '-m', 'bisect config: android'],
-         (0, 'None', None)),
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', test_args,
+          '-b',
+          'linux_perf_bisect'], (0, None, None)),))
+    command._RunTryJob('linux', arguments)
+    self.assertEquals('Perf Try job sent to rietveld for linux platform.',
+                      sys.stdout.getvalue().strip())
+
+  def testAttemptTryjobForCrRepo(self):
+    test_args = self._ExpectedGitTryTestArgs('sunspider', 'release')
+    command = self._SetupTrybotCommand({'linux_perf_bisect': 'stuff'}, 'linux')
+    options = argparse.Namespace(trybot='linux', benchmark_name='sunspider')
+
+    self._ExpectProcesses((
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nbr\n', None)),
+        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
+        (['git', 'diff-index', 'HEAD'], (0, '', None)),
+        (['git', 'footers', 'HEAD'], (0, '', None)),
         (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on android'],
+          ('CL for src perf tryjob to run sunspider benchmark on linux '
+           'platform(s)')],
          (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'android_nexus4_perf_bisect'], (128, None, None))))
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-    self.assertRaises(
-        trybot_command.TrybotError, command._UpdateConfigAndRunTryjob,
-        'android', cfg_filename, [])
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', test_args, '-b', 'linux_perf_bisect'], (0, None, None))
+    ))
+    command._AttemptTryjob(trybot_command.CHROMIUM_SRC_PATH, options, [])
 
-  def testUpdateConfigSkipTryjob(self):
-    self._MockTryserverJson({'win_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('win-x64')
-    self._ExpectProcesses(())
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg_data = ('''config = {
-  "command": "python tools\\\\perf\\\\run_benchmark --browser=release_x64'''
-''' --verbose",
-  "max_time_minutes": "120",
-  "repeat_count": "1",
-  "target_arch": "x64",
-  "truncate_percent": "0"
-}''')
-    self._stubs.open.files = {cfg_filename: cfg_data}
-    self.assertEquals((trybot_command.NO_CHANGES, ''),
-                      command._UpdateConfigAndRunTryjob(
-                          'win-x64', cfg_filename, []))
+    output = ('Uploaded try job to rietveld.\n'
+              'view progress here https://codereview.chromium.org/12345.\n'
+              '\tRepo Name: src\n'
+              '\tPath: %s\n'
+              '\tBranch: br\n'
+              'Perf Try job sent to rietveld for linux platform.') % (
+                  trybot_command.CHROMIUM_SRC_PATH)
+    self.assertEquals(output, sys.stdout.getvalue().strip())
 
-  def testUpdateConfigGitTry(self):
-    self._MockTryserverJson({'android_nexus4_perf_bisect': 'stuff'})
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('android-nexus4')
+  def testAttemptTryjobAllForCrRepo(self):
+    default_config = self._ExpectedGitTryTestArgs('sunspider', 'release')
+    winx64_config = self._ExpectedGitTryTestArgs(
+        'sunspider', 'release_x64', 'x64')
+    android_config = self._ExpectedGitTryTestArgs(
+        'sunspider', 'android-chromium', 'ia32')
+
+    command = self._SetupTrybotCommand(
+        {'linux_perf_bisect': 'stuff',
+         'win_perf_bisect': 'stuff',
+         'winx64_perf_bisect': 'stuff',
+         'android_perf_bisect': 'stuff',
+         'mac_perf_bisect': 'stuff'}, 'all')
+    options = argparse.Namespace(trybot='all', benchmark_name='sunspider')
     self._ExpectProcesses((
-        (['git', 'commit', '-a', '-m', 'bisect config: android'],
-         (0, 'None', None)),
+        (['git', 'rev-parse', '--abbrev-ref', '--show-toplevel', 'HEAD'],
+         (0, '/root/path_to/repo/src\nbr\n', None)),
+        (['git', 'update-index', '--refresh', '-q'], (0, None, None,)),
+        (['git', 'diff-index', 'HEAD'], (0, '', None)),
+        (['git', 'footers', 'HEAD'], (0, '', None)),
         (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on android'],
+          ('CL for src perf tryjob to run sunspider benchmark on all '
+           'platform(s)')],
          (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'android_nexus4_perf_bisect'], (0, None, None))))
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-    self.assertEquals((0, 'https://codereview.chromium.org/12345'),
-                      command._UpdateConfigAndRunTryjob(
-                          'android', cfg_filename, []))
-    cfg.seek(0)
-    config = '''config = {
-  "command": "./tools/perf/run_benchmark --browser=android-chromium --verbose",
-  "max_time_minutes": "120",
-  "repeat_count": "1",
-  "target_arch": "ia32",
-  "truncate_percent": "0"
-}'''
-    self.assertEquals(cfg.read(), config)
-
-  def testUpdateConfigGitTryAll(self):
-    self._MockTryserverJson({
-        'android_nexus4_perf_bisect': 'stuff',
-        'win_8_perf_bisect': 'stuff2'
-    })
-    command = trybot_command.Trybot()
-    command._InitializeBuilderNames('all')
-    self._ExpectProcesses((
-        (['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
-         (0, 'CURRENT-BRANCH', None)),
-        (['git', 'update-index', '--refresh', '-q'],
-         (0, '', None)),
-        (['git', 'diff-index', 'HEAD'],
-         (0, '', None)),
-        (['git', 'log', 'origin/master..HEAD'],
-         (0, 'abcdef', None)),
-        (['git', 'checkout', '-b', 'telemetry-tryjob'],
-         (0, '', None)),
-        (['git', 'branch', '--set-upstream-to', 'origin/master'],
-         (0, '', None)),
-        (['git', 'commit', '-a', '-m', 'bisect config: win'],
-         (0, 'None', None)),
-        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on win'],
-         (0, 'stuff2 https://codereview.chromium.org/12345 stuff2', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'win_8_perf_bisect'],
-         (0, None, None)),
-        (['git', 'commit', '-a', '-m', 'bisect config: android'],
-         (0, 'None', None)),
-        (['git', 'cl', 'upload', '-f', '--bypass-hooks', '-m',
-          'CL for perf tryjob on android'],
-         (0, 'stuff https://codereview.chromium.org/12345 stuff', None)),
-        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf', '-b',
-          'android_nexus4_perf_bisect'], (0, None, None)),
-        (['git', 'checkout', 'CURRENT-BRANCH'],
-         (0, '', None)),
-        (['git', 'branch', '-D', 'telemetry-tryjob'],
-         (0, '', None))))
-    cfg_filename = 'tools/run-perf-test.cfg'
-    cfg = StringIO.StringIO()
-    self._stubs.open.files = {cfg_filename: cfg}
-    self.assertEquals(0, command._AttemptTryjob(cfg_filename, []))
-    cfg.seek(0)
-
-    # The config contains both config for browser release & android-chromium,
-    # but that's because the stub testing does not reset the StringIO. In
-    # reality, the cfg_filename should be overwritten with the new data.
-    config = ('''config = {
-  "command": "python tools\\\\perf\\\\run_benchmark --browser=release '''
-  '''--verbose",
-  "max_time_minutes": "120",
-  "repeat_count": "1",
-  "target_arch": "ia32",
-  "truncate_percent": "0"
-}''''''config = {
-  "command": "./tools/perf/run_benchmark --browser=android-chromium --verbose",
-  "max_time_minutes": "120",
-  "repeat_count": "1",
-  "target_arch": "ia32",
-  "truncate_percent": "0"
-}''')
-    self.assertEquals(cfg.read(), config)
-
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', default_config, '-b', 'win_perf_bisect'], (0, None, None)),
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', android_config, '-b', 'android_perf_bisect'], (0, None, None)),
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', winx64_config, '-b', 'winx64_perf_bisect'], (0, None, None)),
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', default_config, '-b', 'mac_perf_bisect'], (0, None, None)),
+        (['git', 'cl', 'try', '-m', 'tryserver.chromium.perf',
+          '-p', default_config, '-b', 'linux_perf_bisect'], (0, None, None)),
+    ))
+    command._AttemptTryjob(trybot_command.CHROMIUM_SRC_PATH, options, [])
+    output = ('Uploaded try job to rietveld.\n'
+              'view progress here https://codereview.chromium.org/12345.\n'
+              '\tRepo Name: src\n'
+              '\tPath: %s\n'
+              '\tBranch: br\n'
+              'Perf Try job sent to rietveld for win platform.\n'
+              'Perf Try job sent to rietveld for android platform.\n'
+              'Perf Try job sent to rietveld for win-x64 platform.\n'
+              'Perf Try job sent to rietveld for mac platform.\n'
+              'Perf Try job sent to rietveld for linux platform.') % (
+                  trybot_command.CHROMIUM_SRC_PATH)
+    self.assertEquals(output, sys.stdout.getvalue().strip())
 
 
 class IsBenchmarkDisabledOnTrybotPlatformTest(unittest.TestCase):
diff --git a/tools/perf/fetch_benchmark_deps.py b/tools/perf/fetch_benchmark_deps.py
index 6bbc1bb..abde42f0 100755
--- a/tools/perf/fetch_benchmark_deps.py
+++ b/tools/perf/fetch_benchmark_deps.py
@@ -10,8 +10,8 @@
 
 from core import path_util
 
-path_util.AddCatapultBaseToPath()
-from catapult_base import cloud_storage
+path_util.AddPyUtilsToPath()
+from py_utils import cloud_storage
 
 path_util.AddTelemetryToPath()
 from telemetry import benchmark_runner
diff --git a/tools/perf/fetch_benchmark_deps_unittest.py b/tools/perf/fetch_benchmark_deps_unittest.py
index 83e9684..12ead09 100644
--- a/tools/perf/fetch_benchmark_deps_unittest.py
+++ b/tools/perf/fetch_benchmark_deps_unittest.py
@@ -22,7 +22,7 @@
 
   It assumes the following telemetry APIs always success:
   telemetry.wpr.archive_info.WprArchiveInfo.DownloadArchivesIfNeeded
-  catapult_base.cloud_storage.GetFilesInDirectoryIfChanged
+  py_utils.cloud_storage.GetFilesInDirectoryIfChanged
   """
 
   def setUp(self):
@@ -46,7 +46,7 @@
     output = StringIO.StringIO()
     with mock.patch('telemetry.wpr.archive_info.WprArchiveInfo'
                     '.DownloadArchivesIfNeeded') as mock_download:
-      with mock.patch('catapult_base.cloud_storage'
+      with mock.patch('py_utils.cloud_storage'
                       '.GetFilesInDirectoryIfChanged') as mock_get:
         mock_download.return_value = True
         mock_get.GetFilesInDirectoryIfChanged.return_value = True
diff --git a/tools/perf/page_sets/data/system_health_desktop.json b/tools/perf/page_sets/data/system_health_desktop.json
index 9600ad1a..005225e 100644
--- a/tools/perf/page_sets/data/system_health_desktop.json
+++ b/tools/perf/page_sets/data/system_health_desktop.json
@@ -95,6 +95,10 @@
         ],
         "system_health_desktop_026.wpr": [
             "browse:media:youtube"
+        ],
+        "system_health_desktop_028.wpr": [
+            "long_running:tools:gmail-foreground",
+            "long_running:tools:gmail-background"
         ]
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating."
diff --git a/tools/perf/page_sets/data/system_health_mobile.json b/tools/perf/page_sets/data/system_health_mobile.json
index 3ec07256..edd80114 100644
--- a/tools/perf/page_sets/data/system_health_mobile.json
+++ b/tools/perf/page_sets/data/system_health_mobile.json
@@ -106,6 +106,10 @@
         "system_health_mobile_040.wpr": [
             "load:media:facebook_photos",
             "browse:media:facebook_photos"
+        ],
+        "system_health_mobile_042.wpr": [
+            "long_running:tools:gmail-foreground",
+            "long_running:tools:gmail-background"
         ]
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating."
diff --git a/tools/perf/page_sets/idle_after_loading_stories.py b/tools/perf/page_sets/idle_after_loading_stories.py
index 35c5689..f4b1b89f 100644
--- a/tools/perf/page_sets/idle_after_loading_stories.py
+++ b/tools/perf/page_sets/idle_after_loading_stories.py
@@ -5,17 +5,30 @@
 from telemetry import story
 
 
+# TODO(rnephew): Move to seperate file and merge with mac_gpu_sites BasePage.
+class _BasePage(page_module.Page):
+  def __init__(self, page_set, url, wait_in_seconds):
+    super(_BasePage, self).__init__(url=url, page_set=page_set)
+    self._wait_in_seconds = wait_in_seconds
+
+  def RunPageInteractions(self, action_runner):
+    action_runner.Wait(self._wait_in_seconds)
+
+
 class IdleAfterLoadingStories(story.StorySet):
   """Historically, Chrome has high CPU usage on these sites after the page has
   loaded. These user stories let Chrome idle on the page."""
 
-  def __init__(self):
+  def __init__(self, wait_in_seconds=0):
     super(IdleAfterLoadingStories, self).__init__(
         archive_data_file='data/idle_after_loading_stories.json',
         cloud_storage_bucket=story.PARTNER_BUCKET)
 
     # Chrome has high idle CPU usage on this site, even after its quiesced.
     # https://crbug.com/638365.
-    self.AddStory(page_module.Page(
+    urls = [
         'http://www.labradortraininghq.com/labrador-training/how-to-crate-train'
-        '-a-puppy/#How_Long_DoesIt_Take_To_Crate_Train_A_Puppy', page_set=self))
+        '-a-puppy/#How_Long_DoesIt_Take_To_Crate_Train_A_Puppy'
+    ]
+    for url in urls:
+      self.AddStory(_BasePage(self, url, wait_in_seconds))
diff --git a/tools/perf/page_sets/pregenerated_profile_shared_state.py b/tools/perf/page_sets/pregenerated_profile_shared_state.py
index 72e64f1..4f7cb02 100644
--- a/tools/perf/page_sets/pregenerated_profile_shared_state.py
+++ b/tools/perf/page_sets/pregenerated_profile_shared_state.py
@@ -8,7 +8,7 @@
 import tempfile
 import zipfile
 
-from catapult_base import cloud_storage
+from py_utils import cloud_storage
 
 from telemetry.page import shared_page_state
 
diff --git a/tools/perf/page_sets/system_health/long_running_stories.py b/tools/perf/page_sets/system_health/long_running_stories.py
new file mode 100644
index 0000000..84fb53b4
--- /dev/null
+++ b/tools/perf/page_sets/system_health/long_running_stories.py
@@ -0,0 +1,94 @@
+# 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.
+
+from page_sets.login_helpers import google_login
+from page_sets.system_health import platforms
+from page_sets.system_health import system_health_story
+
+
+IDLE_TIME_IN_SECONDS = 100
+SAMPLING_INTERVAL_IN_SECONDS = 1
+STEPS = IDLE_TIME_IN_SECONDS / SAMPLING_INTERVAL_IN_SECONDS
+
+
+class _LongRunningStory(system_health_story.SystemHealthStory):
+  """Abstract base class for long running stories."""
+  ABSTRACT_STORY = True
+  BACKGROUND = False
+
+  def RunPageInteractions(self, action_runner):
+    super(_LongRunningStory, self).RunPageInteractions(action_runner)
+    if self.BACKGROUND:
+      action_runner.tab.browser.tabs.New()
+    if self._take_memory_measurement:
+      action_runner.MeasureMemory()
+    for _ in xrange(STEPS):
+      action_runner.Wait(SAMPLING_INTERVAL_IN_SECONDS)
+      if self._take_memory_measurement:
+        action_runner.MeasureMemory()
+
+
+##############################################################################
+# Long running Gmail stories.
+##############################################################################
+
+# TODO(rnephew): Merge _Login() and _DidLoadDocument() with methods in
+# loading_stories.
+class _LongRunningGmailBase(_LongRunningStory):
+  URL = 'https://mail.google.com/mail/'
+  ABSTRACT_STORY = True
+
+  def _Login(self, action_runner):
+    google_login.LoginGoogleAccount(action_runner, 'googletest',
+                                    self.credentials_path)
+
+    # Navigating to https://mail.google.com immediately leads to an infinite
+    # redirection loop due to a bug in WPR (see
+    # https://github.com/chromium/web-page-replay/issues/70). We therefore first
+    # navigate to a sub-URL to set up the session and hit the resulting
+    # redirection loop. Afterwards, we can safely navigate to
+    # https://mail.google.com.
+    action_runner.Navigate(
+        'https://mail.google.com/mail/mu/mp/872/trigger_redirection_loop')
+    action_runner.tab.WaitForDocumentReadyStateToBeComplete()
+
+class _LongRunningGmailMobileBase(_LongRunningGmailBase):
+  SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY
+
+  def _DidLoadDocument(self, action_runner):
+    # Close the "Get Inbox by Gmail" interstitial.
+    action_runner.WaitForJavaScriptCondition(
+        'document.querySelector("#isppromo a") !== null')
+    action_runner.ExecuteJavaScript(
+        'document.querySelector("#isppromo a").click()')
+    # Wait until the UI loads.
+    action_runner.WaitForJavaScriptCondition(
+        'document.getElementById("apploadingdiv").style.height === "0px"')
+
+
+class _LongRunningGmailDesktopBase(_LongRunningGmailBase):
+  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
+
+  def _DidLoadDocument(self, action_runner):
+    # Wait until the UI loads.
+    action_runner.WaitForJavaScriptCondition(
+        'document.getElementById("loading").style.display === "none"')
+
+
+class LongRunningGmailMobileForegroundStory(_LongRunningGmailMobileBase):
+  NAME = 'long_running:tools:gmail-foreground'
+
+
+class LongRunningGmailDesktopForegroundStory(_LongRunningGmailDesktopBase):
+  NAME = 'long_running:tools:gmail-foreground'
+
+
+class LongRunningGmailMobileBackgroundStory(_LongRunningGmailMobileBase):
+  BACKGROUND = True
+  NAME = 'long_running:tools:gmail-background'
+
+
+class LongRunningGmailDesktopBackgroundStory(_LongRunningGmailDesktopBase):
+  BACKGROUND = True
+  NAME = 'long_running:tools:gmail-background'
diff --git a/tools/perf/profile_creators/__init__.py b/tools/perf/profile_creators/__init__.py
index 73b739c..29e73ca8 100644
--- a/tools/perf/profile_creators/__init__.py
+++ b/tools/perf/profile_creators/__init__.py
@@ -11,4 +11,4 @@
 
 
 path_util.AddTelemetryToPath()
-path_util.AddCatapultBaseToPath()
+path_util.AddPyUtilsToPath()
diff --git a/tools/perf/profile_creators/extension_profile_extender.py b/tools/perf/profile_creators/extension_profile_extender.py
index be061c0c..52b46152a 100644
--- a/tools/perf/profile_creators/extension_profile_extender.py
+++ b/tools/perf/profile_creators/extension_profile_extender.py
@@ -14,8 +14,8 @@
 if sys.platform == 'win32':
   import _winreg as winreg  # pylint: disable=import-error
 
-from catapult_base import cloud_storage
 from profile_creators import profile_extender
+from py_utils import cloud_storage
 from telemetry.core import exceptions
 
 
diff --git a/tools/perf/profile_creators/update_remote_extensions.py b/tools/perf/profile_creators/update_remote_extensions.py
index c8d36c6..bf28d4a 100644
--- a/tools/perf/profile_creators/update_remote_extensions.py
+++ b/tools/perf/profile_creators/update_remote_extensions.py
@@ -18,8 +18,8 @@
 from core import path_util
 
 
-path_util.AddCatapultBaseToPath()
-from catapult_base import cloud_storage
+path_util.AddPyUtilsToPath()
+from py_utils import cloud_storage
 
 path_util.AddTelemetryToPath()
 from telemetry.core import exceptions
diff --git a/ui/accessibility/PRESUBMIT.py b/ui/accessibility/PRESUBMIT.py
new file mode 100644
index 0000000..ef41ab0
--- /dev/null
+++ b/ui/accessibility/PRESUBMIT.py
@@ -0,0 +1,95 @@
+# 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.
+
+"""Presubmit script for ui/accessibility."""
+
+import os, re
+
+AX_IDL = 'ui/accessibility/ax_enums.idl'
+AUTOMATION_IDL = 'chrome/common/extensions/api/automation.idl'
+
+def InitialLowerCamelCase(unix_name):
+  words = unix_name.split('_')
+  return words[0] + ''.join(word.capitalize() for word in words[1:])
+
+# Given a full path to an IDL file containing enum definitions,
+# parse the file for enums and return a dict mapping the enum name
+# to a list of values for that enum.
+def GetEnumsFromFile(fullpath):
+  enum_name = None
+  enums = {}
+  for line in open(fullpath).readlines():
+    # Strip out comments
+    line = re.sub('//.*', '', line)
+
+    # Look for lines of the form "enum ENUM_NAME {" and get the enum_name
+    m = re.search('enum ([\w]+) {', line)
+    if m:
+      enum_name = m.group(1)
+      continue
+
+    # Look for a "}" character signifying the end of an enum
+    if line.find('}') >= 0:
+      enum_name = None
+      continue
+
+    if not enum_name:
+      continue
+
+    # If we're inside an enum definition, add the first string consisting of
+    # alphanumerics plus underscore ("\w") to the list of values for that enum.
+    m = re.search('([\w]+)', line)
+    if m:
+      enums.setdefault(enum_name, [])
+      enums[enum_name].append(m.group(1))
+
+  return enums
+
+def CheckMatchingEnum(ax_enums,
+                      ax_enum_name,
+                      automation_enums,
+                      automation_enum_name,
+                      errs,
+                      output_api):
+  if ax_enum_name not in ax_enums:
+    errs.append(output_api.PresubmitError(
+        'Expected %s to have an enum named %s' % (AX_IDL, ax_enum_name)))
+    return
+  if automation_enum_name not in automation_enums:
+    errs.append(output_api.PresubmitError(
+        'Expected %s to have an enum named %s' % (
+            AUTOMATION_IDL, automation_enum_name)))
+    return
+  src = ax_enums[ax_enum_name]
+  dst = automation_enums[automation_enum_name]
+  for value in src:
+    if InitialLowerCamelCase(value) not in dst:
+      errs.append(output_api.PresubmitError(
+          'Found %s.%s in %s, but did not find %s.%s in %s' % (
+              ax_enum_name, value, AX_IDL,
+              automation_enum_name, InitialLowerCamelCase(value),
+              AUTOMATION_IDL)))
+
+def CheckEnumsMatch(input_api, output_api):
+  repo_root = input_api.change.RepositoryRoot()
+  ax_enums = GetEnumsFromFile(os.path.join(repo_root, AX_IDL))
+  automation_enums = GetEnumsFromFile(os.path.join(repo_root, AUTOMATION_IDL))
+  errs = []
+  CheckMatchingEnum(ax_enums, 'AXRole', automation_enums, 'RoleType', errs,
+                    output_api)
+  CheckMatchingEnum(ax_enums, 'AXState', automation_enums, 'StateType', errs,
+                    output_api)
+  CheckMatchingEnum(ax_enums, 'AXEvent', automation_enums, 'EventType', errs,
+                    output_api)
+  return errs
+
+def CheckChangeOnUpload(input_api, output_api):
+  if AX_IDL not in input_api.LocalPaths():
+    return []
+  return CheckEnumsMatch(input_api, output_api)
+
+def CheckChangeOnCommit(input_api, output_api):
+  if AX_IDL not in input_api.LocalPaths():
+    return []
+  return CheckEnumsMatch(input_api, output_api)
diff --git a/ui/accessibility/ax_enums.idl b/ui/accessibility/ax_enums.idl
index 010460c..e706e135 100644
--- a/ui/accessibility/ax_enums.idl
+++ b/ui/accessibility/ax_enums.idl
@@ -8,7 +8,8 @@
 [camel_case_enum_to_string=true] namespace ui {
 
   // For new entries to the following three enums, also add to
-  // chrome/common/extensions/api/automation.idl.
+  // chrome/common/extensions/api/automation.idl. This is enforced
+  // by a PRESUBMIT check.
   //
   // Explanation of the comments next to these events:
   //
diff --git a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
index cceb825..dabb4689 100644
--- a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
+++ b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
@@ -182,6 +182,11 @@
         return new WindowAndroid(context);
     }
 
+    @CalledByNative
+    private void clearNativePointer() {
+        mNativeWindowAndroid = 0;
+    }
+
     /**
      * Set the delegate that will handle android permissions requests.
      */
@@ -502,8 +507,8 @@
      */
     public void destroy() {
         if (mNativeWindowAndroid != 0) {
+            // Native code clears |mNativeWindowAndroid|.
             nativeDestroy(mNativeWindowAndroid);
-            mNativeWindowAndroid = 0;
         }
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
diff --git a/ui/android/resources/resource_manager_impl_unittest.cc b/ui/android/resources/resource_manager_impl_unittest.cc
index 3fca7da..e4c4788 100644
--- a/ui/android/resources/resource_manager_impl_unittest.cc
+++ b/ui/android/resources/resource_manager_impl_unittest.cc
@@ -89,7 +89,7 @@
 class ResourceManagerTest : public testing::Test {
  public:
   ResourceManagerTest()
-      : window_android_(WindowAndroid::createForTesting()),
+      : window_android_(WindowAndroid::CreateForTesting()),
         resource_manager_(window_android_) {
     cc::LayerTreeHost::InitParams params;
     cc::LayerTreeSettings settings;
diff --git a/ui/android/window_android.cc b/ui/android/window_android.cc
index c53762c..67c6cc1 100644
--- a/ui/android/window_android.cc
+++ b/ui/android/window_android.cc
@@ -40,15 +40,20 @@
 WindowAndroid::~WindowAndroid() {
   DCHECK(parent_ == nullptr) << "WindowAndroid must be a root view.";
   DCHECK(!compositor_);
+  Java_WindowAndroid_clearNativePointer(AttachCurrentThread(), GetJavaObject());
 }
 
-WindowAndroid* WindowAndroid::createForTesting() {
+WindowAndroid* WindowAndroid::CreateForTesting() {
   JNIEnv* env = AttachCurrentThread();
   const JavaRef<jobject>& context = base::android::GetApplicationContext();
   return new WindowAndroid(
       env, Java_WindowAndroid_createForTesting(env, context).obj());
 }
 
+void WindowAndroid::DestroyForTesting() {
+  delete this;
+}
+
 void WindowAndroid::OnCompositingDidCommit() {
   FOR_EACH_OBSERVER(WindowAndroidObserver,
                     observer_list_,
diff --git a/ui/android/window_android.h b/ui/android/window_android.h
index d65235c..b55ba16 100644
--- a/ui/android/window_android.h
+++ b/ui/android/window_android.h
@@ -76,7 +76,8 @@
   // Return whether the specified Android permission can be requested by Chrome.
   bool CanRequestPermission(const std::string& permission);
 
-  static WindowAndroid* createForTesting();
+  static WindowAndroid* CreateForTesting();
+  void DestroyForTesting();
 
  private:
   ~WindowAndroid() override;
diff --git a/ui/arc/notification/arc_custom_notification_view.cc b/ui/arc/notification/arc_custom_notification_view.cc
index b17c234..c9fe786a 100644
--- a/ui/arc/notification/arc_custom_notification_view.cc
+++ b/ui/arc/notification/arc_custom_notification_view.cc
@@ -40,7 +40,33 @@
       return;
     }
 
-    owner_->OnEvent(event);
+    if (event->IsScrollEvent()) {
+      ForwardScrollEvent(event->AsScrollEvent());
+    } else if (event->IsMouseWheelEvent()) {
+      ForwardMouseWheelEvent(event->AsMouseWheelEvent());
+    } else if (!event->IsTouchEvent()) {
+      // Forward the rest events to |owner_| except touches because View
+      // should no longer receive touch events. See View::OnTouchEvent.
+      owner_->OnEvent(event);
+    }
+  }
+
+  void ForwardScrollEvent(ui::ScrollEvent* event) {
+    views::Widget* widget = owner_->GetWidget();
+    if (!widget)
+      return;
+
+    event->target()->ConvertEventToTarget(widget->GetNativeWindow(), event);
+    widget->OnScrollEvent(event);
+  }
+
+  void ForwardMouseWheelEvent(ui::MouseWheelEvent* event) {
+    views::Widget* widget = owner_->GetWidget();
+    if (!widget)
+      return;
+
+    event->target()->ConvertEventToTarget(widget->GetNativeWindow(), event);
+    widget->OnMouseEvent(event);
   }
 
   ArcCustomNotificationView* const owner_;
diff --git a/ui/base/cocoa/cocoa_base_utils_unittest.mm b/ui/base/cocoa/cocoa_base_utils_unittest.mm
index f379120..a2b64a55 100644
--- a/ui/base/cocoa/cocoa_base_utils_unittest.mm
+++ b/ui/base/cocoa/cocoa_base_utils_unittest.mm
@@ -32,11 +32,13 @@
 TEST_F(CocoaBaseUtilsTest, WindowOpenDispositionFromNSEvent) {
   // Left Click = same tab.
   NSEvent* me = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp, 0);
-  EXPECT_EQ(CURRENT_TAB, WindowOpenDispositionFromNSEvent(me));
+  EXPECT_EQ(WindowOpenDisposition::CURRENT_TAB,
+            WindowOpenDispositionFromNSEvent(me));
 
   // Middle Click = new background tab.
   me = cocoa_test_event_utils::MouseEventWithType(NSOtherMouseUp, 0);
-  EXPECT_EQ(NEW_BACKGROUND_TAB, WindowOpenDispositionFromNSEvent(me));
+  EXPECT_EQ(WindowOpenDisposition::NEW_BACKGROUND_TAB,
+            WindowOpenDispositionFromNSEvent(me));
 
   // Shift+Middle Click = new foreground tab.
   {
@@ -44,24 +46,27 @@
         [NSEvent class], [TestEvent class], @selector(modifierFlags));
     me = cocoa_test_event_utils::MouseEventWithType(NSOtherMouseUp,
                                                     NSShiftKeyMask);
-    EXPECT_EQ(NEW_FOREGROUND_TAB, WindowOpenDispositionFromNSEvent(me));
+    EXPECT_EQ(WindowOpenDisposition::NEW_FOREGROUND_TAB,
+              WindowOpenDispositionFromNSEvent(me));
   }
 
   // Cmd+Left Click = new background tab.
   me = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp,
                                                   NSCommandKeyMask);
-  EXPECT_EQ(NEW_BACKGROUND_TAB, WindowOpenDispositionFromNSEvent(me));
+  EXPECT_EQ(WindowOpenDisposition::NEW_BACKGROUND_TAB,
+            WindowOpenDispositionFromNSEvent(me));
 
   // Cmd+Shift+Left Click = new foreground tab.
-  me = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp,
-                                              NSCommandKeyMask |
-                                              NSShiftKeyMask);
-  EXPECT_EQ(NEW_FOREGROUND_TAB, WindowOpenDispositionFromNSEvent(me));
+  me = cocoa_test_event_utils::MouseEventWithType(
+      NSLeftMouseUp, NSCommandKeyMask | NSShiftKeyMask);
+  EXPECT_EQ(WindowOpenDisposition::NEW_FOREGROUND_TAB,
+            WindowOpenDispositionFromNSEvent(me));
 
   // Shift+Left Click = new window
   me = cocoa_test_event_utils::MouseEventWithType(NSLeftMouseUp,
                                                   NSShiftKeyMask);
-  EXPECT_EQ(NEW_WINDOW, WindowOpenDispositionFromNSEvent(me));
+  EXPECT_EQ(WindowOpenDisposition::NEW_WINDOW,
+            WindowOpenDispositionFromNSEvent(me));
 }
 
 }  // namespace
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 29c3be44..049c5e2 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -17,7 +17,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
 #include "base/strings/string_piece.h"
@@ -332,8 +331,6 @@
 
   std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
   if (!data_pack->LoadFromPath(locale_file_path)) {
-    UMA_HISTOGRAM_ENUMERATION("ResourceBundle.LoadLocaleResourcesError",
-                              logging::GetLastSystemErrorCode(), 16000);
     LOG(ERROR) << "failed to load locale.pak";
     NOTREACHED();
     return std::string();
diff --git a/ui/base/resource/resource_bundle_android.cc b/ui/base/resource/resource_bundle_android.cc
index 58d7015..21ef9ff 100644
--- a/ui/base/resource/resource_bundle_android.cc
+++ b/ui/base/resource/resource_bundle_android.cc
@@ -8,7 +8,6 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/logging.h"
-#include "base/metrics/histogram.h"
 #include "base/path_service.h"
 #include "jni/ResourceBundle_jni.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -109,8 +108,6 @@
   std::unique_ptr<DataPack> data_pack(new DataPack(SCALE_FACTOR_100P));
   if (!data_pack->LoadFromFileRegion(base::File(g_locale_pack_fd),
                                      g_locale_pack_region)) {
-    UMA_HISTOGRAM_ENUMERATION("ResourceBundle.LoadLocaleResourcesError",
-                              logging::GetLastSystemErrorCode(), 16000);
     LOG(ERROR) << "failed to load locale.pak";
     NOTREACHED();
     return std::string();
diff --git a/ui/base/window_open_disposition.cc b/ui/base/window_open_disposition.cc
index c0d131f4..90d9fbd4 100644
--- a/ui/base/window_open_disposition.cc
+++ b/ui/base/window_open_disposition.cc
@@ -20,12 +20,13 @@
 #else
   if (middle_button || ctrl_key)
 #endif
-    return shift_key ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
+    return shift_key ? WindowOpenDisposition::NEW_FOREGROUND_TAB
+                     : WindowOpenDisposition::NEW_BACKGROUND_TAB;
   if (shift_key)
-    return NEW_WINDOW;
+    return WindowOpenDisposition::NEW_WINDOW;
   if (alt_key)
-    return SAVE_TO_DISK;
-  return CURRENT_TAB;
+    return WindowOpenDisposition::SAVE_TO_DISK;
+  return WindowOpenDisposition::CURRENT_TAB;
 }
 
 WindowOpenDisposition DispositionFromEventFlags(int event_flags) {
diff --git a/ui/base/window_open_disposition.h b/ui/base/window_open_disposition.h
index 74fcfbe..f6dc4fb9 100644
--- a/ui/base/window_open_disposition.h
+++ b/ui/base/window_open_disposition.h
@@ -9,7 +9,7 @@
 
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.ui
-enum WindowOpenDisposition {
+enum class WindowOpenDisposition {
   UNKNOWN,
   CURRENT_TAB,
   // Indicates that only one tab with the url should exist in the same window.
@@ -22,7 +22,7 @@
   OFF_THE_RECORD,
   IGNORE_ACTION,
   // Update when adding a new disposition.
-  WINDOW_OPEN_DISPOSITION_LAST = IGNORE_ACTION
+  MAX_VALUE = IGNORE_ACTION
 };
 
 namespace ui {
diff --git a/ui/display/display_observer.cc b/ui/display/display_observer.cc
index fb3fd8c7..b25f1fa8 100644
--- a/ui/display/display_observer.cc
+++ b/ui/display/display_observer.cc
@@ -8,4 +8,11 @@
 
 DisplayObserver::~DisplayObserver() {}
 
+void DisplayObserver::OnDisplayAdded(const Display& new_display) {}
+
+void DisplayObserver::OnDisplayRemoved(const Display& old_display) {}
+
+void DisplayObserver::OnDisplayMetricsChanged(const Display& display,
+                                              uint32_t changed_metrics) {}
+
 }  // namespace display
diff --git a/ui/display/display_observer.h b/ui/display/display_observer.h
index a41e7068..92afb1a 100644
--- a/ui/display/display_observer.h
+++ b/ui/display/display_observer.h
@@ -27,15 +27,15 @@
   };
 
   // Called when |new_display| has been added.
-  virtual void OnDisplayAdded(const Display& new_display) = 0;
+  virtual void OnDisplayAdded(const Display& new_display);
 
   // Called when |old_display| has been removed.
-  virtual void OnDisplayRemoved(const Display& old_display) = 0;
+  virtual void OnDisplayRemoved(const Display& old_display);
 
   // Called when a |display| has one or more metrics changed. |changed_metrics|
   // will contain the information about the change, see |DisplayMetric|.
   virtual void OnDisplayMetricsChanged(const Display& display,
-                                       uint32_t changed_metrics) = 0;
+                                       uint32_t changed_metrics);
 
  protected:
   virtual ~DisplayObserver();
diff --git a/ui/events/blink/input_handler_proxy.cc b/ui/events/blink/input_handler_proxy.cc
index d12cbb0f..5cbb1cc9 100644
--- a/ui/events/blink/input_handler_proxy.cc
+++ b/ui/events/blink/input_handler_proxy.cc
@@ -581,6 +581,7 @@
         &scroll_state, GestureScrollInputType(gesture_event.sourceDevice));
   } else if (ShouldAnimate(gesture_event.data.scrollBegin.deltaHintUnits !=
                            blink::WebGestureEvent::ScrollUnits::Pixels)) {
+    DCHECK(!scroll_state.is_in_inertial_phase());
     gfx::Point scroll_point(gesture_event.x, gesture_event.y);
     scroll_status = input_handler_->ScrollAnimatedBegin(scroll_point);
   } else {
diff --git a/ui/gfx/paint_vector_icon.cc b/ui/gfx/paint_vector_icon.cc
index e0eb6b7c..8e4b8e96 100644
--- a/ui/gfx/paint_vector_icon.cc
+++ b/ui/gfx/paint_vector_icon.cc
@@ -311,25 +311,57 @@
 
 class VectorIconSource : public CanvasImageSource {
  public:
-  VectorIconSource(VectorIconId id,
+  VectorIconSource(const VectorIcon& icon,
                    int dip_size,
                    SkColor color,
-                   VectorIconId badge_id)
+                   const VectorIcon& badge_icon)
+      : CanvasImageSource(gfx::Size(dip_size, dip_size), false),
+        color_(color),
+        icon_(icon),
+        badge_(badge_icon) {}
+
+  ~VectorIconSource() override {}
+
+  // CanvasImageSource:
+  bool HasRepresentationAtAllScales() const override {
+    return !icon_.is_empty();
+  }
+
+  void Draw(gfx::Canvas* canvas) override {
+    PaintVectorIcon(canvas, icon_, size_.width(), color_);
+    if (!badge_.is_empty())
+      PaintVectorIcon(canvas, badge_, size_.width(), color_);
+  }
+
+ private:
+  const SkColor color_;
+  const VectorIcon& icon_;
+  const VectorIcon& badge_;
+
+  DISALLOW_COPY_AND_ASSIGN(VectorIconSource);
+};
+
+class VectorIconSourceLegacy : public CanvasImageSource {
+ public:
+  VectorIconSourceLegacy(VectorIconId id,
+                         int dip_size,
+                         SkColor color,
+                         VectorIconId badge_id)
       : CanvasImageSource(gfx::Size(dip_size, dip_size), false),
         id_(id),
         color_(color),
         badge_id_(badge_id) {}
 
-  VectorIconSource(const std::string& definition,
-                   int dip_size,
-                   SkColor color)
+  VectorIconSourceLegacy(const std::string& definition,
+                         int dip_size,
+                         SkColor color)
       : CanvasImageSource(gfx::Size(dip_size, dip_size), false),
         id_(VectorIconId::VECTOR_ICON_NONE),
         path_(PathFromSource(definition)),
         color_(color),
         badge_id_(VectorIconId::VECTOR_ICON_NONE) {}
 
-  ~VectorIconSource() override {}
+  ~VectorIconSourceLegacy() override {}
 
   // CanvasImageSource:
   bool HasRepresentationAtAllScales() const override {
@@ -352,7 +384,7 @@
   const SkColor color_;
   const VectorIconId badge_id_;
 
-  DISALLOW_COPY_AND_ASSIGN(VectorIconSource);
+  DISALLOW_COPY_AND_ASSIGN(VectorIconSourceLegacy);
 };
 
 // This class caches vector icons (as ImageSkia) so they don't have to be drawn
@@ -363,6 +395,58 @@
   VectorIconCache() {}
   ~VectorIconCache() {}
 
+  ImageSkia GetOrCreateIcon(const VectorIcon& icon,
+                            int dip_size,
+                            SkColor color,
+                            const VectorIcon& badge_icon) {
+    IconDescription description(&icon, dip_size, color, &badge_icon);
+    auto iter = images_.find(description);
+    if (iter != images_.end())
+      return iter->second;
+
+    ImageSkia icon_image(
+        new VectorIconSource(icon, dip_size, color, badge_icon),
+        gfx::Size(dip_size, dip_size));
+    images_.insert(std::make_pair(description, icon_image));
+    return icon_image;
+  }
+
+ private:
+  struct IconDescription {
+    IconDescription(const VectorIcon* icon,
+                    int dip_size,
+                    SkColor color,
+                    const VectorIcon* badge_icon)
+        : icon(icon),
+          dip_size(dip_size),
+          color(color),
+          badge_icon(badge_icon) {}
+
+    bool operator<(const IconDescription& other) const {
+      return std::tie(icon, dip_size, color, badge_icon) <
+             std::tie(other.icon, other.dip_size, other.color,
+                      other.badge_icon);
+    }
+
+    const gfx::VectorIcon* icon;
+    int dip_size;
+    SkColor color;
+    const gfx::VectorIcon* badge_icon;
+  };
+
+  std::map<IconDescription, ImageSkia> images_;
+
+  DISALLOW_COPY_AND_ASSIGN(VectorIconCache);
+};
+
+static base::LazyInstance<VectorIconCache> g_icon_cache =
+    LAZY_INSTANCE_INITIALIZER;
+
+class VectorIconCacheLegacy {
+ public:
+  VectorIconCacheLegacy() {}
+  ~VectorIconCacheLegacy() {}
+
   ImageSkia GetOrCreateIcon(VectorIconId id,
                             int dip_size,
                             SkColor color,
@@ -372,7 +456,7 @@
     if (iter != images_.end())
       return iter->second;
 
-    ImageSkia icon(new VectorIconSource(id, dip_size, color, badge_id),
+    ImageSkia icon(new VectorIconSourceLegacy(id, dip_size, color, badge_id),
                    gfx::Size(dip_size, dip_size));
     images_.insert(std::make_pair(description, icon));
     return icon;
@@ -392,21 +476,23 @@
     }
 
     VectorIconId id;
-    size_t dip_size;
+    int dip_size;
     SkColor color;
     VectorIconId badge_id;
   };
 
   std::map<IconDescription, ImageSkia> images_;
 
-  DISALLOW_COPY_AND_ASSIGN(VectorIconCache);
+  DISALLOW_COPY_AND_ASSIGN(VectorIconCacheLegacy);
 };
 
-static base::LazyInstance<VectorIconCache> g_icon_cache =
+static base::LazyInstance<VectorIconCacheLegacy> g_icon_cache_legacy =
     LAZY_INSTANCE_INITIALIZER;
 
 }  // namespace
 
+const VectorIcon kNoneIcon = {};
+
 void PaintVectorIcon(Canvas* canvas,
                      VectorIconId id,
                      int dip_size,
@@ -418,6 +504,17 @@
   PaintPath(canvas, path, dip_size, color);
 }
 
+void PaintVectorIcon(Canvas* canvas,
+                     const VectorIcon& icon,
+                     int dip_size,
+                     SkColor color) {
+  DCHECK(!icon.is_empty());
+  const PathElement* path = (canvas->image_scale() == 1.f && icon.path_1x_)
+                                ? icon.path_1x_
+                                : icon.path_;
+  PaintPath(canvas, path, dip_size, color);
+}
+
 ImageSkia CreateVectorIcon(VectorIconId id, SkColor color) {
   const PathElement* one_x_path = GetPathForVectorIconAt1xScale(id);
   int size = (one_x_path[0].type == CANVAS_DIMENSIONS)
@@ -426,27 +523,48 @@
   return CreateVectorIcon(id, size, color);
 }
 
+ImageSkia CreateVectorIcon(const VectorIcon& icon, SkColor color) {
+  const PathElement* one_x_path = icon.path_1x_ ? icon.path_1x_ : icon.path_;
+  int size = one_x_path[0].type == CANVAS_DIMENSIONS ? one_x_path[1].arg
+                                                     : kReferenceSizeDip;
+  return CreateVectorIcon(icon, size, color);
+}
+
 ImageSkia CreateVectorIcon(VectorIconId id, int dip_size, SkColor color) {
   return CreateVectorIconWithBadge(id, dip_size, color,
                                    VectorIconId::VECTOR_ICON_NONE);
 }
 
+ImageSkia CreateVectorIcon(const VectorIcon& icon,
+                           int dip_size,
+                           SkColor color) {
+  return CreateVectorIconWithBadge(icon, dip_size, color, kNoneIcon);
+}
+
 ImageSkia CreateVectorIconWithBadge(VectorIconId id,
                                     int dip_size,
                                     SkColor color,
                                     VectorIconId badge_id) {
   return (id == VectorIconId::VECTOR_ICON_NONE)
              ? gfx::ImageSkia()
-             : g_icon_cache.Get().GetOrCreateIcon(id, dip_size, color,
-                                                  badge_id);
+             : g_icon_cache_legacy.Get().GetOrCreateIcon(id, dip_size, color,
+                                                         badge_id);
+}
+
+ImageSkia CreateVectorIconWithBadge(const VectorIcon& icon,
+                                    int dip_size,
+                                    SkColor color,
+                                    const VectorIcon& badge_icon) {
+  return icon.is_empty() ? gfx::ImageSkia()
+                         : g_icon_cache.Get().GetOrCreateIcon(
+                               icon, dip_size, color, badge_icon);
 }
 
 ImageSkia CreateVectorIconFromSource(const std::string& source,
                                      int dip_size,
                                      SkColor color) {
-  return ImageSkia(
-      new VectorIconSource(source, dip_size, color),
-      gfx::Size(dip_size, dip_size));
+  return ImageSkia(new VectorIconSourceLegacy(source, dip_size, color),
+                   gfx::Size(dip_size, dip_size));
 }
 
 }  // namespace gfx
diff --git a/ui/gfx/paint_vector_icon.h b/ui/gfx/paint_vector_icon.h
index d069c89..0b84d85 100644
--- a/ui/gfx/paint_vector_icon.h
+++ b/ui/gfx/paint_vector_icon.h
@@ -12,8 +12,11 @@
 namespace gfx {
 
 class Canvas;
+struct VectorIcon;
 enum class VectorIconId;
 
+GFX_EXPORT extern const VectorIcon kNoneIcon;
+
 // Draws a vector icon identified by |id| onto |canvas| at (0, 0). |dip_size|
 // is the length of a single edge of the square icon, in device independent
 // pixels. |color| is used as the fill.
@@ -21,16 +24,24 @@
                                 VectorIconId id,
                                 int dip_size,
                                 SkColor color);
+GFX_EXPORT void PaintVectorIcon(Canvas* canvas,
+                                const VectorIcon& icon,
+                                int dip_size,
+                                SkColor color);
 
 // Creates an ImageSkia which will render the icon on demand. The size will come
 // from the .icon file (the 1x version, if multiple versions exist).
 GFX_EXPORT ImageSkia CreateVectorIcon(VectorIconId id,
                                       SkColor color);
+GFX_EXPORT ImageSkia CreateVectorIcon(const VectorIcon& icon, SkColor color);
 
 // As above, but creates the image at the given size.
 GFX_EXPORT ImageSkia CreateVectorIcon(VectorIconId id,
                                       int dip_size,
                                       SkColor color);
+GFX_EXPORT ImageSkia CreateVectorIcon(const VectorIcon& icon,
+                                      int dip_size,
+                                      SkColor color);
 
 // As above, but also paints a badge defined by |badge_id| on top of the icon.
 // The badge uses the same canvas size and default color as the icon.
@@ -38,6 +49,10 @@
                                                int dip_size,
                                                SkColor color,
                                                VectorIconId badge_id);
+GFX_EXPORT ImageSkia CreateVectorIconWithBadge(const VectorIcon& icon,
+                                               int dip_size,
+                                               SkColor color,
+                                               const VectorIcon& badge_icon);
 
 #if defined(GFX_VECTOR_ICONS_UNSAFE) || defined(GFX_IMPLEMENTATION)
 // Takes a string of the format expected of .icon files and renders onto
diff --git a/ui/gfx/vector_icon_types.h b/ui/gfx/vector_icon_types.h
index cc1be94d..034ab99f 100644
--- a/ui/gfx/vector_icon_types.h
+++ b/ui/gfx/vector_icon_types.h
@@ -72,6 +72,17 @@
   };
 };
 
+struct VectorIcon {
+  VectorIcon() : path_(nullptr), path_1x_(nullptr) {}
+  VectorIcon(gfx::PathElement* path, gfx::PathElement* path_1x)
+      : path_(path), path_1x_(path_1x) {}
+
+  bool is_empty() const { return !path_; }
+
+  gfx::PathElement* path_;
+  gfx::PathElement* path_1x_;
+};
+
 // Returns an array of path commands and arguments, terminated by END.
 const PathElement* GetPathForVectorIcon(VectorIconId id);
 // As above, but returns an icon specifically adjusted for 1x scale factors.
diff --git a/ui/gfx/vector_icons/BUILD.gn b/ui/gfx/vector_icons/BUILD.gn
index 143c28c..de7db04a 100644
--- a/ui/gfx/vector_icons/BUILD.gn
+++ b/ui/gfx/vector_icons/BUILD.gn
@@ -171,8 +171,6 @@
     "system_menu_cast.icon",
     "system_menu_child_user.1x.icon",
     "system_menu_child_user.icon",
-    "system_menu_keyboard.1x.icon",
-    "system_menu_keyboard.icon",
     "system_menu_rotation_lock_auto.1x.icon",
     "system_menu_rotation_lock_auto.icon",
     "system_menu_rotation_lock_locked.1x.icon",
@@ -268,6 +266,7 @@
     "--file_list={{response_file_name}}",
     "--output_cc=" + rebase_path(output_cc, root_build_dir),
     "--output_h=" + rebase_path(output_h, root_build_dir),
+    "--use_legacy_template",
   ]
 }
 
diff --git a/ui/gfx/vector_icons/aggregate_vector_icons.py b/ui/gfx/vector_icons/aggregate_vector_icons.py
index b40c29b..6b028fe 100644
--- a/ui/gfx/vector_icons/aggregate_vector_icons.py
+++ b/ui/gfx/vector_icons/aggregate_vector_icons.py
@@ -7,20 +7,11 @@
 import optparse
 import os
 import shlex
+import sys
 import textwrap
 
-def AggregateVectorIcons(working_directory, file_list, output_cc, output_h):
-  """Compiles all .icon files in a directory into two C++ files.
-
-  Args:
-      working_directory: The path to the directory that holds the .icon files
-          and C++ templates.
-      file_list: A file containing the list of vector icon files to process.
-          Used for GN only (this argument defaults to None for GYP).
-      output_cc: The path that should be used to write the .cc file.
-      output_h: The path that should be used to write the .h file.
-  """
-
+def AggregateVectorIconsLegacy(working_directory, file_list, output_cc,
+                               output_h):
   icon_list = []
   if file_list is None:
     # TODO(GYP_GONE): |file_list| is only None for GYP builds (where response
@@ -79,6 +70,139 @@
   output_cc.close()
 
 
+def Error(msg):
+  print >> sys.stderr, msg
+  sys.exit(1)
+
+
+def CamelCase(name, suffix):
+  words = name.split('_')
+  words = [w.capitalize() for w in words]
+  return 'k' + ''.join(words) + suffix
+
+
+def AggregateVectorIcons(working_directory, file_list, output_cc, output_h,
+                         use_legacy_template):
+  """Compiles all .icon files in a directory into two C++ files.
+
+  Args:
+      working_directory: The path to the directory that holds the .icon files
+          and C++ templates.
+      file_list: A file containing the list of vector icon files to process.
+          Used for GN only (this argument defaults to None for GYP).
+      output_cc: The path that should be used to write the .cc file.
+      output_h: The path that should be used to write the .h file.
+      use_legacy_template: If True, |output_cc| and |output_h| are generated
+          using .template files which make use of the VectorIconId enum.
+  """
+
+  # TODO(tdanderson): Remove this code once all vector icons map to VectorIcon
+  # constants rather than VectorIconId values.
+  if use_legacy_template:
+    AggregateVectorIconsLegacy(working_directory, file_list, output_cc,
+                               output_h)
+    return
+
+  # For each file in |file_list|, place it in |path_map| if its extension is
+  # .icon or place it in |path_map_1x| if its extension is .1x.icon. The
+  # two dictionaries map the icon's name to its path, e.g.,
+  # path_map['cat'] = 'foo/bar/cat.icon'.
+  icon_list = []
+  with open(file_list, 'r') as f:
+    file_list_contents = f.read()
+  icon_list = shlex.split(file_list_contents)
+
+  path_map = {}
+  path_map_1x = {}
+
+  for icon_path in icon_list:
+    (icon_name, extension) = os.path.splitext(os.path.basename(icon_path))
+    (icon_name, scale_factor) = os.path.splitext(icon_name)
+
+    if (scale_factor and scale_factor != ".1x") or (extension != ".icon"):
+      Error("Only filenames " + icon_name + ".icon or " + icon_name +
+            ".1x.icon are allowed.")
+
+    if not scale_factor and icon_name not in path_map:
+      path_map[icon_name] = icon_path
+    elif scale_factor and icon_name not in path_map_1x:
+      path_map_1x[icon_name] = icon_path
+    else:
+      Error("A vector icon with name '" + icon_name + "' already exists.")
+
+  for icon_1x in path_map_1x:
+    if icon_1x not in path_map:
+      Error("The file " + icon_1x + ".icon must be provided.")
+
+  # Generate the file vector_icons.h which declares a variable for each
+  # icon in |path_map|. The variable name is derived from the icon name by
+  # converting to camel case, prepending 'k', and appending 'Icon'. For
+  # example, the icon 'foo_bar' will have the variable name kFooBarIcon.
+  input_header_template = open(os.path.join(working_directory,
+                                            "vector_icons.h.template"))
+  header_template_contents = input_header_template.readlines()
+  input_header_template.close()
+
+  output_header = open(output_h, "w")
+  for line in header_template_contents:
+    if not "TEMPLATE_PLACEHOLDER" in line:
+      output_header.write(line)
+      continue
+
+    for icon in path_map:
+      (icon_name, extension) = os.path.splitext(
+                               os.path.basename(path_map[icon]))
+      (icon_name, scale_factor) = os.path.splitext(icon_name)
+      output_header.write(
+          "VECTOR_ICON_TEMPLATE_H({})\n".format(CamelCase(icon_name, "Icon")))
+  output_header.close()
+
+  # Copy the vector icon drawing commands from the .icon and .1x.icon files
+  # and use them to generate vector_icons.cc, which defines the variables
+  # declared in vector_icons.h.
+  input_cc_template = open(
+      os.path.join(working_directory, "vector_icons.cc.template"))
+  cc_template_contents = input_cc_template.readlines()
+  input_cc_template.close()
+
+  output_cc = open(output_cc, "w")
+  for line in cc_template_contents:
+    if not "TEMPLATE_PLACEHOLDER" in line:
+      output_cc.write(line)
+      continue;
+
+    for icon in path_map:
+      (icon_name, extension) = os.path.splitext(
+                               os.path.basename(path_map[icon]))
+      (icon_name, scale_factor) = os.path.splitext(icon_name)
+
+      # Store the vector-drawing commands for foo_bar.icon in the temporary
+      # variable kFooBarPath.
+      icon_file = open(path_map[icon])
+      vector_commands = "".join(icon_file.readlines())
+      icon_file.close()
+      output_cc.write("PATH_ELEMENT_TEMPLATE({}, {})\n".format(
+          CamelCase(icon_name, "Path"), vector_commands))
+
+      # Store the vector-drawing commands for foo_bar.1x.icon in the temporary
+      # variable kFooBarPath1x, if the file exists.
+      vector_commands_1x = None
+      if (icon in path_map_1x):
+        icon_file = open(path_map_1x[icon])
+        vector_commands_1x = "".join(icon_file.readlines())
+        icon_file.close()
+        output_cc.write("PATH_ELEMENT_TEMPLATE({}, {})\n".format(
+            CamelCase(icon_name, "Path1x"), vector_commands_1x))
+
+      # Define the value of kFooBarIcon.
+      third_arg = "nullptr" if vector_commands_1x is None else CamelCase(
+                  icon_name, "Path1x")
+      output_cc.write("VECTOR_ICON_TEMPLATE({}, {}, {})\n".format(CamelCase(
+          icon_name, "Icon"), CamelCase(icon_name, "Path"), third_arg))
+
+  output_cc.close()
+
+
 def main():
   parser = optparse.OptionParser()
   parser.add_option("--working_directory",
@@ -92,13 +216,20 @@
                     help="The path to output the CC file to.")
   parser.add_option("--output_h",
                     help="The path to output the header file to.")
+  parser.add_option("--use_legacy_template",
+                    action="store_true",
+                    help="When set, the VectorIconId enum is populated "
+                         "with values corresponding to .icon files in "
+                         "the current working directory.",
+                    default=False)
 
   (options, args) = parser.parse_args()
 
   AggregateVectorIcons(options.working_directory,
                        options.file_list,
                        options.output_cc,
-                       options.output_h)
+                       options.output_h,
+                       options.use_legacy_template)
 
 
 if __name__ == "__main__":
diff --git a/ui/keyboard/content/keyboard_ui_content.cc b/ui/keyboard/content/keyboard_ui_content.cc
index cd6a2ab..1b75b6a 100644
--- a/ui/keyboard/content/keyboard_ui_content.cc
+++ b/ui/keyboard/content/keyboard_ui_content.cc
@@ -296,12 +296,9 @@
 
 void KeyboardUIContent::LoadContents(const GURL& url) {
   if (keyboard_contents_) {
-    content::OpenURLParams params(
-        url,
-        content::Referrer(),
-        SINGLETON_TAB,
-        ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
-        false);
+    content::OpenURLParams params(url, content::Referrer(),
+                                  WindowOpenDisposition::SINGLETON_TAB,
+                                  ui::PAGE_TRANSITION_AUTO_TOPLEVEL, false);
     keyboard_contents_->OpenURL(params);
   }
 }
diff --git a/ui/login/account_picker/screen_account_picker.js b/ui/login/account_picker/screen_account_picker.js
index b2952eb5..6d4b8d5 100644
--- a/ui/login/account_picker/screen_account_picker.js
+++ b/ui/login/account_picker/screen_account_picker.js
@@ -177,6 +177,8 @@
           chrome.send('firstIncorrectPasswordAttempt',
               [activatedPod.user.emailAddress]);
         }
+        // Update the pod row display if incorrect password.
+        $('pod-row').setFocusedPodErrorDisplay(true);
         // We want bubble's arrow to point to the first letter of input.
         /** @const */ var BUBBLE_OFFSET = 7;
         /** @const */ var BUBBLE_PADDING = 4;
diff --git a/ui/login/account_picker/user_pod_row.css b/ui/login/account_picker/user_pod_row.css
index c1823ad..a9d964a3 100644
--- a/ui/login/account_picker/user_pod_row.css
+++ b/ui/login/account_picker/user_pod_row.css
@@ -161,7 +161,27 @@
   display: flex;
   position: absolute;
   top: 160px;
-  width: 160px;
+  width: 170px;
+}
+
+.auth-container .submit-button[disabled] {
+  color: #000;
+  opacity: 0.26;
+}
+
+.auth-container .submit-button {
+  box-sizing: border-box;
+  color: var(--google-blue-500);
+  height: 43px;
+  min-height: 43px;
+  min-width: 43px;
+  padding: 11.5px 10px;
+  position: relative;
+  width: 43px;
+}
+
+.auth-container .submit-button.error-shown {
+  color: #CD2A00;
 }
 
 .name-container {
@@ -229,13 +249,17 @@
 .capslock-on .capslock-hint-container {
   display: block;
   flex: none;
+  height: 43px;
+  position: relative;
+  width: 20px;
 }
 
 .capslock-hint {
   -webkit-margin-end: 6px;
   -webkit-margin-start: -2px;
+  margin: auto;
   position: relative;
-  top: 11px;
+  top: 15px;
 }
 
 .password-label,
diff --git a/ui/login/account_picker/user_pod_row.js b/ui/login/account_picker/user_pod_row.js
index dbf03e9..b5247b6 100644
--- a/ui/login/account_picker/user_pod_row.js
+++ b/ui/login/account_picker/user_pod_row.js
@@ -757,6 +757,8 @@
           this.handlePasswordKeyPress_.bind(this));
       this.passwordElement.addEventListener('input',
           this.handleInputChanged_.bind(this));
+      this.submitButton.addEventListener('click',
+          this.handleSubmitButtonClick_.bind(this));
 
       this.imageElement.addEventListener('load',
           this.parentNode.handlePodImageLoad.bind(this.parentNode, this));
@@ -766,6 +768,16 @@
       this.setAuthType(initialAuthType, null);
 
       this.userClickAuthAllowed_ = false;
+
+      // Lazy load the assets needed for the polymer submit button.
+      if (cr.isChromeOS && !cr.ui.login.ResourceLoader.alreadyLoadedAssets(
+              'custom-elements-user-pod')) {
+        cr.ui.login.ResourceLoader.registerAssets({
+            id: 'custom-elements-user-pod',
+            html: [{ url: 'custom_elements_user_pod.html' }]
+         });
+        cr.ui.login.ResourceLoader.loadAssetsOnIdle('custom-elements-user-pod');
+      }
     },
 
     /**
@@ -793,6 +805,14 @@
     },
 
     /**
+     * Handles a click event on submit button.
+     * @param {Event} e Click event.
+     */
+    handleSubmitButtonClick_: function(e) {
+      this.parentNode.setActivatedPod(this, e);
+    },
+
+    /**
      * Top edge margin number of pixels.
      * @type {?number}
      */
@@ -870,6 +890,14 @@
     },
 
     /**
+     * Gets submit button.
+     * @type {!HTMLInputElement}
+     */
+    get submitButton() {
+      return this.querySelector('.submit-button');
+    },
+
+    /**
      * Gets the password label, which is used to show a message where the
      * password field is normally.
      * @type {!HTMLInputElement}
@@ -1103,6 +1131,10 @@
       return this.pinKeyboard && this.pinKeyboard.offsetHeight > 0;
     },
 
+    set showError(visible) {
+      this.submitButton.classList.toggle('error-shown', visible);
+    },
+
     toggleTransitions: function(enable) {
       this.classList.toggle('flying-pin-pod', enable);
     },
@@ -1830,6 +1862,8 @@
     handleInputChanged_: function(e) {
       if (this.pinKeyboard)
         this.pinKeyboard.value = this.passwordElement.value;
+      this.submitButton.disabled = this.passwordElement.value.length <= 0;
+      this.showError = false;
     },
 
     /**
@@ -2604,11 +2638,28 @@
       userPod.initialize();
     },
 
+    /**
+     * Enables or disables transitions on the user pod.
+     * @param {boolean} enable
+     */
     togglePinTransitions: function(enable) {
       for (var i = 0; i < this.pods.length; ++i)
         this.pods[i].toggleTransitions(enable);
     },
 
+    /**
+     * Performs visual changes on the user pod if there is an error.
+     * @param {boolean} visible Whether to show or hide the display.
+     */
+    setFocusedPodErrorDisplay: function(visible) {
+      if (this.focusedPod_)
+        this.focusedPod_.showError = visible;
+    },
+
+    /**
+     * Shows or hides the pin keyboard for the current focused pod.
+     * @param {boolean} visible
+     */
     setFocusedPodPinVisibility: function(visible) {
       if (this.focusedPod_ && this.focusedPod_.user.showPin)
         this.focusedPod_.setPinVisibility(visible);
@@ -2975,9 +3026,17 @@
 
       // Wrap this in a set timeout so the function is called after the pod is
       // finished transitioning so that we work with the final pod dimensions.
-      setTimeout(function(podrow) {
-        podrow.scrollFocusedPodIntoView();
-      }, 200, this);
+      // If there is no focused pod that may be transitioning when this function
+      // is called, we can call scrollFocusedPodIntoView() right away.
+      var timeOut = 0;
+      if (this.focusedPod_) {
+        var style = getComputedStyle(this.focusedPod_);
+        timeOut = parseFloat(style.transitionDuration) * 1000;
+      }
+
+      setTimeout(function() {
+        this.scrollFocusedPodIntoView();
+      }.bind(this), timeOut);
     },
 
     /**
diff --git a/ui/login/account_picker/user_pod_template.html b/ui/login/account_picker/user_pod_template.html
index 845a40a..3cd5f64 100644
--- a/ui/login/account_picker/user_pod_template.html
+++ b/ui/login/account_picker/user_pod_template.html
@@ -6,6 +6,18 @@
 
 <style is="custom-style" include="user-pod-template-shared-styles"></style>
 
+<iron-iconset-svg name="user-pod" size="24">
+  <svg>
+    <defs>
+      <!--
+      Inlined from Polymer's iron-icons to avoid importing everything.
+      See http://goo.gl/Y1OdAq for instructions on adding additional icons.
+      -->
+      <g id="arrow-forward"><path d="M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"/></g>
+    </defs>
+  </svg>
+</iron-iconset-svg>
+
 <div id="user-pod-template" class="pod disabled" hidden>
   <div class="user-image-pane">
     <div class="user-image-container">
@@ -30,7 +42,7 @@
         <div class="learn-more"></div>
       </div>
     </div>
-    <div class="auth-container pin-tag">
+    <div class="auth-container">
       <!-- Password Authentication -->
       <div class="password-entry-container">
         <div class="password-container">
@@ -41,6 +53,9 @@
           <img class="capslock-hint"
                src="chrome://theme/IDR_LOGIN_PASSWORD_CAPS_LOCK" alt>
         </div>
+        <paper-icon-button class="submit-button" disabled
+                           icon="user-pod:arrow-forward">
+        </paper-icon-button>
       </div>
       <!-- User Click Authentication -->
       <div class="password-label"></div>
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc
index b5f3412e..d4b81afc 100644
--- a/ui/message_center/message_center_impl.cc
+++ b/ui/message_center/message_center_impl.cc
@@ -650,7 +650,7 @@
 }
 
 void MessageCenterImpl::RemoveAllNotifications(bool by_user, RemoveType type) {
-  bool remove_pinned = (type == RemoveType::NON_PINNED);
+  bool remove_pinned = (type == RemoveType::ALL);
 
   const NotificationBlockers& blockers =
       (type == RemoveType::ALL ? NotificationBlockers() /* empty blockers */
diff --git a/ui/message_center/message_center_impl_unittest.cc b/ui/message_center/message_center_impl_unittest.cc
index 6ac5cb4..282b6b8 100644
--- a/ui/message_center/message_center_impl_unittest.cc
+++ b/ui/message_center/message_center_impl_unittest.cc
@@ -576,6 +576,104 @@
   EXPECT_EQ(0u, message_center()->NotificationCount());
 }
 
+TEST_F(MessageCenterImplTest, RemoveAllNotifications) {
+  NotifierId notifier_id1(NotifierId::APPLICATION, "app1");
+  NotifierId notifier_id2(NotifierId::APPLICATION, "app2");
+
+  TotalNotificationBlocker blocker(message_center(), notifier_id1);
+  blocker.SetNotificationsEnabled(false);
+
+  // Notification 1: Visible, non-pinned
+  message_center()->AddNotification(std::unique_ptr<Notification>(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id1", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id1, RichNotificationData(), NULL)));
+
+  // Notification 2: Invisible, non-pinned
+  message_center()->AddNotification(std::unique_ptr<Notification>(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id2", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id2, RichNotificationData(), NULL)));
+
+  // Remove all the notifications which are visible and non-pinned.
+  message_center()->RemoveAllNotifications(
+      false /* by_user */, MessageCenter::RemoveType::NON_PINNED);
+
+  EXPECT_EQ(0u, message_center()->NotificationCount());
+  blocker.SetNotificationsEnabled(true);  // Show invisible notifications.
+  EXPECT_EQ(1u, message_center()->NotificationCount());
+
+  NotificationList::Notifications notifications =
+      message_center()->GetVisibleNotifications();
+  // Notification 1 should be removed.
+  EXPECT_FALSE(NotificationsContain(notifications, "id1"));
+  // Notification 2 shouldn't be removed since it was invisible.
+  EXPECT_TRUE(NotificationsContain(notifications, "id2"));
+}
+
+#if defined(OS_CHROMEOS)
+TEST_F(MessageCenterImplTest, RemoveAllNotificationsWithPinned) {
+  NotifierId notifier_id1(NotifierId::APPLICATION, "app1");
+  NotifierId notifier_id2(NotifierId::APPLICATION, "app2");
+
+  TotalNotificationBlocker blocker(message_center(), notifier_id1);
+  blocker.SetNotificationsEnabled(false);
+
+  // Notification 1: Visible, non-pinned
+  message_center()->AddNotification(std::unique_ptr<Notification>(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id1", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id1, RichNotificationData(), NULL)));
+
+  // Notification 2: Invisible, non-pinned
+  message_center()->AddNotification(std::unique_ptr<Notification>(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id2", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id2, RichNotificationData(), NULL)));
+
+  // Notification 3: Visible, pinned
+  std::unique_ptr<Notification> notification3(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id3", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id1, RichNotificationData(), NULL));
+  notification3->set_pinned(true);
+  message_center()->AddNotification(std::move(notification3));
+
+  // Notification 4: Invisible, pinned
+  std::unique_ptr<Notification> notification4(
+      new Notification(NOTIFICATION_TYPE_SIMPLE, "id4", UTF8ToUTF16("title"),
+                       UTF8ToUTF16("message"), gfx::Image() /* icon */,
+                       base::string16() /* display_source */, GURL(),
+                       notifier_id2, RichNotificationData(), NULL));
+  notification4->set_pinned(true);
+  message_center()->AddNotification(std::move(notification4));
+
+  // Remove all the notifications which are visible and non-pinned.
+  message_center()->RemoveAllNotifications(
+      false /* by_user */, MessageCenter::RemoveType::NON_PINNED);
+
+  EXPECT_EQ(1u, message_center()->NotificationCount());
+  blocker.SetNotificationsEnabled(true);  // Show invisible notifications.
+  EXPECT_EQ(3u, message_center()->NotificationCount());
+
+  NotificationList::Notifications notifications =
+      message_center()->GetVisibleNotifications();
+  // Notification 1 should be removed.
+  EXPECT_FALSE(NotificationsContain(notifications, "id1"));
+  // Notification 2 shouldn't be removed since it was invisible.
+  EXPECT_TRUE(NotificationsContain(notifications, "id2"));
+  // Notification 3 shouldn't be removed since it was pinned.
+  EXPECT_TRUE(NotificationsContain(notifications, "id3"));
+  // Notification 4 shouldn't be removed since it was invisible and pinned.
+  EXPECT_TRUE(NotificationsContain(notifications, "id4"));
+}
+#endif
+
 #if defined(OS_CHROMEOS)
 TEST_F(MessageCenterImplTest, CachedUnreadCount) {
   message_center()->AddNotification(
diff --git a/ui/views/controls/slider.cc b/ui/views/controls/slider.cc
index f1595999..08dc0f6 100644
--- a/ui/views/controls/slider.cc
+++ b/ui/views/controls/slider.cc
@@ -242,7 +242,7 @@
 }
 
 bool Slider::OnKeyPressed(const ui::KeyEvent& event) {
-  int new_value = value_;
+  float new_value = value_;
   if (event.key_code() == ui::VKEY_LEFT)
     new_value -= keyboard_increment_;
   else if (event.key_code() == ui::VKEY_RIGHT)
diff --git a/ui/views/controls/slider_unittest.cc b/ui/views/controls/slider_unittest.cc
index 930665e..cea0a7a 100644
--- a/ui/views/controls/slider_unittest.cc
+++ b/ui/views/controls/slider_unittest.cc
@@ -16,6 +16,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/event.h"
 #include "ui/events/gesture_event_details.h"
+#include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/test/slider_test_api.h"
 #include "ui/views/test/views_test_base.h"
@@ -302,6 +303,19 @@
   EXPECT_NEAR(0.75, slider()->value(), 0.03);
 }
 
+// Test the slider location by adjusting it using keyboard.
+TEST_F(HorizontalSliderTest, SliderValueForKeyboard) {
+  float value =0.5;
+  slider()->SetValue(value);
+  slider()->RequestFocus();
+  event_generator()->PressKey(ui::VKEY_RIGHT, 0);
+  EXPECT_GT(slider()->value(), value);
+
+  slider()->SetValue(value);
+  event_generator()->PressKey(ui::VKEY_LEFT, 0);
+  EXPECT_LT(slider()->value(), value);
+}
+
 // Verifies the correct SliderListener events are raised for a tap gesture.
 TEST_F(HorizontalSliderTest, SliderListenerEventsForTapGesture) {
   test::SliderTestApi slider_test_api(slider());
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.cc b/ui/views/controls/tabbed_pane/tabbed_pane.cc
index 0be0af678..e4a2f87c 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.cc
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.cc
@@ -10,12 +10,15 @@
 #include "third_party/skia/include/core/SkPath.h"
 #include "ui/accessibility/ax_view_state.h"
 #include "ui/base/default_style.h"
+#include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/font_list.h"
+#include "ui/views/border.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/tabbed_pane/tabbed_pane_listener.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/layout_manager.h"
 #include "ui/views/widget/widget.h"
 
@@ -32,6 +35,9 @@
 const gfx::Font::Weight kActiveWeight = gfx::Font::Weight::BOLD;
 const gfx::Font::Weight kInactiveWeight = gfx::Font::Weight::NORMAL;
 
+const int kHarmonyTabStripVerticalPad = 16;
+const int kHarmonyTabStripTabHeight = 40;
+
 }  // namespace
 
 namespace views {
@@ -62,6 +68,12 @@
   void Layout() override;
   const char* GetClassName() const override;
 
+ protected:
+  Label* title() { return title_; }
+
+  // Called whenever |tab_state_| changes.
+  virtual void OnStateChanged();
+
  private:
   enum TabState {
     TAB_INACTIVE,
@@ -81,6 +93,19 @@
   DISALLOW_COPY_AND_ASSIGN(Tab);
 };
 
+// A subclass of Tab that implements the Harmony visual styling.
+class MdTab : public Tab {
+ public:
+  MdTab(TabbedPane* tabbed_pane, const base::string16& title, View* contents);
+  ~MdTab() override;
+
+  // Overridden from Tab:
+  void OnStateChanged() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MdTab);
+};
+
 // The tab strip shown above the tab contents.
 class TabStrip : public View {
  public:
@@ -102,6 +127,22 @@
   DISALLOW_COPY_AND_ASSIGN(TabStrip);
 };
 
+// A subclass of TabStrip that implements the Harmony visual styling. This
+// class uses a BoxLayout to position tabs.
+class MdTabStrip : public TabStrip {
+ public:
+  explicit MdTabStrip(TabbedPane* tabbed_pane);
+  ~MdTabStrip() override;
+
+  // Overridden from View:
+  gfx::Size GetPreferredSize() const override;
+  void Layout() override;
+  void OnPaint(gfx::Canvas* canvas) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MdTabStrip);
+};
+
 // static
 const char Tab::kViewClassName[] = "Tab";
 
@@ -129,6 +170,27 @@
   SetState(selected ? TAB_ACTIVE : TAB_INACTIVE);
 }
 
+void Tab::OnStateChanged() {
+  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+  switch (tab_state_) {
+    case TAB_INACTIVE:
+      title_->SetEnabledColor(kTabTitleColor_Inactive);
+      title_->SetFontList(rb.GetFontListWithDelta(
+          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kInactiveWeight));
+      break;
+    case TAB_ACTIVE:
+      title_->SetEnabledColor(kTabTitleColor_Active);
+      title_->SetFontList(rb.GetFontListWithDelta(
+          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kActiveWeight));
+      break;
+    case TAB_HOVERED:
+      title_->SetEnabledColor(kTabTitleColor_Hovered);
+      title_->SetFontList(rb.GetFontListWithDelta(
+          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kHoverWeight));
+      break;
+  }
+}
+
 bool Tab::OnMousePressed(const ui::MouseEvent& event) {
   if (event.IsOnlyLeftMouseButton() &&
       GetLocalBounds().Contains(event.location()))
@@ -185,26 +247,43 @@
   if (tab_state == tab_state_)
     return;
   tab_state_ = tab_state;
+  OnStateChanged();
+  SchedulePaint();
+}
+
+MdTab::MdTab(TabbedPane* tabbed_pane,
+             const base::string16& title,
+             View* contents)
+    : Tab(tabbed_pane, title, contents) {
+  OnStateChanged();
+}
+
+MdTab::~MdTab() {}
+
+void MdTab::OnStateChanged() {
+  // These values are directly from the Harmony specs for tabbed panes.
+  const SkColor kSelectedBorderColor = SkColorSetRGB(0x42, 0x85, 0xF4);
+  const SkColor kNormalBorderColor = SkColorSetARGB(0x23, 0x00, 0x00, 0x00);
+  const SkColor kSelectedFontColor = SkColorSetRGB(0x42, 0x85, 0xF4);
+  const SkColor kNormalFontColor = SkColorSetRGB(0x5A, 0x5A, 0x5A);
+
+  SkColor border_color = selected() ? kSelectedBorderColor : kNormalBorderColor;
+  int border_thickness = selected() ? 2 : 1;
+  SetBorder(
+      Border::CreateSolidSidedBorder(0, 0, border_thickness, 0, border_color));
+
+  SkColor font_color = selected() ? kSelectedFontColor : kNormalFontColor;
+  title()->SetEnabledColor(font_color);
+
+  gfx::Font::Weight font_weight = gfx::Font::Weight::NORMAL;
+#if defined(OS_WIN)
+  if (selected())
+    font_weight = gfx::Font::Weight::BOLD;
+#endif
 
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
-  switch (tab_state) {
-    case TAB_INACTIVE:
-      title_->SetEnabledColor(kTabTitleColor_Inactive);
-      title_->SetFontList(rb.GetFontListWithDelta(
-          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kInactiveWeight));
-      break;
-    case TAB_ACTIVE:
-      title_->SetEnabledColor(kTabTitleColor_Active);
-      title_->SetFontList(rb.GetFontListWithDelta(
-          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kActiveWeight));
-      break;
-    case TAB_HOVERED:
-      title_->SetEnabledColor(kTabTitleColor_Hovered);
-      title_->SetFontList(rb.GetFontListWithDelta(
-          ui::kLabelFontSizeDelta, gfx::Font::NORMAL, kHoverWeight));
-      break;
-  }
-  SchedulePaint();
+  title()->SetFontList(rb.GetFontListWithDelta(ui::kLabelFontSizeDelta,
+                                               gfx::Font::NORMAL, font_weight));
 }
 
 // static
@@ -273,11 +352,40 @@
   }
 }
 
+MdTabStrip::MdTabStrip(TabbedPane* tabbed_pane) : TabStrip(tabbed_pane) {
+  BoxLayout* layout =
+      new BoxLayout(BoxLayout::kHorizontal, 0, kHarmonyTabStripVerticalPad, 0);
+  layout->set_main_axis_alignment(BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
+  layout->set_cross_axis_alignment(BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
+  layout->SetDefaultFlex(1);
+  SetLayoutManager(layout);
+}
+
+MdTabStrip::~MdTabStrip() {}
+
+gfx::Size MdTabStrip::GetPreferredSize() const {
+  return gfx::Size(width(),
+                   kHarmonyTabStripVerticalPad * 2 + kHarmonyTabStripTabHeight);
+}
+
+// Let this class's LayoutManager handle the layout.
+void MdTabStrip::Layout() {
+  return View::Layout();
+}
+
+// The tab strip "border" is drawn as part of the tabs, so all this method needs
+// to do is paint the background.
+void MdTabStrip::OnPaint(gfx::Canvas* canvas) {
+  OnPaintBackground(canvas);
+}
+
 TabbedPane::TabbedPane()
-  : listener_(NULL),
-    tab_strip_(new TabStrip(this)),
-    contents_(new View()),
-    selected_tab_index_(-1) {
+    : listener_(NULL),
+      tab_strip_(ui::MaterialDesignController::IsSecondaryUiMaterial()
+                     ? new MdTabStrip(this)
+                     : new TabStrip(this)),
+      contents_(new View()),
+      selected_tab_index_(-1) {
 #if defined(OS_MACOSX)
   SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY);
 #else
@@ -310,7 +418,11 @@
   DCHECK(index >= 0 && index <= GetTabCount());
   contents->SetVisible(false);
 
-  tab_strip_->AddChildViewAt(new Tab(this, title, contents), index);
+  tab_strip_->AddChildViewAt(
+      ui::MaterialDesignController::IsSecondaryUiMaterial()
+          ? new MdTab(this, title, contents)
+          : new Tab(this, title, contents),
+      index);
   contents_->AddChildViewAt(contents, index);
   if (selected_tab_index() < 0)
     SelectTabAt(index);
diff --git a/ui/views/controls/tabbed_pane/tabbed_pane.h b/ui/views/controls/tabbed_pane/tabbed_pane.h
index 76d927a..aa808aca 100644
--- a/ui/views/controls/tabbed_pane/tabbed_pane.h
+++ b/ui/views/controls/tabbed_pane/tabbed_pane.h
@@ -58,18 +58,18 @@
   const char* GetClassName() const override;
 
  private:
-   friend class TabStrip;
+  friend class TabStrip;
 
-   // Get the Tab (the tabstrip view, not its content) at the valid |index|.
-   Tab* GetTabAt(int index);
+  // Get the Tab (the tabstrip view, not its content) at the valid |index|.
+  Tab* GetTabAt(int index);
 
   // Overridden from View:
-   void Layout() override;
-   void ViewHierarchyChanged(
-       const ViewHierarchyChangedDetails& details) override;
-   bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
-   void OnFocus() override;
-   void GetAccessibleState(ui::AXViewState* state) override;
+  void Layout() override;
+  void ViewHierarchyChanged(
+      const ViewHierarchyChangedDetails& details) override;
+  bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
+  void OnFocus() override;
+  void GetAccessibleState(ui::AXViewState* state) override;
 
   // A listener notified when tab selection changes. Weak, not owned.
   TabbedPaneListener* listener_;