diff --git a/DEPS b/DEPS
index 13c545e0..e970a2d 100644
--- a/DEPS
+++ b/DEPS
@@ -51,7 +51,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'daa8c27f57c16cfc574ec6e4b32d56396f70c4bd',
+  'angle_revision': '847638a64a32df1b357b57507170301195263a1c',
   # 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.
@@ -190,7 +190,7 @@
    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + 'c21cf0893cb95476b2a902d6c06a5c2652b832cc',
 
   'src/third_party/libjingle/source/talk':
-    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + 'eddf34f4a9ddd5bdac8d85125a4ed04eff704638', # commit position 10725
+    Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + '15bbf6cdc4ce473f93befea563c56d7af4bc6ba2', # commit position 10735
 
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/usrsctplib.git' + '@' + '36444a999739e9e408f8f587cb4c3ffeef2e50ac', # from svn revision 9215
@@ -214,7 +214,7 @@
    Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067',
 
   'src/third_party/webrtc':
-    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + 'dba3e4553cbe4aa286dda6074fdb004fb1eb652f', # commit position 10724
+    Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '3e38ef990fa4264c1dffaee831af26dc9bfc5fbf', # commit position 10736
 
   'src/third_party/openmax_dl':
     Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' +  Var('openmax_dl_revision'),
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 06bfa93..862e57c 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -273,8 +273,8 @@
   sources = gypi_values.ash_shell_with_content_lib_sources
 
   deps = [
-    #"//chrome:packed_resources",  TODO(GYP)
     ":ash_shell_lib",
+    "//chrome:packed_resources",
     "//content",
     "//content/shell:content_shell_lib",
     "//skia",
diff --git a/build/common.gypi b/build/common.gypi
index ca1c73a..5c2098b 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -2056,9 +2056,8 @@
         'enable_browser_cdms%': 0,
       }],
 
-      # Native Client glibc toolchain is enabled
-      # by default except on arm, mips and mips64.
-      ['target_arch=="arm" or target_arch=="mipsel" or target_arch=="mips64el"', {
+      # Native Client glibc toolchain is enabled except on mips
+      ['target_arch=="mipsel" or target_arch=="mips64el"', {
         'disable_glibc%': 1,
       }, {
         'disable_glibc%': 0,
diff --git a/chrome/browser_tests.isolate b/chrome/browser_tests.isolate
index c9bf511..601c8591 100644
--- a/chrome/browser_tests.isolate
+++ b/chrome/browser_tests.isolate
@@ -125,7 +125,7 @@
         ],
       },
     }],
-    ['disable_nacl==0 and (OS=="linux" or OS=="mac" or OS=="win") and (target_arch=="x64" or target_arch=="ia32")', {
+    ['disable_nacl==0 and (OS=="linux" or OS=="mac" or OS=="win") and (target_arch=="x64" or target_arch=="ia32" or target_arch=="arm")', {
       'variables': {
         'files': [
           '<(PRODUCT_DIR)/ppapi_nacl_tests_glibc.nmf',
@@ -142,6 +142,8 @@
     ['disable_nacl==0 and OS=="linux" and target_arch=="arm"', {
       'variables': {
         'files': [
+          '<(PRODUCT_DIR)/libarm/',
+          '<(PRODUCT_DIR)/ppapi_nacl_tests_glibc_arm.nexe',
           '<(PRODUCT_DIR)/ppapi_nacl_tests_newlib_arm.nexe',
           '<(PRODUCT_DIR)/ppapi_nacl_tests_pnacl_newlib_arm.nexe',
           '<(PRODUCT_DIR)/ppapi_nacl_tests_pnacl_newlib_arm_nonsfi.nexe',
diff --git a/ppapi/ppapi_nacl.gyp b/ppapi/ppapi_nacl.gyp
index b546954..dd1ccba 100644
--- a/ppapi/ppapi_nacl.gyp
+++ b/ppapi/ppapi_nacl.gyp
@@ -13,6 +13,31 @@
   ],
   'targets': [
     {
+      'target_name': 'nacl_elf_loader',
+      'type': 'none',
+      'conditions': [
+        ['target_arch=="arm" and disable_glibc==0', {
+          'dependencies': [
+            '<(DEPTH)/native_client/src/untrusted/elf_loader/elf_loader.gyp:elf_loader_nexe',
+          ],
+          'actions': [
+          {
+            'action_name': 'copy_arm_elf_loader',
+            'message': 'Copying elf_loader_arm.nexe',
+            'inputs': [
+              '<(PRODUCT_DIR)/elf_loader_newlib_arm.nexe',
+            ],
+            'outputs': [
+              '>(tc_lib_dir_glibc_arm)/elf_loader_arm.nexe',
+            ],
+            'action': [
+              'python', '<(DEPTH)/build/cp.py', '>@(_inputs)', '>@(_outputs)'
+            ],
+          }],
+        }],
+      ],
+    },
+    {
       'target_name': 'ppapi_cpp_lib',
       'type': 'none',
       'variables': {
@@ -56,6 +81,7 @@
          '<(DEPTH)/native_client/src/untrusted/nacl/nacl.gyp:nacl_lib',
          '<(DEPTH)/native_client/src/untrusted/pthread/pthread.gyp:pthread_lib',
          'ppapi_cpp_lib',
+         'nacl_elf_loader',
          'native_client/native_client.gyp:ppapi_lib',
       ],
       'variables': {
@@ -134,15 +160,24 @@
         'extra_args': [
           '--strip-all',
         ],
+        'variables': {
+          'conditions': [
+            ['target_arch=="arm"', {
+              'objdump': '>(nacl_glibc_tc_root)/bin/arm-nacl-objdump'
+            }, {
+              'objdump': '>(nacl_glibc_tc_root)/bin/x86_64-nacl-objdump'
+            }],
+          ]
+        },
         'create_nmf': '<(DEPTH)/native_client_sdk/src/tools/create_nmf.py',
         'create_nmf_flags': [
           '--no-default-libpath',
-          '--objdump=>(nacl_glibc_tc_root)/bin/x86_64-nacl-objdump',
+          '--objdump=<(objdump)',
         ],
         'create_nonsfi_test_nmf': 'tests/create_nonsfi_test_nmf.py',
       },
       'conditions': [
-        ['(target_arch=="ia32" or target_arch=="x64") and disable_glibc==0', {
+        ['target_arch!="mipsel" and disable_glibc==0', {
           'variables': {
             'build_glibc': 1,
             # NOTE: Use /lib, not /lib64 here; it is a symbolic link which
@@ -176,6 +211,13 @@
                 ],
                 'inputs': ['>(out_glibc32)'],
               }],
+              ['target_arch=="arm"', {
+                'action': [
+                  '--library-path=>(nacl_glibc_tc_root)/arm-nacl/lib',
+                  '--library-path=>(tc_lib_dir_glibc_arm)',
+                ],
+                'inputs': ['>(out_glibc_arm)'],
+              }],
               ['target_arch=="x64" or (target_arch=="ia32" and OS=="win")', {
                 'action': [
                   '--library-path=>(libdir_glibc64)',
diff --git a/ppapi/ppapi_nacl_test_common.gypi b/ppapi/ppapi_nacl_test_common.gypi
index fd1cf27..9d06aff 100644
--- a/ppapi/ppapi_nacl_test_common.gypi
+++ b/ppapi/ppapi_nacl_test_common.gypi
@@ -45,6 +45,7 @@
        '<(DEPTH)/native_client/src/untrusted/nacl/nacl.gyp:nacl_lib',
        '<(DEPTH)/native_client/src/untrusted/pthread/pthread.gyp:pthread_lib',
        '<(DEPTH)/ppapi/ppapi_nacl.gyp:ppapi_cpp_lib',
+       '<(DEPTH)/ppapi/ppapi_nacl.gyp:nacl_elf_loader',
        '<(DEPTH)/ppapi/native_client/native_client.gyp:ppapi_lib',
     ],
     'target_conditions': [
@@ -58,7 +59,7 @@
           },
         ],
       }],
-      ['test_files!=[] and "<(target_arch)"!="arm" and "<(target_arch)"!="mipsel" and disable_glibc==0 and build_glibc==1', {
+      ['test_files!=[] and "<(target_arch)"!="mipsel" and disable_glibc==0 and build_glibc==1', {
         'copies': [
           {
             'destination': '>(nacl_glibc_out_dir)',
@@ -108,12 +109,21 @@
           'extra_args': [
             '--strip-all',
           ],
+          'variables': {
+            'conditions': [
+              ['target_arch=="arm"', {
+                'objdump': '>(nacl_glibc_tc_root)/bin/arm-nacl-objdump'
+              }, {
+                'objdump': '>(nacl_glibc_tc_root)/bin/x86_64-nacl-objdump'
+              }],
+            ]
+          },
           'create_nmf': '<(DEPTH)/native_client_sdk/src/tools/create_nmf.py',
           'create_nmf_args_portable%': [],
           'create_nonsfi_test_nmf': '<(DEPTH)/ppapi/tests/create_nonsfi_test_nmf.py',
           'create_nmf_args': [
             '--no-default-libpath',
-            '--objdump=>(nacl_glibc_tc_root)/bin/x86_64-nacl-objdump',
+            '--objdump=<(objdump)',
           ],
         },
         'target_conditions': [
@@ -151,12 +161,13 @@
               },
             ],
           }],
-          ['"<(target_arch)"!="arm" and "<(target_arch)"!="mipsel" and generate_nmf==1 and disable_glibc==0 and build_glibc==1', {
+          ['"<(target_arch)"!="mipsel" and generate_nmf==1 and disable_glibc==0 and build_glibc==1', {
             'variables': {
               # NOTE: Use /lib, not /lib64 here; it is a symbolic link which
               # doesn't work on Windows.
               'libdir_glibc64': '>(nacl_glibc_tc_root)/x86_64-nacl/lib',
               'libdir_glibc32': '>(nacl_glibc_tc_root)/x86_64-nacl/lib32',
+              'libdir_glibc_arm': '>(nacl_glibc_tc_root)/arm-nacl/lib',
             },
             'actions': [
               {
@@ -190,7 +201,13 @@
                       '--library-path=>(tc_lib_dir_glibc32)',
                     ],
                   }],
-                  # TODO(ncbray) handle arm case.  We don't have ARM glibc yet.
+                  ['enable_arm==1', {
+                    'inputs': ['>(out_glibc_arm)'],
+                    'action': [
+                      '--library-path=>(libdir_glibc_arm)',
+                      '--library-path=>(tc_lib_dir_glibc_arm)',
+                    ],
+                  }],
                 ],
               },
             ],
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/json-preview.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/json-preview.html
index c3a0806..dc20622 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/json-preview.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/json-preview.html
@@ -18,7 +18,7 @@
     {
         var previewView = new WebInspector.RequestPreviewView(request, null);
         var previewer = previewView._createPreviewView();
-        InspectorTest.addResult("Its previewer is the JSON previewer: " + (previewer && previewer instanceof WebInspector.RequestJSONView));
+        InspectorTest.addResult("Its previewer is the JSON previewer: " + (previewer && previewer instanceof WebInspector.JSONView));
     }
 
     function testType(contentType, callback)
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-preview-json.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-preview-json.html
index b50b9f97..498dd2ccb 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-preview-json.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-preview-json.html
@@ -9,7 +9,7 @@
     function check(text) {
         InspectorTest.addResult("");
         InspectorTest.addResult("Input: " + text);
-        var parsedJSON = WebInspector.RequestJSONView.parseJSON(text);
+        var parsedJSON = WebInspector.JSONView.parseJSON(text);
         if (!parsedJSON) {
             InspectorTest.addResult("Can't parse");
             return;
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-json-parser.html b/third_party/WebKit/LayoutTests/inspector/network/network-json-parser.html
index 37184bd..b2287a5f 100644
--- a/third_party/WebKit/LayoutTests/inspector/network/network-json-parser.html
+++ b/third_party/WebKit/LayoutTests/inspector/network/network-json-parser.html
@@ -6,7 +6,7 @@
 function test() {
     function check(jsonText)
     {
-        var result = WebInspector.RequestJSONView.parseJSON(jsonText);
+        var result = WebInspector.JSONView.parseJSON(jsonText);
         InspectorTest.addResult("");
         InspectorTest.addResult("Input: " + jsonText);
         if (!result) {
diff --git a/third_party/WebKit/Source/core/animation/CompositorAnimationsTestHelper.h b/third_party/WebKit/Source/core/animation/CompositorAnimationsTestHelper.h
index 687fa04..384f4cc2 100644
--- a/third_party/WebKit/Source/core/animation/CompositorAnimationsTestHelper.h
+++ b/third_party/WebKit/Source/core/animation/CompositorAnimationsTestHelper.h
@@ -26,7 +26,7 @@
 #define CompositorAnimationsTestHelper_h
 
 #include "core/animation/CompositorAnimations.h"
-#include "platform/testing/TestingPlatformSupport.h"
+#include "public/platform/Platform.h"
 #include "public/platform/WebCompositorAnimationPlayer.h"
 #include "public/platform/WebCompositorAnimationTimeline.h"
 #include "public/platform/WebCompositorSupport.h"
@@ -152,13 +152,31 @@
     };
 
 private:
-    class PlatformProxy : public TestingPlatformSupport {
+    class PlatformProxy : public Platform {
     public:
-        explicit PlatformProxy(WebCompositorSupportMock** compositor) : m_compositor(compositor) { }
-    private:
-        WebCompositorSupport* compositorSupport() override { return *m_compositor; }
+        PlatformProxy(WebCompositorSupportMock** compositor) : m_platform(Platform::current()), m_compositor(compositor) { }
 
+        ~PlatformProxy()
+        {
+            blink::Platform::initialize(m_platform);
+        }
+
+        virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length) { ASSERT_NOT_REACHED(); }
+        const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+        {
+            static const unsigned char tracingIsDisabled = 0;
+            return &tracingIsDisabled;
+        }
+
+        WebThread* currentThread() override
+        {
+            return m_platform->currentThread();
+        }
+
+    private:
+        blink::Platform* m_platform; // Not owned.
         WebCompositorSupportMock** m_compositor;
+        WebCompositorSupport* compositorSupport() override { return *m_compositor; }
     };
 
     WebCompositorSupportMock* m_mockCompositor;
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
index d4875fa..6afcd5a5 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
@@ -88,9 +88,7 @@
 {
     ImageResource* cachedImage = cachedImageForCSSValue(value, &layoutObject->document());
 
-    // If the image can be rendered at 1 zoom it will have non-empty dimension
-    // and should be able to render at other scales as well.
-    if (!cachedImage || !cachedImage->canRender(*layoutObject, 1))
+    if (!cachedImage || !cachedImage->canRender())
         return nullptr;
 
     return cachedImage->image();
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp b/third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp
index 09e5579..b9668ec 100644
--- a/third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp
@@ -10,7 +10,6 @@
 #include "core/dom/ScriptLoader.h"
 #include "platform/heap/Handle.h"
 #include "platform/scheduler/CancellableTaskFactory.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebViewScheduler.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -96,7 +95,7 @@
     Deque<OwnPtr<WebTaskRunner::Task>>* m_tasks; // NOT OWNED
 };
 
-class MockPlatform : public TestingPlatformSupport, public WebScheduler {
+class MockPlatform : public Platform, public WebScheduler {
 public:
     MockPlatform()
         : m_mockWebThread(this)
@@ -104,6 +103,17 @@
     {
     }
 
+    void cryptographicallyRandomValues(unsigned char* buffer, size_t length) override
+    {
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+
+    const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+    {
+        static const unsigned char tracingIsDisabled = 0;
+        return &tracingIsDisabled;
+    }
+
     WebThread* currentThread() override { return &m_mockWebThread; }
 
     void runSingleTask()
@@ -153,14 +163,16 @@
 
 class ScriptRunnerTest : public testing::Test {
 public:
-    ScriptRunnerTest()
-        : m_document(Document::create())
-        , m_element(m_document->createElement("foo", ASSERT_NO_EXCEPTION))
-    {
-    }
-
     void SetUp() override
     {
+        m_document = Document::create();
+        m_element = m_document->createElement("foo", ASSERT_NO_EXCEPTION);
+
+        m_oldPlatform = Platform::current();
+
+        // Force Platform::initialize to create a new one pointing at MockPlatform.
+        Platform::initialize(&m_platform);
+
         // We have to create ScriptRunner after initializing platform, because we need
         // Platform::current()->currentThread()->scheduler()->loadingTaskRunner()
         // to be initialized before creating ScriptRunner to save it in constructor.
@@ -170,13 +182,15 @@
     void TearDown() override
     {
         m_scriptRunner.release();
+        Platform::initialize(m_oldPlatform);
     }
 
     RefPtrWillBePersistent<Document> m_document;
     RefPtrWillBePersistent<Element> m_element;
-    MockPlatform m_platform;
     OwnPtrWillBePersistent<ScriptRunner> m_scriptRunner;
     WTF::Vector<int> m_order;
+    MockPlatform m_platform;
+    Platform* m_oldPlatform; // NOT OWNED
 };
 
 TEST_F(ScriptRunnerTest, QueueSingleScript_Async)
diff --git a/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp b/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
index ac0c261..99066f6 100644
--- a/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
@@ -38,7 +38,6 @@
 #include "core/fetch/ResourceFetcher.h"
 #include "core/fetch/ResourcePtr.h"
 #include "platform/network/ResourceRequest.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/OwnPtr.h"
@@ -56,6 +55,8 @@
 const char kOneDayBeforeOriginalRequest[] = "Wed, 24 May 1977 18:30:00 GMT";
 const char kOneDayAfterOriginalRequest[] = "Fri, 26 May 1977 18:30:00 GMT";
 
+const unsigned char kAConstUnsignedCharZero = 0;
+
 class MockFetchContext : public FetchContext {
 public:
     static MockFetchContext* create()
@@ -119,15 +120,25 @@
 
 private:
     // A simple platform that mocks out the clock, for cache freshness testing.
-    class ProxyPlatform : public TestingPlatformSupport {
+    class ProxyPlatform : public blink::Platform {
     public:
-        ProxyPlatform() : m_elapsedSeconds(0.) { }
+        ProxyPlatform() : m_platform(blink::Platform::current()), m_elapsedSeconds(0.) { }
+
+        ~ProxyPlatform()
+        {
+            blink::Platform::initialize(m_platform);
+        }
 
         void advanceClock(double seconds)
         {
             m_elapsedSeconds += seconds;
         }
 
+        WebThread* currentThread() override
+        {
+            return m_platform->currentThread();
+        }
+
     private:
         // From blink::Platform:
         double currentTimeSeconds() override
@@ -135,11 +146,24 @@
             return kOriginalRequestDateAsDouble + m_elapsedSeconds;
         }
 
+        // These blink::Platform methods must be overriden to make a usable object.
+        virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length)
+        {
+            RELEASE_ASSERT_NOT_REACHED();
+        }
+        virtual const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName)
+        {
+            return &kAConstUnsignedCharZero;
+        }
+
+        blink::Platform* m_platform; // Not owned.
         double m_elapsedSeconds;
     };
 
     virtual void SetUp()
     {
+        blink::Platform::initialize(&m_proxyPlatform);
+
         // Save the global memory cache to restore it upon teardown.
         m_globalMemoryCache = replaceMemoryCacheForTesting(MemoryCache::create());
 
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.h b/third_party/WebKit/Source/core/fetch/ImageResource.h
index 5cfe9ca..43eeabf 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.h
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.h
@@ -67,7 +67,8 @@
     static std::pair<blink::Image*, float> brokenImage(float deviceScaleFactor); // Returns an image and the image's resolution scale factor.
     bool willPaintBrokenImage() const;
 
-    bool canRender(const LayoutObject& layoutObject, float multiplier) { return !errorOccurred() && !imageSizeForLayoutObject(&layoutObject, multiplier).isEmpty(); }
+    // Assumes that image rotation or scale doesn't effect the image size being empty or not.
+    bool canRender() { return !errorOccurred() && !imageSizeForLayoutObject(nullptr, 1).isEmpty(); }
 
     bool usesImageContainerSize() const;
     bool imageHasRelativeWidth() const;
diff --git a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
index 3a100eff..143d942f 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
@@ -8,7 +8,6 @@
 #include "core/fetch/ResourcePtr.h"
 #include "platform/network/ResourceRequest.h"
 #include "platform/network/ResourceResponse.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "platform/testing/URLTestHelpers.h"
 #include "public/platform/Platform.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -18,9 +17,9 @@
 
 namespace {
 
-class MockPlatform final : public TestingPlatformSupport {
+class MockPlatform final : public Platform {
 public:
-    MockPlatform() { }
+    MockPlatform() : m_oldPlatform(Platform::current()) { }
     ~MockPlatform() override { }
 
     // From blink::Platform:
@@ -34,10 +33,45 @@
         return m_cachedURLs;
     }
 
+    WebThread* currentThread() override
+    {
+        return m_oldPlatform->currentThread();
+    }
+
+    // These blink::Platform methods must be overriden to make a usable object.
+    void cryptographicallyRandomValues(unsigned char* buffer, size_t length) override
+    {
+        ASSERT_NOT_REACHED();
+    }
+
+    const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+    {
+        static const unsigned char tracingIsDisabled = 0;
+        return &tracingIsDisabled;
+    }
+
 private:
+    Platform* m_oldPlatform; // Not owned.
     Vector<WebURL> m_cachedURLs;
 };
 
+class AutoInstallMockPlatform {
+public:
+    AutoInstallMockPlatform()
+    {
+        m_oldPlatform = Platform::current();
+        Platform::initialize(&m_mockPlatform);
+    }
+    ~AutoInstallMockPlatform()
+    {
+        Platform::initialize(m_oldPlatform);
+    }
+    MockPlatform* platform() { return &m_mockPlatform; }
+private:
+    MockPlatform m_mockPlatform;
+    Platform* m_oldPlatform;
+};
+
 PassOwnPtr<ResourceResponse> createTestResourceResponse()
 {
     OwnPtr<ResourceResponse> response = adoptPtr(new ResourceResponse);
@@ -59,19 +93,19 @@
 
 TEST(ResourceTest, SetCachedMetadata_SendsMetadataToPlatform)
 {
-    MockPlatform mock;
+    AutoInstallMockPlatform mock;
     OwnPtr<ResourceResponse> response(createTestResourceResponse());
     createTestResourceAndSetCachedMetadata(response.get());
-    EXPECT_EQ(1u, mock.cachedURLs().size());
+    EXPECT_EQ(1u, mock.platform()->cachedURLs().size());
 }
 
 TEST(ResourceTest, SetCachedMetadata_DoesNotSendMetadataToPlatformWhenFetchedViaServiceWorker)
 {
-    MockPlatform mock;
+    AutoInstallMockPlatform mock;
     OwnPtr<ResourceResponse> response(createTestResourceResponse());
     response->setWasFetchedViaServiceWorker(true);
     createTestResourceAndSetCachedMetadata(response.get());
-    EXPECT_EQ(0u, mock.cachedURLs().size());
+    EXPECT_EQ(0u, mock.platform()->cachedURLs().size());
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index 84aa10f..4a4f729 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -4762,7 +4762,7 @@
 
     // Make sure we have a valid image.
     StyleImage* img = layer.image();
-    if (!img || !img->canRender(*this, style()->effectiveZoom()))
+    if (!img || !img->canRender())
         return false;
 
     if (layer.repeatX() != RepeatFill && layer.repeatX() != NoRepeatFill)
@@ -4837,7 +4837,7 @@
         return false;
 
     StyleImage* borderImage = style()->borderImage().image();
-    return borderImage && borderImage->canRender(*this, style()->effectiveZoom()) && borderImage->isLoaded();
+    return borderImage && borderImage->canRender() && borderImage->isLoaded();
 }
 
 ShapeOutsideInfo* LayoutBox::shapeOutsideInfo() const
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
index efec9b15..d3ba572 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp
@@ -956,7 +956,7 @@
 
     // Make sure we have a valid image.
     StyleImage* img = layer.image();
-    if (!img || !img->canRender(*this, style()->effectiveZoom()))
+    if (!img || !img->canRender())
         return false;
 
     if (layer.repeatY() != RepeatFill && layer.repeatY() != NoRepeatFill)
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
index 21300bb..5a94a49f 100644
--- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
+++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
@@ -1062,7 +1062,7 @@
     // The checks here match how paintFillLayer() decides whether to clip (if it does, the shadow
     // would be clipped out, so it has to be drawn separately).
     StyleImage* image = lastBackgroundLayer.image();
-    bool hasFillImage = image && image->canRender(layoutObject(), layoutObject().style()->effectiveZoom());
+    bool hasFillImage = image && image->canRender();
     return (!hasFillImage && !layoutObject().style()->hasBorderRadius()) || (!prevLineBox() && !nextLineBox()) || !parent();
 }
 
diff --git a/third_party/WebKit/Source/core/paint/BoxPainter.cpp b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
index c56ba6ae..709167a 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
@@ -143,7 +143,7 @@
 static bool isFillLayerOpaque(const FillLayer& layer, const LayoutObject& imageClient)
 {
     return layer.hasOpaqueImage(&imageClient)
-        && layer.image()->canRender(imageClient, imageClient.style()->effectiveZoom())
+        && layer.image()->canRender()
         && !layer.image()->imageSize(&imageClient, imageClient.style()->effectiveZoom()).isEmpty()
         && layer.hasRepeatXY();
 }
@@ -438,7 +438,7 @@
     BackgroundImageGeometry geometry;
     if (bgImage)
         geometry.calculate(obj, paintInfo.paintContainer(), paintInfo.globalPaintFlags(), bgLayer, scrolledPaintRect);
-    bool shouldPaintBackgroundImage = bgImage && bgImage->canRender(obj, obj.style()->effectiveZoom());
+    bool shouldPaintBackgroundImage = bgImage && bgImage->canRender();
 
     // Paint the color first underneath all images, culled if background image occludes it.
     // TODO(trchen): In the !bgLayer.hasRepeatXY() case, we could improve the culling test
diff --git a/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp b/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp
index 8b4c6d8..94e9a2b 100644
--- a/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/InlineFlowBoxPainter.cpp
@@ -70,7 +70,7 @@
 {
     LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutPaintShim::layoutObjectFrom(m_inlineFlowBox.boxModelObject()));
     StyleImage* img = fillLayer.image();
-    bool hasFillImage = img && img->canRender(m_inlineFlowBox.layoutObject(), m_inlineFlowBox.lineLayoutItem().style()->effectiveZoom());
+    bool hasFillImage = img && img->canRender();
     if ((!hasFillImage && !m_inlineFlowBox.lineLayoutItem().style()->hasBorderRadius()) || (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) || !m_inlineFlowBox.parent()) {
         BoxPainter::paintFillLayerExtended(*boxModel, paintInfo, c, fillLayer, rect, BackgroundBleedNone, &m_inlineFlowBox, rect.size(), op);
     } else if (m_inlineFlowBox.lineLayoutItem().style()->boxDecorationBreak() == DCLONE) {
@@ -164,8 +164,7 @@
     if (m_inlineFlowBox.parent() && m_inlineFlowBox.lineLayoutItem().style()->hasBorderDecoration()) {
         const NinePieceImage& borderImage = m_inlineFlowBox.lineLayoutItem().style()->borderImage();
         StyleImage* borderImageSource = borderImage.image();
-        const ComputedStyle* styleToUse = m_inlineFlowBox.lineLayoutItem().style(m_inlineFlowBox.isFirstLineStyle());
-        bool hasBorderImage = borderImageSource && borderImageSource->canRender(m_inlineFlowBox.layoutObject(), styleToUse->effectiveZoom());
+        bool hasBorderImage = borderImageSource && borderImageSource->canRender();
         if (hasBorderImage && !borderImageSource->isLoaded())
             return DontPaintBorders;
 
@@ -278,7 +277,7 @@
     LayoutRect paintRect = LayoutRect(adjustedPaintOffset, frameRect.size());
     paintFillLayers(paintInfo, Color::transparent, m_inlineFlowBox.lineLayoutItem().style()->maskLayers(), paintRect, compositeOp);
 
-    bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(m_inlineFlowBox.layoutObject(), m_inlineFlowBox.lineLayoutItem().style()->effectiveZoom());
+    bool hasBoxImage = maskBoxImage && maskBoxImage->canRender();
     if (!hasBoxImage || !maskBoxImage->isLoaded()) {
         if (pushTransparencyLayer)
             paintInfo.context->endLayer();
diff --git a/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp b/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
index 8947ad8..afd882d6 100644
--- a/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
+++ b/third_party/WebKit/Source/core/paint/NinePieceImagePainter.cpp
@@ -33,7 +33,7 @@
     if (!styleImage->isLoaded())
         return true; // Never paint a nine-piece image incrementally, but don't paint the fallback borders either.
 
-    if (!styleImage->canRender(m_layoutObject, style.effectiveZoom()))
+    if (!styleImage->canRender())
         return false;
 
     // Find out if the hasImage() check in ComputedStyle::border*Width had any affect, i.e. if a border is non-zero while border-style is
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
index bcc2857..099b407 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
@@ -66,9 +66,9 @@
     return cssValue();
 }
 
-bool StyleFetchedImage::canRender(const LayoutObject& layoutObject, float multiplier) const
+bool StyleFetchedImage::canRender() const
 {
-    return m_image->canRender(layoutObject, multiplier);
+    return m_image->canRender();
 }
 
 bool StyleFetchedImage::isLoaded() const
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.h b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
index 9b5c9ab..6d13020 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImage.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
@@ -47,7 +47,7 @@
     PassRefPtrWillBeRawPtr<CSSValue> cssValue() const override;
     PassRefPtrWillBeRawPtr<CSSValue> computedCSSValue() const override;
 
-    bool canRender(const LayoutObject&, float multiplier) const override;
+    bool canRender() const override;
     bool isLoaded() const override;
     bool errorOccurred() const override;
     LayoutSize imageSize(const LayoutObject*, float multiplier) const override;
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
index 6f2688c..b1e2601 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
@@ -69,9 +69,9 @@
     return m_imageSetValue->valueWithURLsMadeAbsolute();
 }
 
-bool StyleFetchedImageSet::canRender(const LayoutObject& layoutObject, float multiplier) const
+bool StyleFetchedImageSet::canRender() const
 {
-    return m_bestFitImage->canRender(layoutObject, multiplier);
+    return m_bestFitImage->canRender();
 }
 
 bool StyleFetchedImageSet::isLoaded() const
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
index 6b5b141..1805cb4 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
@@ -59,7 +59,7 @@
     void clearImageSetValue() { m_imageSetValue = nullptr; }
 #endif
 
-    bool canRender(const LayoutObject&, float multiplier) const override;
+    bool canRender() const override;
     bool isLoaded() const override;
     bool errorOccurred() const override;
     LayoutSize imageSize(const LayoutObject*, float multiplier) const override;
diff --git a/third_party/WebKit/Source/core/style/StyleImage.h b/third_party/WebKit/Source/core/style/StyleImage.h
index 8d5df40..d5d96b7 100644
--- a/third_party/WebKit/Source/core/style/StyleImage.h
+++ b/third_party/WebKit/Source/core/style/StyleImage.h
@@ -53,7 +53,7 @@
     virtual PassRefPtrWillBeRawPtr<CSSValue> cssValue() const = 0;
     virtual PassRefPtrWillBeRawPtr<CSSValue> computedCSSValue() const = 0;
 
-    virtual bool canRender(const LayoutObject&, float /*multiplier*/) const { return true; }
+    virtual bool canRender() const { return true; }
     virtual bool isLoaded() const { return true; }
     virtual bool errorOccurred() const { return false; }
     virtual LayoutSize imageSize(const LayoutObject*, float multiplier) const = 0;
diff --git a/third_party/WebKit/Source/devtools/devtools.gypi b/third_party/WebKit/Source/devtools/devtools.gypi
index abd0e4f..3449ce7 100644
--- a/third_party/WebKit/Source/devtools/devtools.gypi
+++ b/third_party/WebKit/Source/devtools/devtools.gypi
@@ -512,6 +512,7 @@
             'front_end/network/EventSourceMessagesView.js',
             'front_end/network/FilterSuggestionBuilder.js',
             'front_end/network/HARWriter.js',
+            'front_end/network/JSONView.js',
             'front_end/network/NetworkConfigView.js',
             'front_end/network/NetworkDataGridNode.js',
             'front_end/network/NetworkItemView.js',
@@ -522,7 +523,6 @@
             'front_end/network/RequestCookiesView.js',
             'front_end/network/RequestHeadersView.js',
             'front_end/network/RequestHTMLView.js',
-            'front_end/network/RequestJSONView.js',
             'front_end/network/RequestPreviewView.js',
             'front_end/network/RequestResponseView.js',
             'front_end/network/RequestTimingView.js',
diff --git a/third_party/WebKit/Source/devtools/front_end/network/RequestJSONView.js b/third_party/WebKit/Source/devtools/front_end/network/JSONView.js
similarity index 76%
rename from third_party/WebKit/Source/devtools/front_end/network/RequestJSONView.js
rename to third_party/WebKit/Source/devtools/front_end/network/JSONView.js
index a5b3eed..1ad2804 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/RequestJSONView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/JSONView.js
@@ -30,25 +30,24 @@
 
 /**
  * @constructor
- * @extends {WebInspector.RequestView}
- * @param {!WebInspector.NetworkRequest} request
+ * @extends {WebInspector.VBox}
  * @param {!WebInspector.ParsedJSON} parsedJSON
  */
-WebInspector.RequestJSONView = function(request, parsedJSON)
+WebInspector.JSONView = function(parsedJSON)
 {
-    WebInspector.RequestView.call(this, request);
+    WebInspector.VBox.call(this);
     this._parsedJSON = parsedJSON;
-    this.element.classList.add("json");
+    this.element.classList.add("json-view");
 }
 
 // "false", "true", "null", ",", "{", "}", "[", "]", number, double-quoted string.
-WebInspector.RequestJSONView._jsonToken = new RegExp('(?:false|true|null|[/*&\\|;=\\(\\),\\{\\}\\[\\]]|(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)|(?:\"(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))*\"))', 'g');
+WebInspector.JSONView._jsonToken = new RegExp('(?:false|true|null|[/*&\\|;=\\(\\),\\{\\}\\[\\]]|(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)|(?:\"(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))*\"))', 'g');
 
 // Escaped unicode char.
-WebInspector.RequestJSONView._escapedUnicode = new RegExp('\\\\(?:([^u])|u(.{4}))', 'g');
+WebInspector.JSONView._escapedUnicode = new RegExp('\\\\(?:([^u])|u(.{4}))', 'g');
 
 // Map from escaped char to its literal value.
-WebInspector.RequestJSONView._standardEscapes = {'"': '"', '/': '/', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t'};
+WebInspector.JSONView._standardEscapes = {'"': '"', '/': '/', '\\': '\\', 'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t'};
 
 /**
  * @param {string} full
@@ -56,26 +55,26 @@
  * @param {string} unicode
  * @return {string}
  */
-WebInspector.RequestJSONView._unescape = function(full, standard, unicode)
+WebInspector.JSONView._unescape = function(full, standard, unicode)
 {
-    return standard ? WebInspector.RequestJSONView._standardEscapes[standard] : String.fromCharCode(parseInt(unicode, 16));
+    return standard ? WebInspector.JSONView._standardEscapes[standard] : String.fromCharCode(parseInt(unicode, 16));
 }
 
 /**
  * @param {string} text
  * @return {string}
  */
-WebInspector.RequestJSONView._unescapeString = function(text)
+WebInspector.JSONView._unescapeString = function(text)
 {
-    return text.indexOf("\\") === -1 ? text : text.replace(WebInspector.RequestJSONView._escapedUnicode, WebInspector.RequestJSONView._unescape);
+    return text.indexOf("\\") === -1 ? text : text.replace(WebInspector.JSONView._escapedUnicode, WebInspector.JSONView._unescape);
 }
 
 /**
  * @return {*}
  */
-WebInspector.RequestJSONView._buildObjectFromJSON = function(text)
+WebInspector.JSONView._buildObjectFromJSON = function(text)
 {
-    var regExp = WebInspector.RequestJSONView._jsonToken;
+    var regExp = WebInspector.JSONView._jsonToken;
     regExp.lastIndex = 0;
     var result = [];
     var tip = result;
@@ -103,7 +102,7 @@
             if (Array.isArray(tip) && (lastToken === undefined || lastToken === "[" || lastToken === ","))
                 tip[tip.length] = undefined;
         } else if (code === 0x22) { // "
-            token = WebInspector.RequestJSONView._unescapeString(token.substring(1, token.length - 1));
+            token = WebInspector.JSONView._unescapeString(token.substring(1, token.length - 1));
             if (!key) {
                 if (Array.isArray(tip)) {
                   key = tip.length;
@@ -134,13 +133,13 @@
  * @param {string} text
  * @return {?WebInspector.ParsedJSON}
  */
-WebInspector.RequestJSONView.parseJSON = function(text)
+WebInspector.JSONView.parseJSON = function(text)
 {
     // Do not treat HTML as JSON.
     if (text.startsWith("<"))
         return null;
-    var inner = WebInspector.RequestJSONView._findBrackets(text, "{", "}");
-    var inner2 = WebInspector.RequestJSONView._findBrackets(text, "[", "]");
+    var inner = WebInspector.JSONView._findBrackets(text, "{", "}");
+    var inner2 = WebInspector.JSONView._findBrackets(text, "[", "]");
     inner = inner2.length > inner.length ? inner2 : inner;
 
     // Return on blank payloads or on payloads significantly smaller than original text.
@@ -156,7 +155,7 @@
         return null;
 
     try {
-        return new WebInspector.ParsedJSON(WebInspector.RequestJSONView._buildObjectFromJSON(text), prefix, suffix);
+        return new WebInspector.ParsedJSON(WebInspector.JSONView._buildObjectFromJSON(text), prefix, suffix);
     } catch (e) {
         return null;
     }
@@ -168,7 +167,7 @@
  * @param {string} close
  * @return {{start: number, end: number, length: number}}
  */
-WebInspector.RequestJSONView._findBrackets = function(text, open, close)
+WebInspector.JSONView._findBrackets = function(text, open, close)
 {
     var start = text.indexOf(open);
     var end = text.lastIndexOf(close);
@@ -178,7 +177,7 @@
     return {start: start, end: end, length: length};
 }
 
-WebInspector.RequestJSONView.prototype = {
+WebInspector.JSONView.prototype = {
     wasShown: function()
     {
         this._initialize();
@@ -198,11 +197,14 @@
         this.element.appendChild(section.element);
     },
 
-    __proto__: WebInspector.RequestView.prototype
+    __proto__: WebInspector.VBox.prototype
 }
 
 /**
  * @constructor
+ * @param {*} data
+ * @param {string} prefix
+ * @param {string} suffix
  */
 WebInspector.ParsedJSON = function(data, prefix, suffix)
 {
diff --git a/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js b/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
index 31b4571..47395a1b 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/RequestPreviewView.js
@@ -86,13 +86,12 @@
     },
 
     /**
-     * @return {?WebInspector.RequestJSONView}
+     * @return {?WebInspector.JSONView}
      */
     _jsonView: function()
     {
-        var content = this._requestContent();
-        var parsedJSON = WebInspector.RequestJSONView.parseJSON(content);
-        return parsedJSON ? new WebInspector.RequestJSONView(this.request, parsedJSON) : null;
+        var parsedJSON = WebInspector.JSONView.parseJSON(this._requestContent());
+        return parsedJSON && new WebInspector.JSONView(parsedJSON);
     },
 
     /**
diff --git a/third_party/WebKit/Source/devtools/front_end/network/ResourceWebSocketFrameView.js b/third_party/WebKit/Source/devtools/front_end/network/ResourceWebSocketFrameView.js
index 63105e2..eac9d79 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/ResourceWebSocketFrameView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/ResourceWebSocketFrameView.js
@@ -51,8 +51,8 @@
     dataGridWidget.appendDataGrid(this._dataGrid);
     this._splitWidget.setMainWidget(dataGridWidget);
 
-    this._messageView = new WebInspector.EmptyWidget("Select frame to browse its content.");
-    this._splitWidget.setSidebarWidget(this._messageView);
+    var view = new WebInspector.EmptyWidget("Select frame to browse its content.");
+    this._splitWidget.setSidebarWidget(view);
 }
 
 /** @enum {number} */
@@ -118,12 +118,12 @@
     _onFrameSelected: function(event)
     {
         var selectedNode = /** @type {!WebInspector.ResourceWebSocketFrameNode} */ (event.target.selectedNode);
-        if (this._messageView)
-            this._messageView.detach();
-        if (this._dataView)
-            this._dataView.detach();
-        this._dataView = new WebInspector.ResourceSourceFrame(selectedNode.contentProvider());
-        this._splitWidget.setSidebarWidget(this._dataView);
+        var contentProvider = selectedNode.contentProvider();
+        contentProvider.requestContent(content => {
+            var parsedJSON = content ? WebInspector.JSONView.parseJSON(content) : null;
+            var view = parsedJSON ? new WebInspector.JSONView(parsedJSON) : new WebInspector.ResourceSourceFrame(contentProvider);
+            this._splitWidget.setSidebarWidget(view);
+        });
     },
 
     refresh: function()
diff --git a/third_party/WebKit/Source/devtools/front_end/network/module.json b/third_party/WebKit/Source/devtools/front_end/network/module.json
index 014c1ea..f7db8b4e 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/network/module.json
@@ -99,6 +99,7 @@
         "EventSourceMessagesView.js",
         "FilterSuggestionBuilder.js",
         "HARWriter.js",
+        "JSONView.js",
         "RequestView.js",
         "NetworkConfigView.js",
         "NetworkDataGridNode.js",
@@ -109,7 +110,6 @@
         "RequestCookiesView.js",
         "RequestHeadersView.js",
         "RequestHTMLView.js",
-        "RequestJSONView.js",
         "RequestPreviewView.js",
         "RequestResponseView.js",
         "RequestTimingView.js",
diff --git a/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css b/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
index fc70603..4a64b7a 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
+++ b/third_party/WebKit/Source/devtools/front_end/network/networkPanel.css
@@ -215,8 +215,8 @@
     z-index: 250;
 }
 
-.request-view.json {
-    padding: 5px;
+.json-view {
+    padding: 2px 6px;
 }
 
 .request-view.html iframe {
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
index b14c4a7..e8d9ee84 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp
@@ -702,7 +702,7 @@
 void WebGL2RenderingContextBase::texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, DOMArrayBufferView* pixels)
 {
     if (isContextLost() || !validateTexImage3D("texImage3D", target, level, internalformat, width, height, depth, border, format, type)
-        || !validateTexFuncData("texImage3D", level, width, height, format, type, pixels, NullAllowed))
+        || !validateTexFuncData("texImage3D", level, width, height, depth, format, type, pixels, NullAllowed))
         return;
 
     void* data = pixels ? pixels->baseAddress() : 0;
@@ -810,7 +810,7 @@
 void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, DOMArrayBufferView* pixels)
 {
     if (isContextLost() || !pixels || !validateTexSubImage3D("texSubImage3D", target, level, xoffset, yoffset, zoffset, format, type, width, height, depth)
-        || !validateTexFuncData("texSubImage3D", level, width, height, format, type, pixels, NullAllowed))
+        || !validateTexFuncData("texSubImage3D", level, width, height, depth, format, type, pixels, NullAllowed))
         return;
 
     // FIXME: Ensure pixels is large enough to contain the desired texture dimensions.
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
index a9ecf18..3c91012 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
@@ -3841,7 +3841,7 @@
     // Calculate array size, taking into consideration of PACK_ALIGNMENT.
     unsigned totalBytesRequired = 0;
     unsigned padding = 0;
-    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_packAlignment, &totalBytesRequired, &padding);
+    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, 1, m_packAlignment, &totalBytesRequired, &padding);
     if (error != GL_NO_ERROR) {
         synthesizeGLError(error, "readPixels", "invalid dimensions");
         return false;
@@ -4290,7 +4290,7 @@
     GLenum format, GLenum type, DOMArrayBufferView* pixels)
 {
     if (isContextLost() || !validateTexFunc("texImage2D", NotTexSubImage2D, SourceArrayBufferView, target, level, internalformat, width, height, border, format, type, 0, 0)
-        || !validateTexFuncData("texImage2D", level, width, height, format, type, pixels, NullAllowed))
+        || !validateTexFuncData("texImage2D", level, width, height, 1, format, type, pixels, NullAllowed))
         return;
     void* data = pixels ? pixels->baseAddress() : 0;
     Vector<uint8_t> tempData;
@@ -4614,7 +4614,7 @@
     GLenum format, GLenum type, DOMArrayBufferView* pixels)
 {
     if (isContextLost() || !validateTexFunc("texSubImage2D", TexSubImage2D, SourceArrayBufferView, target, level, 0, width, height, 0, format, type, xoffset, yoffset)
-        || !validateTexFuncData("texSubImage2D", level, width, height, format, type, pixels, NullNotAllowed))
+        || !validateTexFuncData("texSubImage2D", level, width, height, 1, format, type, pixels, NullNotAllowed))
         return;
     void* data = pixels->baseAddress();
     Vector<uint8_t> tempData;
@@ -5714,7 +5714,7 @@
     return true;
 }
 
-bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBufferView* pixels, NullDisposition disposition)
+bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, DOMArrayBufferView* pixels, NullDisposition disposition)
 {
     // All calling functions check isContextLost, so a duplicate check is not needed here.
     if (!pixels) {
@@ -5791,14 +5791,14 @@
     }
 
     unsigned totalBytesRequired;
-    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_unpackAlignment, &totalBytesRequired, 0);
+    GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, depth, m_unpackAlignment, &totalBytesRequired, 0);
     if (error != GL_NO_ERROR) {
         synthesizeGLError(error, functionName, "invalid texture dimensions");
         return false;
     }
     if (pixels->byteLength() < totalBytesRequired) {
         if (m_unpackAlignment != 1) {
-            error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, 1, &totalBytesRequired, 0);
+            error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, depth, 1, &totalBytesRequired, 0);
             if (pixels->byteLength() == totalBytesRequired) {
                 synthesizeGLError(GL_INVALID_OPERATION, functionName, "ArrayBufferView not big enough for request with UNPACK_ALIGNMENT > 1");
                 return false;
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
index 748c4ed..201fc75 100644
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.h
@@ -934,7 +934,7 @@
     // Helper function to validate that the given ArrayBufferView
     // is of the correct type and contains enough data for the texImage call.
     // Generates GL error and returns false if parameters are invalid.
-    bool validateTexFuncData(const char* functionName, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBufferView* pixels, NullDisposition);
+    bool validateTexFuncData(const char* functionName, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, DOMArrayBufferView* pixels, NullDisposition);
 
     // Helper function to validate that a copyTexSubImage call is valid.
     bool validateCopyTexSubImage(const char* functionName, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
diff --git a/third_party/WebKit/Source/platform/PurgeableVectorTest.cpp b/third_party/WebKit/Source/platform/PurgeableVectorTest.cpp
index 474cb70..258c36e 100644
--- a/third_party/WebKit/Source/platform/PurgeableVectorTest.cpp
+++ b/third_party/WebKit/Source/platform/PurgeableVectorTest.cpp
@@ -31,7 +31,7 @@
 #include "config.h"
 #include "platform/PurgeableVector.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
+#include "platform/TestingPlatformSupport.h"
 #include "public/platform/WebDiscardableMemory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/Vector.h"
diff --git a/third_party/WebKit/Source/platform/SharedBufferTest.cpp b/third_party/WebKit/Source/platform/SharedBufferTest.cpp
index fe3d239f..7f6696f 100644
--- a/third_party/WebKit/Source/platform/SharedBufferTest.cpp
+++ b/third_party/WebKit/Source/platform/SharedBufferTest.cpp
@@ -31,7 +31,7 @@
 #include "config.h"
 #include "platform/SharedBuffer.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
+#include "platform/TestingPlatformSupport.h"
 #include "public/platform/WebDiscardableMemory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/RefPtr.h"
diff --git a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.cpp b/third_party/WebKit/Source/platform/TestingPlatformSupport.cpp
similarity index 91%
rename from third_party/WebKit/Source/platform/testing/TestingPlatformSupport.cpp
rename to third_party/WebKit/Source/platform/TestingPlatformSupport.cpp
index 8939238..fcb4dbb7 100644
--- a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.cpp
+++ b/third_party/WebKit/Source/platform/TestingPlatformSupport.cpp
@@ -30,7 +30,7 @@
 
 #include "config.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
+#include "platform/TestingPlatformSupport.h"
 
 namespace blink {
 
@@ -69,11 +69,6 @@
     return nullptr;
 }
 
-TestingPlatformSupport::TestingPlatformSupport()
-    : TestingPlatformSupport(TestingPlatformSupport::Config())
-{
-}
-
 TestingPlatformSupport::TestingPlatformSupport(const Config& config)
     : m_config(config)
     , m_oldPlatform(Platform::current())
@@ -112,9 +107,4 @@
     return m_config.compositorSupport;
 }
 
-WebThread* TestingPlatformSupport::currentThread()
-{
-    return m_oldPlatform ? m_oldPlatform->currentThread() : nullptr;
-}
-
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h b/third_party/WebKit/Source/platform/TestingPlatformSupport.h
similarity index 94%
rename from third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
rename to third_party/WebKit/Source/platform/TestingPlatformSupport.h
index e1d5a49e..cdb74e3e 100644
--- a/third_party/WebKit/Source/platform/testing/TestingPlatformSupport.h
+++ b/third_party/WebKit/Source/platform/TestingPlatformSupport.h
@@ -31,16 +31,12 @@
 #ifndef TestingPlatformSupport_h
 #define TestingPlatformSupport_h
 
-#include "platform/PlatformExport.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebDiscardableMemory.h"
 #include "wtf/Vector.h"
 
 namespace blink {
 
-class WebCompositorSupport;
-class WebThread;
-
 class TestingDiscardableMemory : public WebDiscardableMemory {
 public:
     explicit TestingDiscardableMemory(size_t);
@@ -68,7 +64,6 @@
         WebCompositorSupport* compositorSupport;
     };
 
-    TestingPlatformSupport();
     explicit TestingPlatformSupport(const Config&);
 
     ~TestingPlatformSupport() override;
@@ -79,9 +74,8 @@
     const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override;
     WebString defaultLocale() override;
     WebCompositorSupport* compositorSupport() override;
-    WebThread* currentThread() override;
 
-protected:
+private:
     const Config m_config;
     Platform* const m_oldPlatform;
 };
diff --git a/third_party/WebKit/Source/platform/TimerTest.cpp b/third_party/WebKit/Source/platform/TimerTest.cpp
index 4585d950..0b14918e 100644
--- a/third_party/WebKit/Source/platform/TimerTest.cpp
+++ b/third_party/WebKit/Source/platform/TimerTest.cpp
@@ -5,7 +5,6 @@
 #include "config.h"
 #include "platform/Timer.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebScheduler.h"
 #include "public/platform/WebThread.h"
@@ -237,7 +236,7 @@
     OwnPtr<MockWebScheduler> m_webScheduler;
 };
 
-class TimerTestPlatform : public TestingPlatformSupport {
+class TimerTestPlatform : public Platform {
 public:
     TimerTestPlatform()
         : m_webThread(adoptPtr(new FakeWebThread())) { }
@@ -248,6 +247,17 @@
         return m_webThread.get();
     }
 
+    void cryptographicallyRandomValues(unsigned char*, size_t) override
+    {
+        ASSERT_NOT_REACHED();
+    }
+
+    const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+    {
+        static const unsigned char enabled[] = {0};
+        return enabled;
+    }
+
     void runUntilIdle()
     {
         mockScheduler()->runUntilIdle();
@@ -286,6 +296,9 @@
 public:
     void SetUp() override
     {
+        m_platform = adoptPtr(new TimerTestPlatform());
+        m_oldPlatform = Platform::current();
+        Platform::initialize(m_platform.get());
         WTF::setMonotonicallyIncreasingTimeFunction(currentTime);
 
         m_runTimes.clear();
@@ -293,6 +306,11 @@
         m_startTime = gCurrentTimeSecs;
     }
 
+    void TearDown() override
+    {
+        Platform::initialize(m_oldPlatform);
+    }
+
     void countingTask(Timer<TimerTest>*)
     {
         m_runTimes.append(monotonicallyIncreasingTime());
@@ -310,27 +328,27 @@
 
     void runUntilIdle()
     {
-        m_platform.runUntilIdle();
+        m_platform->runUntilIdle();
     }
 
     void runPendingTasks()
     {
-        m_platform.runPendingTasks();
+        m_platform->runPendingTasks();
     }
 
     void runUntilIdleOrDeadlinePassed(double deadline)
     {
-        m_platform.runUntilIdleOrDeadlinePassed(deadline);
+        m_platform->runUntilIdleOrDeadlinePassed(deadline);
     }
 
     bool hasOneTimerTask() const
     {
-        return m_platform.hasOneTimerTask();
+        return m_platform->hasOneTimerTask();
     }
 
     double nextTimerTaskDelaySecs() const
     {
-        return m_platform.nextTimerTaskDelaySecs();
+        return m_platform->nextTimerTaskDelaySecs();
     }
 
 protected:
@@ -339,7 +357,8 @@
     WTF::Vector<double> m_nextFireTimes;
 
 private:
-    TimerTestPlatform m_platform;
+    OwnPtr<TimerTestPlatform> m_platform;
+    Platform* m_oldPlatform;
 };
 
 TEST_F(TimerTest, StartOneShot_Zero)
diff --git a/third_party/WebKit/Source/platform/blink_platform.gypi b/third_party/WebKit/Source/platform/blink_platform.gypi
index f0dbfe7..4ef56a69 100644
--- a/third_party/WebKit/Source/platform/blink_platform.gypi
+++ b/third_party/WebKit/Source/platform/blink_platform.gypi
@@ -973,6 +973,8 @@
       'PODRedBlackTreeTest.cpp',
       'PurgeableVectorTest.cpp',
       'SharedBufferTest.cpp',
+      'TestingPlatformSupport.cpp',
+      'TestingPlatformSupport.h',
       'TimerTest.cpp',
       'TracedValueTest.cpp',
       'UUIDTest.cpp',
@@ -1076,8 +1078,6 @@
       'testing/GeometryPrinters.h',
       'testing/PaintPrinters.cpp',
       'testing/PaintPrinters.h',
-      'testing/TestingPlatformSupport.cpp',
-      'testing/TestingPlatformSupport.h',
       'testing/TransformPrinters.cpp',
       'testing/TransformPrinters.h',
     ],
diff --git a/third_party/WebKit/Source/platform/blink_platform_tests.gyp b/third_party/WebKit/Source/platform/blink_platform_tests.gyp
index 0eef2e6..785918f 100644
--- a/third_party/WebKit/Source/platform/blink_platform_tests.gyp
+++ b/third_party/WebKit/Source/platform/blink_platform_tests.gyp
@@ -128,8 +128,6 @@
       'sources': [
         '<@(platform_test_support_files)',
       ],
-      # Disable c4267 warnings until we fix size_t to int truncations.
-      'msvs_disabled_warnings': [ 4267 ],
     },
   ],
   'conditions': [
diff --git a/third_party/WebKit/Source/platform/fonts/FontCacheTest.cpp b/third_party/WebKit/Source/platform/fonts/FontCacheTest.cpp
index 706f1694..ae6b2c2 100644
--- a/third_party/WebKit/Source/platform/fonts/FontCacheTest.cpp
+++ b/third_party/WebKit/Source/platform/fonts/FontCacheTest.cpp
@@ -7,16 +7,19 @@
 
 #include "platform/fonts/FontDescription.h"
 #include "platform/fonts/SimpleFontData.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
 
-class EmptyPlatform : public TestingPlatformSupport {
+class EmptyPlatform : public Platform {
 public:
     EmptyPlatform() {}
     ~EmptyPlatform() override {}
+    void cryptographicallyRandomValues(unsigned char* buffer, size_t length) override
+    {
+        RELEASE_ASSERT_NOT_REACHED();
+    }
 };
 
 TEST(FontCache, getLastResortFallbackFont)
@@ -24,7 +27,9 @@
     FontCache* fontCache = FontCache::fontCache();
     ASSERT_TRUE(fontCache);
 
-    EmptyPlatform platform;
+    Platform* oldPlatform = Platform::current();
+    OwnPtr<EmptyPlatform> platform = adoptPtr(new EmptyPlatform);
+    Platform::initialize(platform.get());
 
     FontDescription fontDescription;
     fontDescription.setGenericFamily(FontDescription::StandardFamily);
@@ -34,6 +39,8 @@
     fontDescription.setGenericFamily(FontDescription::SansSerifFamily);
     fontData = fontCache->getLastResortFallbackFont(fontDescription, Retain);
     EXPECT_TRUE(fontData);
+
+    Platform::initialize(oldPlatform);
 }
 
 } // namespace blink
diff --git a/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp b/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp
index e504997a..4187ec2b 100644
--- a/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/RecordingImageBufferSurfaceTest.cpp
@@ -9,7 +9,6 @@
 #include "platform/graphics/ImageBuffer.h"
 #include "platform/graphics/ImageBufferClient.h"
 #include "platform/graphics/UnacceleratedImageBufferSurface.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebTaskRunner.h"
 #include "public/platform/WebThread.h"
@@ -237,13 +236,24 @@
 // for the current thread. The Mock thread is capable of queuing a single non-delayed task
 // and registering a single task observer. The run loop exits immediately after running
 // the single task.
-
-class CurrentThreadPlatformMock : public TestingPlatformSupport {
+class AutoInstallCurrentThreadPlatformMock {
 public:
-    CurrentThreadPlatformMock() { }
-    WebThread* currentThread() override { return &m_currentThread; }
+    AutoInstallCurrentThreadPlatformMock()
+    {
+        m_oldPlatform = Platform::current();
+        Platform::initialize(&m_mockPlatform);
+    }
 
-    void enterRunLoop() { m_currentThread.enterRunLoop(); }
+    ~AutoInstallCurrentThreadPlatformMock()
+    {
+        Platform::initialize(m_oldPlatform);
+    }
+
+    void enterRunLoop()
+    {
+        m_mockPlatform.enterRunLoop();
+    }
+
 private:
     class MockWebTaskRunner : public WebTaskRunner {
     public:
@@ -325,7 +335,22 @@
         TaskObserver* m_taskObserver;
     };
 
-    CurrentThreadMock m_currentThread;
+    class CurrentThreadPlatformMock : public Platform {
+    public:
+        CurrentThreadPlatformMock() { }
+        virtual void cryptographicallyRandomValues(unsigned char* buffer, size_t length)
+        {
+            RELEASE_ASSERT_NOT_REACHED();
+        }
+        WebThread* currentThread() override { return &m_currentThread; }
+
+        void enterRunLoop() { m_currentThread.enterRunLoop(); }
+    private:
+        CurrentThreadMock m_currentThread;
+    };
+
+    CurrentThreadPlatformMock m_mockPlatform;
+    Platform* m_oldPlatform;
 };
 
 } // anonymous namespace
@@ -341,7 +366,7 @@
 
 #define CALL_TEST_TASK_WRAPPER(TEST_METHOD)                                                               \
     {                                                                                                     \
-        CurrentThreadPlatformMock ctpm;                                                                   \
+        AutoInstallCurrentThreadPlatformMock ctpm;                                                        \
         Platform::current()->currentThread()->taskRunner()->postTask(BLINK_FROM_HERE, new TestWrapperTask_ ## TEST_METHOD(this)); \
         ctpm.enterRunLoop();                                      \
     }
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
index 9a30edeb..764adbeb 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
+++ b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.cpp
@@ -1976,16 +1976,16 @@
     return true;
 }
 
-GLenum WebGLImageConversion::computeImageSizeInBytes(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, unsigned* imageSizeInBytes, unsigned* paddingInBytes)
+GLenum WebGLImageConversion::computeImageSizeInBytes(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLint alignment, unsigned* imageSizeInBytes, unsigned* paddingInBytes)
 {
     ASSERT(imageSizeInBytes);
     ASSERT(alignment == 1 || alignment == 2 || alignment == 4 || alignment == 8);
-    if (width < 0 || height < 0)
+    if (width < 0 || height < 0 || depth < 0)
         return GL_INVALID_VALUE;
     unsigned bytesPerComponent, componentsPerPixel;
     if (!computeFormatAndTypeParameters(format, type, &bytesPerComponent, &componentsPerPixel))
         return GL_INVALID_ENUM;
-    if (!width || !height) {
+    if (!width || !height || !depth) {
         *imageSizeInBytes = 0;
         if (paddingInBytes)
             *paddingInBytes = 0;
@@ -2003,7 +2003,7 @@
         checkedValue += padding;
     }
     // Last row needs no padding.
-    checkedValue *= (height - 1);
+    checkedValue *= (height * depth - 1);
     checkedValue += validRowSize;
     if (!checkedValue.isValid())
         return GL_INVALID_VALUE;
@@ -2206,7 +2206,7 @@
 
     unsigned packedSize;
     // Output data is tightly packed (alignment == 1).
-    if (computeImageSizeInBytes(format, type, width, height, 1, &packedSize, 0) != GL_NO_ERROR)
+    if (computeImageSizeInBytes(format, type, width, height, 1, 1, &packedSize, 0) != GL_NO_ERROR)
         return false;
     data.resize(packedSize);
 
@@ -2233,7 +2233,7 @@
 
     unsigned packedSize;
     // Output data is tightly packed (alignment == 1).
-    if (computeImageSizeInBytes(format, type, width, height, 1, &packedSize, 0) != GL_NO_ERROR)
+    if (computeImageSizeInBytes(format, type, width, height, 1, 1, &packedSize, 0) != GL_NO_ERROR)
         return false;
     data.resize(packedSize);
 
diff --git a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h
index 8275f21..cd276ed 100644
--- a/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h
+++ b/third_party/WebKit/Source/platform/graphics/gpu/WebGLImageConversion.h
@@ -148,9 +148,9 @@
     // Computes the image size in bytes. If paddingInBytes is not null, padding
     // is also calculated in return. Returns NO_ERROR if succeed, otherwise
     // return the suggested GL error indicating the cause of the failure:
-    //   INVALID_VALUE if width/height is negative or overflow happens.
+    //   INVALID_VALUE if width/height/depth is negative or overflow happens.
     //   INVALID_ENUM if format/type is illegal.
-    static GLenum computeImageSizeInBytes(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, unsigned* imageSizeInBytes, unsigned* paddingInBytes);
+    static GLenum computeImageSizeInBytes(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLint alignment, unsigned* imageSizeInBytes, unsigned* paddingInBytes);
 
     // Check if the format is one of the formats from the ImageData or DOM elements.
     // The formats from ImageData is always RGBA8.
diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableAreaTest.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableAreaTest.cpp
index 13487d83..c7800f7 100644
--- a/third_party/WebKit/Source/platform/scroll/ScrollableAreaTest.cpp
+++ b/third_party/WebKit/Source/platform/scroll/ScrollableAreaTest.cpp
@@ -5,7 +5,7 @@
 #include "config.h"
 #include "platform/scroll/ScrollableArea.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
+#include "platform/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "public/platform/WebScheduler.h"
 #include "public/platform/WebThread.h"
@@ -86,7 +86,7 @@
 // We need just enough scaffolding for the Timer constructor to not segfault.
 class FakePlatform : public TestingPlatformSupport {
 public:
-    FakePlatform() { }
+    FakePlatform() : TestingPlatformSupport(TestingPlatformSupport::Config()) { }
     ~FakePlatform() override { }
 
     WebThread* currentThread() override
diff --git a/third_party/WebKit/Source/platform/testing/RunAllTests.cpp b/third_party/WebKit/Source/platform/testing/RunAllTests.cpp
index 3cf424c..a3d9a40fe6 100644
--- a/third_party/WebKit/Source/platform/testing/RunAllTests.cpp
+++ b/third_party/WebKit/Source/platform/testing/RunAllTests.cpp
@@ -31,8 +31,8 @@
 #include "config.h"
 
 #include "platform/EventTracer.h"
+#include "platform/TestingPlatformSupport.h"
 #include "platform/heap/Heap.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "wtf/CryptographicallyRandomNumber.h"
 #include "wtf/MainThread.h"
 #include "wtf/Partitions.h"
diff --git a/third_party/WebKit/Source/platform/text/LocaleMacTest.cpp b/third_party/WebKit/Source/platform/text/LocaleMacTest.cpp
index 05469d8..d28c72b 100644
--- a/third_party/WebKit/Source/platform/text/LocaleMacTest.cpp
+++ b/third_party/WebKit/Source/platform/text/LocaleMacTest.cpp
@@ -27,7 +27,7 @@
 #include "platform/text/LocaleMac.h"
 
 #include "platform/DateComponents.h"
-#include "platform/testing/TestingPlatformSupport.h"
+#include "platform/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "wtf/DateMath.h"
@@ -39,6 +39,8 @@
 
 class LocalePlatformSupport : public TestingPlatformSupport {
 public:
+    LocalePlatformSupport() : TestingPlatformSupport(TestingPlatformSupport::Config()) { }
+
     WebString queryLocalizedString(WebLocalizedString::Name /*name*/) override
     {
         return WebString::fromUTF8("Week $2, $1");
diff --git a/third_party/WebKit/Source/platform/weborigin/OriginAccessEntryTest.cpp b/third_party/WebKit/Source/platform/weborigin/OriginAccessEntryTest.cpp
index 49ea30e7..549248e 100644
--- a/third_party/WebKit/Source/platform/weborigin/OriginAccessEntryTest.cpp
+++ b/third_party/WebKit/Source/platform/weborigin/OriginAccessEntryTest.cpp
@@ -31,7 +31,6 @@
 #include "config.h"
 #include "platform/weborigin/OriginAccessEntry.h"
 
-#include "platform/testing/TestingPlatformSupport.h"
 #include "platform/weborigin/KURL.h"
 #include "platform/weborigin/SecurityOrigin.h"
 #include "public/platform/Platform.h"
@@ -56,19 +55,43 @@
     size_t m_length;
 };
 
-class OriginAccessEntryTestPlatform : public TestingPlatformSupport {
+class OriginAccessEntryTestPlatform : public blink::Platform {
 public:
+    OriginAccessEntryTestPlatform()
+        : m_oldPlatform(Platform::current())
+    {
+        Platform::initialize(this);
+    }
+
+    ~OriginAccessEntryTestPlatform()
+    {
+        Platform::initialize(m_oldPlatform);
+    }
+
     blink::WebPublicSuffixList* publicSuffixList() override
     {
         return &m_suffixList;
     }
 
+    // Stub for pure virtual method.
+    void cryptographicallyRandomValues(unsigned char*, size_t) override
+    {
+        RELEASE_ASSERT_NOT_REACHED();
+    }
+
+    const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+    {
+        static const unsigned char tracingIsDisabled = 0;
+        return &tracingIsDisabled;
+    }
+
     void setPublicSuffix(const blink::WebString& suffix)
     {
         m_suffixList.setPublicSuffix(suffix);
     }
 
 private:
+    blink::Platform* m_oldPlatform;
     OriginAccessEntryTestSuffixList m_suffixList;
 };
 
@@ -290,3 +313,4 @@
 }
 
 } // namespace blink
+
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn
index f19d290..7bb2b71f 100644
--- a/third_party/WebKit/Source/web/BUILD.gn
+++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -111,7 +111,6 @@
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/WebKit/Source/platform:test_support",
-    "//third_party/WebKit/Source/wtf",
     "//third_party/WebKit/Source/wtf:test_support",
     "//third_party/libwebp",
     "//third_party/zlib",
diff --git a/third_party/WebKit/Source/web/ImageDecodeBench.cpp b/third_party/WebKit/Source/web/ImageDecodeBench.cpp
index 41c3870..988f2e8f 100644
--- a/third_party/WebKit/Source/web/ImageDecodeBench.cpp
+++ b/third_party/WebKit/Source/web/ImageDecodeBench.cpp
@@ -25,7 +25,6 @@
 
 #include "platform/SharedBuffer.h"
 #include "platform/image-decoders/ImageDecoder.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "public/platform/Platform.h"
 #include "public/web/WebKit.h"
 #include "wtf/OwnPtr.h"
@@ -361,8 +360,18 @@
 
     // Create a web platform without V8.
 
-    class WebPlatform : public TestingPlatformSupport {
+    class WebPlatform : public blink::Platform {
     public:
+        const unsigned char* getTraceCategoryEnabledFlag(const char*) override
+        {
+            return reinterpret_cast<const unsigned char *>("nope-none-nada");
+        }
+
+        void cryptographicallyRandomValues(unsigned char*, size_t) override
+        {
+            RELEASE_ASSERT_NOT_REACHED();
+        }
+
         void screenColorProfile(WebVector<char>* profile) override
         {
             getScreenColorProfile(profile); // Returns a whacked color profile.
diff --git a/third_party/WebKit/Source/web/tests/TextFinderTest.cpp b/third_party/WebKit/Source/web/tests/TextFinderTest.cpp
index d3260d1..a9ebd81 100644
--- a/third_party/WebKit/Source/web/tests/TextFinderTest.cpp
+++ b/third_party/WebKit/Source/web/tests/TextFinderTest.cpp
@@ -14,7 +14,6 @@
 #include "core/html/HTMLElement.h"
 #include "core/layout/TextAutosizer.h"
 #include "core/page/Page.h"
-#include "platform/testing/TestingPlatformSupport.h"
 #include "platform/testing/UnitTestHelpers.h"
 #include "public/platform/Platform.h"
 #include "public/web/WebDocument.h"
@@ -30,15 +29,7 @@
 
 class TextFinderTest : public ::testing::Test {
 protected:
-    TextFinderTest()
-    {
-        m_webViewHelper.initialize();
-        WebLocalFrameImpl& frameImpl = *m_webViewHelper.webViewImpl()->mainFrameImpl();
-        frameImpl.viewImpl()->resize(WebSize(640, 480));
-        frameImpl.viewImpl()->updateAllLifecyclePhases();
-        m_document = PassRefPtrWillBeRawPtr<Document>(frameImpl.document());
-        m_textFinder = &frameImpl.ensureTextFinder();
-    }
+    void SetUp() override;
 
     Document& document() const;
     TextFinder& textFinder() const;
@@ -51,6 +42,16 @@
     RawPtrWillBePersistent<TextFinder> m_textFinder;
 };
 
+void TextFinderTest::SetUp()
+{
+    m_webViewHelper.initialize();
+    WebLocalFrameImpl& frameImpl = *m_webViewHelper.webViewImpl()->mainFrameImpl();
+    frameImpl.viewImpl()->resize(WebSize(640, 480));
+    frameImpl.viewImpl()->updateAllLifecyclePhases();
+    m_document = PassRefPtrWillBeRawPtr<Document>(frameImpl.document());
+    m_textFinder = &frameImpl.ensureTextFinder();
+}
+
 Document& TextFinderTest::document() const
 {
     return *m_document;
@@ -397,19 +398,41 @@
 
 class TextFinderFakeTimerTest : public TextFinderTest {
 protected:
+    void SetUp() override;
+    void TearDown() override;
+
     // A simple platform that mocks out the clock.
-    class TimeProxyPlatform : public TestingPlatformSupport {
+    class TimeProxyPlatform : public Platform {
     public:
         TimeProxyPlatform()
-            : m_timeCounter(m_oldPlatform->currentTimeSeconds())
+            : m_timeCounter(0.)
+            , m_fallbackPlatform(0)
+        { }
+
+        void install()
         {
+            // Check that the proxy wasn't installed yet.
+            ASSERT_NE(Platform::current(), this);
+            m_fallbackPlatform = Platform::current();
+            m_timeCounter = m_fallbackPlatform->currentTimeSeconds();
+            Platform::initialize(this);
+            ASSERT_EQ(Platform::current(), this);
+        }
+
+        void remove()
+        {
+            // Check that the proxy was installed.
+            ASSERT_EQ(Platform::current(), this);
+            Platform::initialize(m_fallbackPlatform);
+            ASSERT_EQ(Platform::current(), m_fallbackPlatform);
+            m_fallbackPlatform = 0;
         }
 
     private:
         Platform& ensureFallback()
         {
-            ASSERT(m_oldPlatform);
-            return *m_oldPlatform;
+            ASSERT(m_fallbackPlatform);
+            return *m_fallbackPlatform;
         }
 
         // From blink::Platform:
@@ -418,22 +441,47 @@
             return ++m_timeCounter;
         }
 
+        // These blink::Platform methods must be overriden to make a usable object.
+        void cryptographicallyRandomValues(unsigned char* buffer, size_t length) override
+        {
+            ensureFallback().cryptographicallyRandomValues(buffer, length);
+        }
+
+        const unsigned char* getTraceCategoryEnabledFlag(const char* categoryName) override
+        {
+            return ensureFallback().getTraceCategoryEnabledFlag(categoryName);
+        }
+
         // These two methods allow timers to work correctly.
         double monotonicallyIncreasingTimeSeconds() override
         {
             return ensureFallback().monotonicallyIncreasingTimeSeconds();
         }
 
+        WebThread* currentThread() override { return ensureFallback().currentThread(); }
         WebUnitTestSupport* unitTestSupport() override { return ensureFallback().unitTestSupport(); }
         WebString defaultLocale() override { return ensureFallback().defaultLocale(); }
         WebCompositorSupport* compositorSupport() override { return ensureFallback().compositorSupport(); }
 
         double m_timeCounter;
+        Platform* m_fallbackPlatform;
     };
 
     TimeProxyPlatform m_proxyTimePlatform;
 };
 
+void TextFinderFakeTimerTest::SetUp()
+{
+    TextFinderTest::SetUp();
+    m_proxyTimePlatform.install();
+}
+
+void TextFinderFakeTimerTest::TearDown()
+{
+    m_proxyTimePlatform.remove();
+    TextFinderTest::TearDown();
+}
+
 TEST_F(TextFinderFakeTimerTest, ScopeWithTimeouts)
 {
     // Make a long string.
diff --git a/third_party/WebKit/Source/web/web_tests.gyp b/third_party/WebKit/Source/web/web_tests.gyp
index acb59dc..98807e31 100644
--- a/third_party/WebKit/Source/web/web_tests.gyp
+++ b/third_party/WebKit/Source/web/web_tests.gyp
@@ -49,7 +49,6 @@
                 '../../public/blink.gyp:blink',
                 '../config.gyp:unittest_config',
                 '../platform/blink_platform_tests.gyp:blink_platform_test_support',
-                '../wtf/wtf.gyp:wtf',
                 '../wtf/wtf_tests.gyp:wtf_unittest_helpers',
                 'web.gyp:blink_web_test_support',
                 '<(DEPTH)/base/base.gyp:base',
diff --git a/third_party/libjingle/README.chromium b/third_party/libjingle/README.chromium
index 781d381f..012ba69 100644
--- a/third_party/libjingle/README.chromium
+++ b/third_party/libjingle/README.chromium
@@ -1,7 +1,7 @@
 Name: libjingle
 URL: http://www.webrtc.org
 Version: unknown
-Revision: 10725
+Revision: 10735
 License: BSD
 License File: source/talk/COPYING
 Security Critical: yes
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index fa9dd82..14d6ae9 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -52,7 +52,6 @@
     'gyp_official_goma_minimal_symbols_android_arm64': ['gyp', 'official', 'goma', 'minimal_symbols', 'android', 'arm64'],
     'gyp_official_goma_minimal_symbols_x64': ['gyp', 'official', 'goma', 'minimal_symbols', 'x64'],
     'gyp_official_goma_minimal_symbols_x86': ['gyp', 'official', 'goma', 'minimal_symbols', 'x86'],
-    'gyp_release_bot_arm': ['gyp', 'release_bot', 'arm', 'crosscompile'],
     'gyp_release_trybot': ['gyp', 'release_trybot'],
     'gyp_release_trybot_x64': ['gyp', 'release_trybot', 'x64'],
     'libfuzzer_upload_bot': ['gn', 'release', 'libfuzzer', 'asan', 'proprietary_codecs'],
@@ -78,8 +77,8 @@
     'swarming_gyp_debug_bot_no_symbols_x86': ['swarming', 'gyp', 'debug_bot', 'no_symbols', 'x86'],
     'swarming_gyp_debug_trybot_x86': ['swarming', 'gyp', 'debug_trybot', 'x86'],
     'swarming_gyp_release_bot': ['swarming', 'gyp', 'release_bot'],
+    'swarming_gyp_release_bot_arm': ['swarming', 'gyp', 'release_bot', 'arm', 'crosscompile'],
     'swarming_gyp_release_trybot_arm': ['swarming', 'gyp', 'release_trybot', 'arm', 'crosscompile'],
-    'swarming_gyp_release_trybot_arm_float': ['swarming', 'gyp', 'release_trybot', 'arm_float', 'crosscompile'],
     'swarming_tsan_gyp_release_trybot': ['swarming', 'disable_nacl', 'tsan', 'gyp', 'release_trybot'],
 
     # clang/win doesn't work with goma yet, so this can't use debug_bot:
@@ -127,11 +126,6 @@
       'gyp_defines': 'target_arch=arm64',
     },
 
-    'arm_float': {
-      'gn_args': 'error',
-      'gyp_defines': 'target_arch=arm arm_float_abi=hard',
-    },
-
     'arm64': {
       'gn_args': 'target_cpu="arm64"',
       'gyp_defines': 'target_arch=arm64',
@@ -387,11 +381,11 @@
     },
     'chromium.linux': {
       'Linux Builder': 'swarming_gn_release_bot',
-      'Linux Tests': 'swarming_gn_release_bot',
+      'Linux Tests': 'none',
       'Linux Builder (dbg)(32)': 'swarming_gyp_debug_bot_no_symbols_x86',
-      'Linux Tests (dbg)(1)(32)': 'swarming_gyp_debug_bot_no_symbols_x86',
+      'Linux Tests (dbg)(1)(32)': 'none',
       'Linux Builder (dbg)': 'swarming_gn_debug_bot',
-      'Linux Tests (dbg)(1)': 'swarming_gn_debug_bot',
+      'Linux Tests (dbg)(1)': 'none',
       'Linux GN': 'gn_release_bot',
       'Linux GN Clobber': 'gn_release_bot',
       'Linux GN (dbg)': 'gn_debug_bot',
@@ -445,7 +439,7 @@
       'Libfuzzer Upload Linux': 'libfuzzer_upload_bot',
       'Site Isolation Linux': 'gn_release_trybot',
       'Site Isolation Win': 'gyp_release_trybot_x64',
-      'Linux ARM': 'gyp_release_bot_arm',
+      'Linux ARM': 'swarming_gyp_release_bot_arm',
     },
     'chromium.webrtc.fyi': {
       'Android GN': 'android_gn_release_bot',
@@ -507,8 +501,6 @@
       'linux_chromium_tsan_rel_ng': 'swarming_tsan_gyp_release_trybot',
       'linux_chromium_practice_rel_ng': 'gyp_release_trybot',
       'linux_arm_compile': 'swarming_gyp_release_trybot_arm',
-      'linux_arm': 'swarming_gyp_release_trybot_arm_float',
-      'linux_arm_tester': 'none',
       'linux_chromium_compile_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
       'linux_chromium_dbg_32_ng': 'swarming_gyp_debug_trybot_x86',
       'linux_chromium_archive_rel_ng': 'noswarming_gyp_release_bot_linux_dump_symbols',