diff --git a/DEPS b/DEPS
index 2d27484..a4114b8 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # 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': '48edec2e2d92c8ede8403f37bed6e3fbc85eb183',
+  'v8_revision': 'd224e4e7dc10e27c13d6623c3855964098acae1f',
   # 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.
@@ -56,7 +56,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
-  'buildtools_revision': 'c302711306f19ec9d29ac3461b09ecd4c781fac0',
+  'buildtools_revision': 'a7cc7a3e21a061975b33dcdcd81a9716ba614c3c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -96,7 +96,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': '986b4e8b58804b7aa7bec4479b10087607ba9548',
+  'catapult_revision': '6bc0354c35405b02db027aa20976c14983d21955',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest.cc b/chrome/browser/media/webrtc/webrtc_browsertest.cc
index 0b379e3..86565b8 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_browsertest.cc
@@ -48,12 +48,6 @@
 
     // Flag used by TestWebAudioMediaStream to force garbage collection.
     command_line->AppendSwitchASCII(switches::kJavaScriptFlags, "--expose-gc");
-
-    // Flag used by |RunsAudioVideoWebRTCCallInTwoTabsGetStatsPromise|.
-    // TODO(hbos): Remove this when bug crbug.com/627816 is resolved (when this
-    // flag is removed).
-    command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
-                                    "RTCPeerConnectionNewGetStats");
   }
 
   void RunsAudioVideoWebRTCCallInTwoTabs(
diff --git a/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
index 02c5c2d..d3074e8f 100644
--- a/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_stats_perf_browsertest.cc
@@ -84,9 +84,6 @@
     command_line->AppendSwitchPath(switches::kUseFileForFakeVideoCapture,
                                    input_video);
     command_line->AppendSwitch(switches::kUseFakeDeviceForMediaStream);
-
-    command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures,
-                                    "RTCPeerConnectionNewGetStats");
   }
 
   void StartCall(const std::string& audio_codec,
diff --git a/chrome/browser/ui/test/test_browser_dialog.cc b/chrome/browser/ui/test/test_browser_dialog.cc
index 5faa2fa..75aff27 100644
--- a/chrome/browser/ui/test/test_browser_dialog.cc
+++ b/chrome/browser/ui/test/test_browser_dialog.cc
@@ -13,9 +13,14 @@
 #include "ui/base/test/material_design_controller_test_api.h"
 #include "ui/base/test/user_interactive_test_case.h"
 #include "ui/base/ui_base_switches.h"
+#include "ui/views/test/widget_test.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
+#if defined(OS_CHROMEOS)
+#include "ash/shell.h"  // nogncheck
+#endif
+
 namespace {
 
 // An automatic action for WidgetCloser to post to the RunLoop.
@@ -86,13 +91,22 @@
   md_test_api.SetSecondaryUiMaterial(true);
 #endif
 
-  gfx::NativeView parent = platform_util::GetViewForWindow(DialogParent());
-  views::Widget::Widgets widgets_before;
-  views::Widget::GetAllChildWidgets(parent, &widgets_before);
+  views::Widget::Widgets widgets_before =
+      views::test::WidgetTest::GetAllWidgets();
+#if defined(OS_CHROMEOS)
+  // GetAllWidgets() uses AuraTestHelper to find the aura root window, but
+  // that's not used on browser_tests, so ask ash.
+  views::Widget::GetAllChildWidgets(ash::Shell::GetPrimaryRootWindow(),
+                                    &widgets_before);
+#endif  // OS_CHROMEOS
 
   ShowDialog(NameFromTestCase());
-  views::Widget::Widgets widgets_after;
-  views::Widget::GetAllChildWidgets(parent, &widgets_after);
+  views::Widget::Widgets widgets_after =
+      views::test::WidgetTest::GetAllWidgets();
+#if defined(OS_CHROMEOS)
+  views::Widget::GetAllChildWidgets(ash::Shell::GetPrimaryRootWindow(),
+                                    &widgets_after);
+#endif  // OS_CHROMEOS
 
   auto added = base::STLSetDifference<std::vector<views::Widget*>>(
       widgets_after, widgets_before);
diff --git a/chrome/browser/ui/test/test_browser_dialog.h b/chrome/browser/ui/test/test_browser_dialog.h
index 9eeac31..d071a80 100644
--- a/chrome/browser/ui/test/test_browser_dialog.h
+++ b/chrome/browser/ui/test/test_browser_dialog.h
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "chrome/browser/ui/browser_window.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/native_widget_types.h"
@@ -65,9 +64,6 @@
   // Show the dialog corresponding to |name| and leave it open.
   virtual void ShowDialog(const std::string& name) = 0;
 
-  // The window that owns the dialogs. Used to find where the dialog appears.
-  virtual gfx::NativeWindow DialogParent() = 0;
-
  private:
   DISALLOW_COPY_AND_ASSIGN(TestBrowserDialog);
 };
@@ -79,11 +75,6 @@
  protected:
   SupportsTestDialog() {}
 
-  // TestBrowserDialog:
-  gfx::NativeWindow DialogParent() override {
-    return this->browser()->window()->GetNativeWindow();
-  }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(SupportsTestDialog);
 };
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
index eba851a..719a46b 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -1021,11 +1021,6 @@
       EnterState(State::DISABLED);
       UpdateAllCategoryStatus(CategoryStatus::CATEGORY_EXPLICITLY_DISABLED);
       break;
-
-    case RemoteSuggestionsStatus::SIGNED_OUT_AND_DISABLED:
-      EnterState(State::DISABLED);
-      UpdateAllCategoryStatus(CategoryStatus::SIGNED_OUT);
-      break;
   }
 }
 
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
index e1a76e6..32c7a68 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl_unittest.cc
@@ -1528,37 +1528,6 @@
               IsEmpty());
 }
 
-TEST_F(RemoteSuggestionsProviderImplTest, StatusChanges) {
-  auto service = MakeSuggestionsProvider();
-
-  // Simulate user signed out
-  SetUpFetchResponse(GetTestJson({GetSuggestion()}));
-  service->OnStatusChanged(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN,
-                           RemoteSuggestionsStatus::SIGNED_OUT_AND_DISABLED);
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_THAT(observer().StatusForCategory(articles_category()),
-              Eq(CategoryStatus::SIGNED_OUT));
-  EXPECT_THAT(RemoteSuggestionsProviderImpl::State::DISABLED,
-              Eq(service->state_));
-  EXPECT_THAT(service->GetSuggestionsForTesting(articles_category()),
-              IsEmpty());  // No fetch should be made.
-
-  // Simulate user sign in. The service should be ready again and load
-  // suggestions.
-  SetUpFetchResponse(GetTestJson({GetSuggestion()}));
-  service->OnStatusChanged(RemoteSuggestionsStatus::SIGNED_OUT_AND_DISABLED,
-                           RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN);
-  EXPECT_THAT(observer().StatusForCategory(articles_category()),
-              Eq(CategoryStatus::AVAILABLE_LOADING));
-
-  base::RunLoop().RunUntilIdle();
-  EXPECT_THAT(observer().StatusForCategory(articles_category()),
-              Eq(CategoryStatus::AVAILABLE));
-  EXPECT_THAT(RemoteSuggestionsProviderImpl::State::READY, Eq(service->state_));
-  EXPECT_FALSE(service->GetSuggestionsForTesting(articles_category()).empty());
-}
-
 TEST_F(RemoteSuggestionsProviderImplTest, ImageReturnedWithTheSameId) {
   auto service = MakeSuggestionsProvider();
 
diff --git a/components/ntp_snippets/remote/remote_suggestions_status_service.cc b/components/ntp_snippets/remote/remote_suggestions_status_service.cc
index 315cf13b..525dbbd 100644
--- a/components/ntp_snippets/remote/remote_suggestions_status_service.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_status_service.cc
@@ -15,31 +15,12 @@
 
 namespace ntp_snippets {
 
-namespace {
-
-const char kFetchingRequiresSignin[] = "fetching_requires_signin";
-const char kFetchingRequiresSigninEnabled[] = "true";
-const char kFetchingRequiresSigninDisabled[] = "false";
-
-}  // namespace
-
 RemoteSuggestionsStatusService::RemoteSuggestionsStatusService(
     SigninManagerBase* signin_manager,
     PrefService* pref_service)
     : status_(RemoteSuggestionsStatus::EXPLICITLY_DISABLED),
-      require_signin_(false),
       signin_manager_(signin_manager),
-      pref_service_(pref_service) {
-  std::string param_value_str = variations::GetVariationParamValueByFeature(
-      kArticleSuggestionsFeature, kFetchingRequiresSignin);
-  if (param_value_str == kFetchingRequiresSigninEnabled) {
-    require_signin_ = true;
-  } else if (!param_value_str.empty() &&
-             param_value_str != kFetchingRequiresSigninDisabled) {
-    DLOG(WARNING) << "Unknow value for the variations parameter "
-                  << kFetchingRequiresSignin << ": " << param_value_str;
-  }
-}
+      pref_service_(pref_service) {}
 
 RemoteSuggestionsStatusService::~RemoteSuggestionsStatusService() = default;
 
@@ -99,11 +80,6 @@
     return RemoteSuggestionsStatus::EXPLICITLY_DISABLED;
   }
 
-  if (require_signin_ && !IsSignedIn()) {
-    DVLOG(1) << "[GetStatusFromDeps] Signed out and disabled due to this.";
-    return RemoteSuggestionsStatus::SIGNED_OUT_AND_DISABLED;
-  }
-
   DVLOG(1) << "[GetStatusFromDeps] Enabled, signed "
            << (IsSignedIn() ? "in" : "out");
   return IsSignedIn() ? RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN
diff --git a/components/ntp_snippets/remote/remote_suggestions_status_service.h b/components/ntp_snippets/remote/remote_suggestions_status_service.h
index e0542bb..4d1a1cbfb 100644
--- a/components/ntp_snippets/remote/remote_suggestions_status_service.h
+++ b/components/ntp_snippets/remote/remote_suggestions_status_service.h
@@ -23,8 +23,6 @@
   ENABLED_AND_SIGNED_OUT,
   // Suggestions have been disabled as part of the service configuration.
   EXPLICITLY_DISABLED,
-  // The user is not signed in, but sign-in is required.
-  SIGNED_OUT_AND_DISABLED,
 };
 
 // Aggregates data from preferences and signin to notify the provider of
@@ -71,7 +69,6 @@
   RemoteSuggestionsStatus status_;
   StatusChangeCallback status_change_callback_;
 
-  bool require_signin_;
   SigninManagerBase* signin_manager_;
   PrefService* pref_service_;
 
diff --git a/components/ntp_snippets/remote/remote_suggestions_status_service_unittest.cc b/components/ntp_snippets/remote/remote_suggestions_status_service_unittest.cc
index c24650a..6b6fd7a5 100644
--- a/components/ntp_snippets/remote/remote_suggestions_status_service_unittest.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_status_service_unittest.cc
@@ -40,24 +40,6 @@
   variations::testing::VariationParamsManager params_manager_;
 };
 
-TEST_F(RemoteSuggestionsStatusServiceTest, SigninNeededIfSpecifiedByParam) {
-  // Specify by the parameter that signin is required.
-  params_manager_.SetVariationParamsWithFeatureAssociations(
-      ntp_snippets::kStudyName, {{"fetching_requires_signin", "true"}},
-      {ntp_snippets::kArticleSuggestionsFeature.name});
-
-  auto service = MakeService();
-
-  // The default test setup is signed out.
-  EXPECT_EQ(RemoteSuggestionsStatus::SIGNED_OUT_AND_DISABLED,
-            service->GetStatusFromDeps());
-
-  // Once signed in, we should be in a compatible state.
-  utils_.fake_signin_manager()->SignIn("foo@bar.com");
-  EXPECT_EQ(RemoteSuggestionsStatus::ENABLED_AND_SIGNED_IN,
-            service->GetStatusFromDeps());
-}
-
 TEST_F(RemoteSuggestionsStatusServiceTest, NoSigninNeeded) {
   auto service = MakeService();
 
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 4fecd6a..c9bb484b 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2326,8 +2326,6 @@
 crbug.com/678499 http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ]
 crbug.com/678499 virtual/mojo-loading/http/tests/security/contentSecurityPolicy/require-sri-for/require-sri-for-script-preload-allowed.php [ Failure Pass ]
 
-crbug.com/680043 sensor/ambient-light-sensor.html [ Pass Failure ]
-
 crbug.com/680050 inspector/sources/debugger-ui/watch-expressions-panel-switch.html [ Pass Timeout ]
 
 # When WebAssembly is exposed in V8 (soon), this test has the wrong number of expected Object.getOwnPropertyNames() for global object.
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
index 672701d..41f77be 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4090,6 +4090,16 @@
     method toJSON
     setter sdp
     setter type
+interface RTCStatsReport
+    attribute @@toStringTag
+    method @@iterator
+    method constructor
+    method entries
+    method forEach
+    method get
+    method has
+    method keys
+    method values
 interface RadioNodeList : NodeList
     attribute @@toStringTag
     getter value
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
index 7cb6e5c..3f37f45f 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4018,6 +4018,16 @@
     method toJSON
     setter sdp
     setter type
+interface RTCStatsReport
+    attribute @@toStringTag
+    method @@iterator
+    method constructor
+    method entries
+    method forEach
+    method get
+    method has
+    method keys
+    method values
 interface RadioNodeList : NodeList
     attribute @@toStringTag
     getter value
diff --git a/third_party/WebKit/LayoutTests/sensor/resources/generic-sensor-tests.js b/third_party/WebKit/LayoutTests/sensor/resources/generic-sensor-tests.js
index fc1fc8e..82c6ce6 100644
--- a/third_party/WebKit/LayoutTests/sensor/resources/generic-sensor-tests.js
+++ b/third_party/WebKit/LayoutTests/sensor/resources/generic-sensor-tests.js
@@ -310,7 +310,7 @@
                 // (not to a timer) so fluctuations are possible, so we
                 // reference to the actual elapsed updates count.
                 let elapsedUpdates = mockSensor.reading_updates_count() - readingUpdatesCounter;
-                assert_equals(fastSensorNotifiedCounter, elapsedUpdates);
+                assert_approx_equals(fastSensorNotifiedCounter, elapsedUpdates, 1);
                 fastSensor.stop();
                 slowSensor.stop();
                 resolve(mockSensor);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
index 4be6a527..227026c 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptWrappable.h
@@ -172,7 +172,6 @@
   friend class HeapSnaphotWrapperVisitor;
   friend class V8HiddenValue;
   friend class V8PrivateProperty;
-  friend class WebGLRenderingContextBase;
 
   v8::Local<v8::Object> mainWorldWrapper(v8::Isolate* isolate) const {
     return v8::Local<v8::Object>::New(isolate, m_mainWorldWrapper);
diff --git a/third_party/WebKit/Source/devtools/BUILD.gn b/third_party/WebKit/Source/devtools/BUILD.gn
index 762402fa..3787268 100644
--- a/third_party/WebKit/Source/devtools/BUILD.gn
+++ b/third_party/WebKit/Source/devtools/BUILD.gn
@@ -781,6 +781,8 @@
   "front_end/Images/smallIcons.png",
   "front_end/Images/smallIcons_2x.png",
   "front_end/Images/speech.png",
+  "front_end/Images/treeoutlineTriangles.png",
+  "front_end/Images/treeoutlineTriangles_2x.png",
   "front_end/Images/toolbarButtonGlyphs.png",
   "front_end/Images/toolbarButtonGlyphs_2x.png",
   "front_end/Images/toolbarResizerHorizontal.png",
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
index 9921efa..295dce8b 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/optimize_png.hashes
@@ -8,6 +8,7 @@
     "settingsListRemove.svg": "ce9e7c5c5cdaef28e6ee51d9478d5485",
     "toolbarButtonGlyphs.svg": "db0b7d1af08a57a11e5609e0b2cbbc01",
     "breakpoint.svg": "69cd92d807259c022791112809b97799",
+    "treeoutlineTriangles.svg": "017d2f89437df0afc6b9cd5ff43735d9",
     "search.svg": "fc990dd3836aec510d7ca1f36c2a3142",
     "audits_logo.svg": "647095d7981857c22a816eef12f75b91"
 }
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
index 9921efa..295dce8b 100644
--- a/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/svg2png.hashes
@@ -8,6 +8,7 @@
     "settingsListRemove.svg": "ce9e7c5c5cdaef28e6ee51d9478d5485",
     "toolbarButtonGlyphs.svg": "db0b7d1af08a57a11e5609e0b2cbbc01",
     "breakpoint.svg": "69cd92d807259c022791112809b97799",
+    "treeoutlineTriangles.svg": "017d2f89437df0afc6b9cd5ff43735d9",
     "search.svg": "fc990dd3836aec510d7ca1f36c2a3142",
     "audits_logo.svg": "647095d7981857c22a816eef12f75b91"
 }
\ No newline at end of file
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/src/treeoutlineTriangles.svg b/third_party/WebKit/Source/devtools/front_end/Images/src/treeoutlineTriangles.svg
new file mode 100644
index 0000000..6dcbcc5
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/src/treeoutlineTriangles.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32"
+   height="24"
+   id="svg3620"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="treeoutlineTriangles.svg">
+  <defs
+     id="defs3622" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.313708"
+     inkscape:cx="11.811861"
+     inkscape:cy="13.085725"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-width="858"
+     inkscape:window-height="521"
+     inkscape:window-x="164"
+     inkscape:window-y="121"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3625">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1028.3622)">
+    <path
+       d="m 8,1034.3622 -7,-4 0,8"
+       id="path3619"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 20,1038.3622 4,-7 -8,0"
+       id="path3621"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles.png b/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles.png
new file mode 100644
index 0000000..71a09d3
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles_2x.png b/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles_2x.png
new file mode 100644
index 0000000..1d8aa0ee
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/Images/treeoutlineTriangles_2x.png
Binary files differ
diff --git a/third_party/WebKit/Source/devtools/front_end/data_grid/dataGrid.css b/third_party/WebKit/Source/devtools/front_end/data_grid/dataGrid.css
index 396fc410..ba16860 100644
--- a/third_party/WebKit/Source/devtools/front_end/data_grid/dataGrid.css
+++ b/third_party/WebKit/Source/devtools/front_end/data_grid/dataGrid.css
@@ -175,9 +175,9 @@
 
 .data-grid td.disclosure::before {
     -webkit-user-select: none;
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);
-    -webkit-mask-position: -4px -96px;
-    -webkit-mask-size: 352px 168px;
+    -webkit-mask-image: url(Images/treeoutlineTriangles.png);
+    -webkit-mask-position: 0 0;
+    -webkit-mask-size: 32px 24px;
     float: left;
     width: 8px;
     height: 12px;
@@ -194,12 +194,12 @@
 
 @media (-webkit-min-device-pixel-ratio: 1.1) {
 .data-grid tr.parent td.disclosure::before {
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);
+    -webkit-mask-image: url(Images/treeoutlineTriangles_2x.png);
 }
 } /* media */
 
 .data-grid tr.expanded td.disclosure::before {
-    -webkit-mask-position: -20px -96px;
+    -webkit-mask-position: -16px 0;
 }
 
 .data-grid tr.selected {
@@ -218,12 +218,12 @@
 
 .data-grid:focus tr.parent.selected td.disclosure::before {
     background-color: white;
-    -webkit-mask-position: -4px -96px;
+    -webkit-mask-position: 0 0;
 }
 
 .data-grid:focus tr.expanded.selected td.disclosure::before {
     background-color: white;
-    -webkit-mask-position: -20px -96px;
+    -webkit-mask-position: -16px 0;
 }
 
 .data-grid tr.inactive {
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css b/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
index 16fad38..72a14ef8 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
+++ b/third_party/WebKit/Source/devtools/front_end/elements/elementsTreeOutline.css
@@ -47,8 +47,8 @@
 
 .elements-disclosure li.parent::before {
     -webkit-user-select: none;
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);
-    -webkit-mask-size: 352px 168px;
+    -webkit-mask-image: url(Images/treeoutlineTriangles.png);
+    -webkit-mask-size: 32px 24px;
     content: "aa";
     color: transparent;
     text-shadow: none;
@@ -61,12 +61,12 @@
 
 @media (-webkit-min-device-pixel-ratio: 1.1) {
 .elements-disclosure li.parent::before {
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);
+    -webkit-mask-image: url(Images/treeoutlineTriangles_2x.png);
 }
 } /* media */
 
 .elements-disclosure li.parent::before {
-    -webkit-mask-position: -4px -96px;
+    -webkit-mask-position: 0 0;
     background-color: rgb(110, 110, 110);
 }
 
@@ -84,7 +84,7 @@
 }
 
 .elements-disclosure li.parent.expanded::before {
-    -webkit-mask-position: -20px -96px;
+    -webkit-mask-position: -16px 0;
 }
 
 .elements-disclosure li.selected .selection {
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css b/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css
index 5b1dab39..942ca4aa 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css
+++ b/third_party/WebKit/Source/devtools/front_end/ui/treeoutline.css
@@ -104,8 +104,8 @@
 
 .tree-outline li::before {
     -webkit-user-select: none;
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs.png);
-    -webkit-mask-size: 352px 168px;
+    -webkit-mask-image: url(Images/treeoutlineTriangles.png);
+    -webkit-mask-size: 32px 24px;
     content: "aa";
     color: transparent;
     text-shadow: none;
@@ -119,17 +119,17 @@
 
 @media (-webkit-min-device-pixel-ratio: 1.1) {
 .tree-outline li::before {
-    -webkit-mask-image: url(Images/toolbarButtonGlyphs_2x.png);
+    -webkit-mask-image: url(Images/treeoutlineTriangles_2x.png);
 }
 } /* media */
 
 .tree-outline li::before {
-    -webkit-mask-position: -4px -96px;
+    -webkit-mask-position: 0 0;
     background-color: rgb(110, 110, 110);
 }
 
 .tree-outline li.parent.expanded::before {
-    -webkit-mask-position: -20px -96px;
+    -webkit-mask-position: -16px 0;
 }
 
 .tree-outline ol.children {
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
index af35b94..d946694 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.idl
@@ -110,7 +110,7 @@
     // TODO(hbos): The spec has an optional |selector| argument that is not
     // supported yet. There is a discussion about what to do with it (clarify
     // spec, remove it or change it?): https://github.com/w3c/webrtc-stats/issues/116
-    [CallWith=ScriptState, RuntimeEnabled=RTCPeerConnectionNewGetStats] Promise<RTCStatsReport> getStats();
+    [CallWith=ScriptState] Promise<RTCStatsReport> getStats();
 
     // https://w3c.github.io/webrtc-pc/#peer-to-peer-data-api
     // TODO(guidou): The label argument should have [TreatNullAs=EmptyString]
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.idl b/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.idl
index 9a6d169..3b9f98a 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.idl
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.idl
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 // https://w3c.github.io/webrtc-pc/#rtcstatsreport-object
-[
-    RuntimeEnabled=RTCPeerConnectionNewGetStats,
-] interface RTCStatsReport {
+interface RTCStatsReport {
     readonly maplike<DOMString, object>;
 };
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
index f0f5226d..486853d 100644
--- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
+++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -211,7 +211,6 @@
 // Handles frame scrolling via the root PaintLayer instead of the FrameView.
 // crbug.com/417782 tracks enabling this by default.
 RootLayerScrolling
-RTCPeerConnectionNewGetStats status=experimental
 ScriptedSpeech status=stable
 // Scrolls to compensate for layout movements (bit.ly/scroll-anchoring).
 ScrollAnchoring status=experimental, settable_from_internals=True
diff --git a/ui/aura/test/aura_test_helper.cc b/ui/aura/test/aura_test_helper.cc
index a232d81..7c9e5cb 100644
--- a/ui/aura/test/aura_test_helper.cc
+++ b/ui/aura/test/aura_test_helper.cc
@@ -38,6 +38,11 @@
 
 namespace aura {
 namespace test {
+namespace {
+
+AuraTestHelper* g_instance = nullptr;
+
+}  // namespace
 
 AuraTestHelper::AuraTestHelper(base::MessageLoopForUI* message_loop)
     : setup_called_(false), teardown_called_(false) {
@@ -58,6 +63,11 @@
       << "AuraTestHelper::TearDown() never called.";
 }
 
+// static
+AuraTestHelper* AuraTestHelper::GetInstance() {
+  return g_instance;
+}
+
 void AuraTestHelper::EnableMusWithTestWindowTree(
     WindowTreeClientDelegate* window_tree_delegate,
     WindowManagerDelegate* window_manager_delegate) {
@@ -128,9 +138,12 @@
 
   if (mode_ == Mode::MUS_CREATE_WINDOW_TREE_CLIENT)
     window_tree()->AckAllChanges();
+
+  g_instance = this;
 }
 
 void AuraTestHelper::TearDown() {
+  g_instance = nullptr;
   teardown_called_ = true;
   parenting_client_.reset();
   client::SetFocusClient(root_window(), nullptr);
diff --git a/ui/aura/test/aura_test_helper.h b/ui/aura/test/aura_test_helper.h
index 8fd4140..06e29119 100644
--- a/ui/aura/test/aura_test_helper.h
+++ b/ui/aura/test/aura_test_helper.h
@@ -51,6 +51,9 @@
   explicit AuraTestHelper(base::MessageLoopForUI* message_loop);
   ~AuraTestHelper();
 
+  // Returns the current AuraTestHelper, or nullptr if it's not alive.
+  static AuraTestHelper* GetInstance();
+
   // Makes aura target mus with a mock WindowTree (TestWindowTree). Must be
   // called before SetUp().
   void EnableMusWithTestWindowTree(
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 214a0be..4bd4d17 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -811,6 +811,7 @@
     deps += [
       "//ui/aura",
       "//ui/aura:test_support",
+      "//ui/views/mus",
       "//ui/wm",
     ]
     if (use_x11 && !is_chromeos) {
@@ -910,6 +911,7 @@
     "layout/fill_layout_unittest.cc",
     "layout/grid_layout_unittest.cc",
     "rect_based_targeting_utils_unittest.cc",
+    "test/widget_test_unittest.cc",
     "view_model_unittest.cc",
     "view_model_utils_unittest.cc",
     "view_targeter_unittest.cc",
diff --git a/ui/views/test/widget_test.h b/ui/views/test/widget_test.h
index 3eda511..5ce2b65 100644
--- a/ui/views/test/widget_test.h
+++ b/ui/views/test/widget_test.h
@@ -90,6 +90,9 @@
   // Return true if |window| is transparent according to the native platform.
   static bool IsNativeWindowTransparent(gfx::NativeWindow window);
 
+  // Returns the set of all Widgets that currently have a NativeWindow.
+  static Widget::Widgets GetAllWidgets();
+
  private:
   DISALLOW_COPY_AND_ASSIGN(WidgetTest);
 };
diff --git a/ui/views/test/widget_test_aura.cc b/ui/views/test/widget_test_aura.cc
index 5c72553..8cabaf5 100644
--- a/ui/views/test/widget_test_aura.cc
+++ b/ui/views/test/widget_test_aura.cc
@@ -6,9 +6,12 @@
 
 #include "build/build_config.h"
 #include "ui/aura/client/focus_client.h"
+#include "ui/aura/mus/window_tree_client.h"
+#include "ui/aura/test/aura_test_helper.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
 #include "ui/aura/window_tree_host.h"
+#include "ui/views/mus/mus_client.h"
 #include "ui/views/widget/widget.h"
 
 #if defined(USE_X11)
@@ -16,6 +19,10 @@
 #include "ui/gfx/x/x11_types.h"  // nogncheck
 #endif
 
+#if defined(USE_X11) && !defined(OS_CHROMEOS)
+#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
+#endif
+
 namespace views {
 namespace test {
 
@@ -48,6 +55,46 @@
   return false;
 }
 
+#if defined(OS_WIN)
+
+struct FindAllWindowsData {
+  std::vector<aura::Window*>* windows;
+};
+
+BOOL CALLBACK FindAllWindowsCallback(HWND hwnd, LPARAM param) {
+  FindAllWindowsData* data = reinterpret_cast<FindAllWindowsData*>(param);
+  if (aura::WindowTreeHost* host =
+          aura::WindowTreeHost::GetForAcceleratedWidget(hwnd))
+    data->windows->push_back(host->window());
+  return TRUE;
+}
+
+#endif  // OS_WIN
+
+std::vector<aura::Window*> GetAllTopLeveLWindows() {
+  std::vector<aura::Window*> roots;
+#if defined(USE_X11) && !defined(OS_CHROMEOS)
+  roots = DesktopWindowTreeHostX11::GetAllOpenWindows();
+#endif
+#if defined(OS_WIN)
+  {
+    FindAllWindowsData data = {&roots};
+    EnumThreadWindows(GetCurrentThreadId(), FindAllWindowsCallback,
+                      reinterpret_cast<LPARAM>(&data));
+  }
+#endif  // OS_WIN
+  aura::test::AuraTestHelper* aura_test_helper =
+      aura::test::AuraTestHelper::GetInstance();
+  if (aura_test_helper)
+    roots.push_back(aura_test_helper->root_window());
+
+  if (MusClient::Get()) {
+    auto mus_roots = MusClient::Get()->window_tree_client()->GetRoots();
+    roots.insert(roots.end(), mus_roots.begin(), mus_roots.end());
+  }
+  return roots;
+}
+
 }  // namespace
 
 // static
@@ -114,5 +161,14 @@
   return window->transparent();
 }
 
+// static
+Widget::Widgets WidgetTest::GetAllWidgets() {
+  std::vector<aura::Window*> toplevel = GetAllTopLeveLWindows();
+  Widget::Widgets all_widgets;
+  for (aura::Window* root : toplevel)
+    Widget::GetAllChildWidgets(root, &all_widgets);
+  return all_widgets;
+}
+
 }  // namespace test
 }  // namespace views
diff --git a/ui/views/test/widget_test_mac.mm b/ui/views/test/widget_test_mac.mm
index 5b3f9e5b..2f14759d 100644
--- a/ui/views/test/widget_test_mac.mm
+++ b/ui/views/test/widget_test_mac.mm
@@ -85,5 +85,15 @@
   return ![window isOpaque];
 }
 
+// static
+Widget::Widgets WidgetTest::GetAllWidgets() {
+  Widget::Widgets all_widgets;
+  for (NSWindow* window : [NSApp windows]) {
+    if (Widget* widget = Widget::GetWidgetForNativeWindow(window))
+      all_widgets.insert(widget);
+  }
+  return all_widgets;
+}
+
 }  // namespace test
 }  // namespace views
diff --git a/ui/views/test/widget_test_unittest.cc b/ui/views/test/widget_test_unittest.cc
new file mode 100644
index 0000000..b4d8ea5
--- /dev/null
+++ b/ui/views/test/widget_test_unittest.cc
@@ -0,0 +1,79 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/test/widget_test.h"
+
+#include <algorithm>
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace views {
+namespace test {
+namespace {
+
+// Insert |widget| into |expected| and ensure it's reported by GetAllWidgets().
+void ExpectAdd(Widget::Widgets* expected, Widget* widget, const char* message) {
+  SCOPED_TRACE(message);
+  EXPECT_TRUE(expected->insert(widget).second);
+  Widget::Widgets actual = WidgetTest::GetAllWidgets();
+  EXPECT_EQ(expected->size(), actual.size());
+  EXPECT_TRUE(std::equal(expected->begin(), expected->end(), actual.begin()));
+}
+
+// Close |widgets[0]|, and expect all |widgets| to be removed.
+void ExpectClose(Widget::Widgets* expected,
+                 std::vector<Widget*> widgets,
+                 const char* message) {
+  SCOPED_TRACE(message);
+  for (Widget* widget : widgets)
+    EXPECT_EQ(1u, expected->erase(widget));
+  widgets[0]->CloseNow();
+  Widget::Widgets actual = WidgetTest::GetAllWidgets();
+  EXPECT_EQ(expected->size(), actual.size());
+  EXPECT_TRUE(std::equal(expected->begin(), expected->end(), actual.begin()));
+}
+
+}  // namespace
+
+using WidgetTestTest = WidgetTest;
+
+// Ensure that Widgets with various root windows are correctly reported by
+// WidgetTest::GetAllWidgets().
+TEST_F(WidgetTestTest, GetAllWidgets) {
+  // Note Widget::Widgets is a std::set ordered by pointer value, so the order
+  // that |expected| is updated below is not important.
+  Widget::Widgets expected;
+
+  EXPECT_EQ(expected, GetAllWidgets());
+
+  Widget* platform = CreateTopLevelPlatformWidget();
+  ExpectAdd(&expected, platform, "platform");
+
+  Widget* platform_child = CreateChildPlatformWidget(platform->GetNativeView());
+  ExpectAdd(&expected, platform_child, "platform_child");
+
+  Widget* frameless = CreateTopLevelFramelessPlatformWidget();
+  ExpectAdd(&expected, frameless, "frameless");
+
+  Widget* native = CreateTopLevelNativeWidget();
+  ExpectAdd(&expected, native, "native");
+
+  Widget* native_child = CreateChildNativeWidgetWithParent(native);
+  ExpectAdd(&expected, native_child, "native_child");
+
+  Widget* desktop = CreateNativeDesktopWidget();
+  ExpectAdd(&expected, desktop, "desktop");
+
+  Widget* desktop_child = CreateChildNativeWidgetWithParent(desktop);
+  ExpectAdd(&expected, desktop_child, "desktop_child");
+
+  ExpectClose(&expected, {desktop, desktop_child}, "desktop");
+  ExpectClose(&expected, {native, native_child}, "native");
+  ExpectClose(&expected, {platform, platform_child}, "platform");
+  ExpectClose(&expected, {frameless}, "frameless");
+}
+
+}  // namespace views
+}  // namespace test