Merge from Chromium at DEPS revision 269467

This commit was generated by merge_to_master.py.

Change-Id: Id6c03d44b5ad8b098017a943eb9ec8d804dfed99
diff --git a/content/browser/android/browser_jni_registrar.cc b/content/browser/android/browser_jni_registrar.cc
index 60221e9..c93cc91 100644
--- a/content/browser/android/browser_jni_registrar.cc
+++ b/content/browser/android/browser_jni_registrar.cc
@@ -10,6 +10,7 @@
 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
 #include "content/browser/android/browser_startup_controller.h"
 #include "content/browser/android/child_process_launcher_android.h"
+#include "content/browser/android/content_readback_handler.h"
 #include "content/browser/android/content_settings.h"
 #include "content/browser/android/content_video_view.h"
 #include "content/browser/android/content_view_core_impl.h"
@@ -51,6 +52,8 @@
      content::RegisterBrowserAccessibilityManager},
     {"BrowserStartupController", content::RegisterBrowserStartupController},
     {"ChildProcessLauncher", content::RegisterChildProcessLauncher},
+    {"ContentReadbackHandler",
+     content::ContentReadbackHandler::RegisterContentReadbackHandler},
     {"ContentSettings", content::ContentSettings::RegisterContentSettings},
     {"ContentVideoView", content::ContentVideoView::RegisterContentVideoView},
     {"ContentViewCore", content::RegisterContentViewCore},
diff --git a/content/browser/android/content_readback_handler.cc b/content/browser/android/content_readback_handler.cc
new file mode 100644
index 0000000..432b230
--- /dev/null
+++ b/content/browser/android/content_readback_handler.cc
@@ -0,0 +1,76 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/android/content_readback_handler.h"
+
+#include "base/android/jni_android.h"
+#include "base/bind.h"
+#include "content/browser/android/content_view_core_impl.h"
+#include "jni/ContentReadbackHandler_jni.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/android/java_bitmap.h"
+#include "ui/gfx/rect.h"
+
+namespace content {
+
+// static
+bool ContentReadbackHandler::RegisterContentReadbackHandler(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+ContentReadbackHandler::ContentReadbackHandler(JNIEnv* env, jobject obj)
+    : weak_factory_(this) {
+  java_obj_.Reset(env, obj);
+}
+
+ContentReadbackHandler::~ContentReadbackHandler() {}
+
+void ContentReadbackHandler::Destroy(JNIEnv* env, jobject obj) {
+  delete this;
+}
+
+void ContentReadbackHandler::OnFinishContentReadback(int readback_id,
+                                                     bool success,
+                                                     const SkBitmap& bitmap) {
+  JNIEnv* env = base::android::AttachCurrentThread();
+  ScopedJavaLocalRef<jobject> java_bitmap;
+  if (success)
+    java_bitmap = gfx::ConvertToJavaBitmap(&bitmap);
+
+  Java_ContentReadbackHandler_notifyGetContentBitmapFinished(
+      env, java_obj_.obj(), readback_id, success, java_bitmap.obj());
+}
+
+void ContentReadbackHandler::GetContentBitmap(JNIEnv* env,
+                                              jobject obj,
+                                              jint readback_id,
+                                              jfloat scale,
+                                              jobject config,
+                                              jfloat x,
+                                              jfloat y,
+                                              jfloat width,
+                                              jfloat height,
+                                              jobject content_view_core) {
+  ContentViewCore* view =
+      ContentViewCore::GetNativeContentViewCore(env, content_view_core);
+  DCHECK(view);
+
+  base::Callback<void(bool, const SkBitmap&)> result_callback =
+      base::Bind(&ContentReadbackHandler::OnFinishContentReadback,
+                 weak_factory_.GetWeakPtr(),
+                 readback_id);
+
+  view->GetScaledContentBitmap(
+      scale, config, gfx::Rect(x, y, width, height), result_callback);
+  return;
+}
+
+// static
+static jlong Init(JNIEnv* env, jobject obj) {
+  ContentReadbackHandler* content_readback_handler =
+      new ContentReadbackHandler(env, obj);
+  return reinterpret_cast<intptr_t>(content_readback_handler);
+}
+
+}  // namespace content
diff --git a/content/browser/android/content_readback_handler.h b/content/browser/android/content_readback_handler.h
new file mode 100644
index 0000000..11d5aa3
--- /dev/null
+++ b/content/browser/android/content_readback_handler.h
@@ -0,0 +1,54 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_ANDROID_CONTENT_READBACK_HANDLER_H_
+#define CONTENT_BROWSER_ANDROID_CONTENT_READBACK_HANDLER_H_
+
+#include <jni.h>
+
+#include "base/android/jni_weak_ref.h"
+#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
+
+class SkBitmap;
+
+namespace content {
+
+// Native side of the ContentReadbackHandler.java, which issues content
+// readbacks from the Java side.
+class ContentReadbackHandler {
+ public:
+  // Registers the JNI methods for ContentViewRender.
+  static bool RegisterContentReadbackHandler(JNIEnv* env);
+
+  // Methods called from Java via JNI -----------------------------------------
+  ContentReadbackHandler(JNIEnv* env, jobject obj);
+  void Destroy(JNIEnv* env, jobject obj);
+  void GetContentBitmap(JNIEnv* env,
+                        jobject obj,
+                        jint readback_id,
+                        jfloat scale,
+                        jobject config,
+                        jfloat x,
+                        jfloat y,
+                        jfloat width,
+                        jfloat height,
+                        jobject content_view_core);
+
+ private:
+  virtual ~ContentReadbackHandler();
+
+  void OnFinishContentReadback(int readback_id,
+                               bool success,
+                               const SkBitmap& bitmap);
+
+  base::android::ScopedJavaGlobalRef<jobject> java_obj_;
+  base::WeakPtrFactory<ContentReadbackHandler> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentReadbackHandler);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ANDROID_CONTENT_READBACK_HANDLER_H_
diff --git a/content/browser/android/content_view_render_view.cc b/content/browser/android/content_view_render_view.cc
index 9f5ed31..efda29d 100644
--- a/content/browser/android/content_view_render_view.cc
+++ b/content/browser/android/content_view_render_view.cc
@@ -127,15 +127,6 @@
   return buffers_swapped_during_composite_;
 }
 
-jboolean ContentViewRenderView::CompositeToBitmap(JNIEnv* env, jobject obj,
-                                                  jobject java_bitmap) {
-  gfx::JavaBitmap bitmap(java_bitmap);
-  if (!compositor_ || bitmap.format() != ANDROID_BITMAP_FORMAT_RGBA_8888)
-    return false;
-  return compositor_->CompositeAndReadback(bitmap.pixels(),
-                                           gfx::Rect(bitmap.size()));
-}
-
 void ContentViewRenderView::SetOverlayVideoMode(
     JNIEnv* env, jobject obj, bool enabled) {
   compositor_->SetHasTransparentBackground(enabled);
diff --git a/content/browser/android/content_view_render_view.h b/content/browser/android/content_view_render_view.h
index 8f14456..21e79ea 100644
--- a/content/browser/android/content_view_render_view.h
+++ b/content/browser/android/content_view_render_view.h
@@ -40,7 +40,6 @@
   void SurfaceChanged(JNIEnv* env, jobject obj,
                       jint format, jint width, jint height, jobject surface);
   jboolean Composite(JNIEnv* env, jobject obj);
-  jboolean CompositeToBitmap(JNIEnv* env, jobject obj, jobject java_bitmap);
   void SetOverlayVideoMode(JNIEnv* env, jobject obj, bool enabled);
 
   // CompositorClient ---------------------------------------------------------
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index acfe613..eddedf4 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -29,7 +29,7 @@
 
 void DelegatedFrameHostClient::RequestCopyOfOutput(
     scoped_ptr<cc::CopyOutputRequest> request) {
-  return GetDelegatedFrameHost()->RequestCopyOfOutput(request.Pass());
+  GetDelegatedFrameHost()->RequestCopyOfOutput(request.Pass());
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 16f600a..42091ff 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -222,6 +222,10 @@
   return HostSharedBitmapManager::current();
 }
 
+ui::ContextFactory* GpuProcessTransportFactory::GetContextFactory() {
+  return this;
+}
+
 gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() {
   gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle(
       gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT);
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h
index 0bd5c05..3fdeefa 100644
--- a/content/browser/compositor/gpu_process_transport_factory.h
+++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -49,6 +49,7 @@
   virtual cc::SharedBitmapManager* GetSharedBitmapManager() OVERRIDE;
 
   // ImageTransportFactory implementation.
+  virtual ui::ContextFactory* GetContextFactory() OVERRIDE;
   virtual gfx::GLSurfaceHandle GetSharedSurfaceHandle() OVERRIDE;
   virtual GLHelper* GetGLHelper() OVERRIDE;
   virtual void AddObserver(ImageTransportFactoryObserver* observer) OVERRIDE;
diff --git a/content/browser/compositor/image_transport_factory.cc b/content/browser/compositor/image_transport_factory.cc
index aa6e532..0827acb 100644
--- a/content/browser/compositor/image_transport_factory.cc
+++ b/content/browser/compositor/image_transport_factory.cc
@@ -17,6 +17,12 @@
 ImageTransportFactory* g_factory = NULL;
 bool g_initialized_for_unit_tests = false;
 static gfx::DisableNullDrawGLBindings* g_disable_null_draw = NULL;
+
+void SetFactory(ImageTransportFactory* factory) {
+  g_factory = factory;
+  ui::ContextFactory::SetInstance(factory->GetContextFactory());
+}
+
 }
 
 // static
@@ -24,9 +30,7 @@
   DCHECK(!g_factory || g_initialized_for_unit_tests);
   if (g_initialized_for_unit_tests)
     return;
-  GpuProcessTransportFactory* factory = new GpuProcessTransportFactory;
-  g_factory = factory;
-  ui::ContextFactory::SetInstance(factory);
+  SetFactory(new GpuProcessTransportFactory);
 }
 
 void ImageTransportFactory::InitializeForUnitTests(
@@ -39,10 +43,7 @@
   if (command_line->HasSwitch(switches::kEnablePixelOutputInTests))
     g_disable_null_draw = new gfx::DisableNullDrawGLBindings;
 
-  NoTransportImageTransportFactory* factory =
-      new NoTransportImageTransportFactory(test_factory.Pass());
-  g_factory = factory;
-  ui::ContextFactory::SetInstance(factory->context_factory());
+  SetFactory(new NoTransportImageTransportFactory(test_factory.Pass()));
 }
 
 // static
diff --git a/content/browser/compositor/image_transport_factory.h b/content/browser/compositor/image_transport_factory.h
index 5910461..2a421bb 100644
--- a/content/browser/compositor/image_transport_factory.h
+++ b/content/browser/compositor/image_transport_factory.h
@@ -64,6 +64,9 @@
   // Gets the factory instance.
   static ImageTransportFactory* GetInstance();
 
+  // Gets the image transport factory as a context factory for the compositor.
+  virtual ui::ContextFactory* GetContextFactory() = 0;
+
   virtual gfx::GLSurfaceHandle GetSharedSurfaceHandle() = 0;
 
   // Gets a GLHelper instance, associated with the shared context. This
diff --git a/content/browser/compositor/no_transport_image_transport_factory.cc b/content/browser/compositor/no_transport_image_transport_factory.cc
index db0a5ab..c6ef3f8 100644
--- a/content/browser/compositor/no_transport_image_transport_factory.cc
+++ b/content/browser/compositor/no_transport_image_transport_factory.cc
@@ -17,6 +17,10 @@
 
 NoTransportImageTransportFactory::~NoTransportImageTransportFactory() {}
 
+ui::ContextFactory* NoTransportImageTransportFactory::GetContextFactory() {
+  return context_factory_.get();
+}
+
 gfx::GLSurfaceHandle
 NoTransportImageTransportFactory::GetSharedSurfaceHandle() {
   return gfx::GLSurfaceHandle();
diff --git a/content/browser/compositor/no_transport_image_transport_factory.h b/content/browser/compositor/no_transport_image_transport_factory.h
index 51ae292..1111cd1 100644
--- a/content/browser/compositor/no_transport_image_transport_factory.h
+++ b/content/browser/compositor/no_transport_image_transport_factory.h
@@ -22,13 +22,12 @@
   virtual ~NoTransportImageTransportFactory();
 
   // ImageTransportFactory implementation.
+  virtual ui::ContextFactory* GetContextFactory() OVERRIDE;
   virtual gfx::GLSurfaceHandle GetSharedSurfaceHandle() OVERRIDE;
   virtual GLHelper* GetGLHelper() OVERRIDE;
   virtual void AddObserver(ImageTransportFactoryObserver* observer) OVERRIDE;
   virtual void RemoveObserver(ImageTransportFactoryObserver* observer) OVERRIDE;
 
-  ui::ContextFactory* context_factory() { return context_factory_.get(); }
-
  private:
   scoped_ptr<ui::ContextFactory> context_factory_;
   scoped_refptr<cc::ContextProvider> context_provider_;
diff --git a/content/browser/context_factory.cc b/content/browser/context_factory.cc
new file mode 100644
index 0000000..b9dfacc
--- /dev/null
+++ b/content/browser/context_factory.cc
@@ -0,0 +1,16 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/context_factory.h"
+
+#include "content/browser/compositor/image_transport_factory.h"
+
+namespace content {
+
+ui::ContextFactory* GetContextFactory() {
+  DCHECK(ImageTransportFactory::GetInstance());
+  return ImageTransportFactory::GetInstance()->GetContextFactory();
+}
+
+}  // namespace content
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc
index f5c5c65..446e9e2 100644
--- a/content/browser/media/capture/desktop_capture_device.cc
+++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -7,11 +7,13 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/metrics/field_trial.h"
 #include "base/metrics/histogram.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/thread.h"
 #include "content/browser/media/capture/desktop_capture_device_uma_types.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/desktop_media_id.h"
@@ -52,6 +54,7 @@
       public webrtc::DesktopCapturer::Callback {
  public:
   Core(scoped_refptr<base::SequencedTaskRunner> task_runner,
+       scoped_ptr<base::Thread> thread,
        scoped_ptr<webrtc::DesktopCapturer> capturer,
        DesktopMediaID::Type type);
 
@@ -96,6 +99,9 @@
   // Task runner used for capturing operations.
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
+  // The thread on which the capturer is running.
+  scoped_ptr<base::Thread> thread_;
+
   // The underlying DesktopCapturer instance used to capture frames.
   scoped_ptr<webrtc::DesktopCapturer> desktop_capturer_;
 
@@ -136,13 +142,18 @@
 
 DesktopCaptureDevice::Core::Core(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
+    scoped_ptr<base::Thread> thread,
     scoped_ptr<webrtc::DesktopCapturer> capturer,
     DesktopMediaID::Type type)
     : task_runner_(task_runner),
+      thread_(thread.Pass()),
       desktop_capturer_(capturer.Pass()),
       capture_task_posted_(false),
       capture_in_progress_(false),
       capturer_type_(type) {
+  DCHECK(!task_runner_.get() || !thread_.get());
+  if (thread_.get())
+    task_runner_ = thread_->message_loop_proxy();
 }
 
 DesktopCaptureDevice::Core::~Core() {
@@ -396,11 +407,7 @@
 // static
 scoped_ptr<media::VideoCaptureDevice> DesktopCaptureDevice::Create(
     const DesktopMediaID& source) {
-  scoped_refptr<base::SequencedWorkerPool> blocking_pool =
-      BrowserThread::GetBlockingPool();
-  scoped_refptr<base::SequencedTaskRunner> task_runner =
-      blocking_pool->GetSequencedTaskRunner(
-          blocking_pool->GetSequenceToken());
+  scoped_ptr<base::Thread> ui_thread;
 
   webrtc::DesktopCaptureOptions options =
       webrtc::DesktopCaptureOptions::CreateDefault();
@@ -412,6 +419,22 @@
   switch (source.type) {
     case DesktopMediaID::TYPE_SCREEN: {
       scoped_ptr<webrtc::ScreenCapturer> screen_capturer;
+
+#if defined(OS_WIN)
+      bool magnification_allowed =
+          base::FieldTrialList::FindFullName("ScreenCaptureUseMagnification") ==
+          "Enabled";
+
+      if (magnification_allowed) {
+        // The magnification capturer requires running on a dedicated UI thread.
+        ui_thread.reset(new base::Thread("screenCaptureUIThread"));
+        base::Thread::Options thread_options(base::MessageLoop::TYPE_UI, 0);
+        ui_thread->StartWithOptions(thread_options);
+
+        options.set_allow_use_magnification_api(true);
+      }
+#endif
+
       screen_capturer.reset(webrtc::ScreenCapturer::Create(options));
       if (screen_capturer && screen_capturer->SelectScreen(source.id)) {
         capturer.reset(new webrtc::DesktopAndCursorComposer(
@@ -442,20 +465,20 @@
 
   scoped_ptr<media::VideoCaptureDevice> result;
   if (capturer) {
-    result.reset(
-        new DesktopCaptureDevice(task_runner, capturer.Pass(), source.type));
+    scoped_refptr<base::SequencedTaskRunner> task_runner;
+    if (!ui_thread.get()) {
+      scoped_refptr<base::SequencedWorkerPool> blocking_pool =
+          BrowserThread::GetBlockingPool();
+      task_runner = blocking_pool->GetSequencedTaskRunner(
+          blocking_pool->GetSequenceToken());
+    }
+    result.reset(new DesktopCaptureDevice(
+        task_runner, ui_thread.Pass(), capturer.Pass(), source.type));
   }
 
   return result.Pass();
 }
 
-DesktopCaptureDevice::DesktopCaptureDevice(
-    scoped_refptr<base::SequencedTaskRunner> task_runner,
-    scoped_ptr<webrtc::DesktopCapturer> capturer,
-    DesktopMediaID::Type type)
-    : core_(new Core(task_runner, capturer.Pass(), type)) {
-}
-
 DesktopCaptureDevice::~DesktopCaptureDevice() {
   StopAndDeAllocate();
 }
@@ -475,4 +498,12 @@
   core_->SetNotificationWindowId(window_id);
 }
 
+DesktopCaptureDevice::DesktopCaptureDevice(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    scoped_ptr<base::Thread> thread,
+    scoped_ptr<webrtc::DesktopCapturer> capturer,
+    DesktopMediaID::Type type)
+    : core_(new Core(task_runner, thread.Pass(), capturer.Pass(), type)) {
+}
+
 }  // namespace content
diff --git a/content/browser/media/capture/desktop_capture_device.h b/content/browser/media/capture/desktop_capture_device.h
index af16bda..9fb8ca4 100644
--- a/content/browser/media/capture/desktop_capture_device.h
+++ b/content/browser/media/capture/desktop_capture_device.h
@@ -14,6 +14,7 @@
 
 namespace base {
 class SequencedTaskRunner;
+class Thread;
 }  // namespace base
 
 namespace webrtc {
@@ -33,9 +34,6 @@
   static scoped_ptr<media::VideoCaptureDevice> Create(
       const DesktopMediaID& source);
 
-  DesktopCaptureDevice(scoped_refptr<base::SequencedTaskRunner> task_runner,
-                       scoped_ptr<webrtc::DesktopCapturer> desktop_capturer,
-                       DesktopMediaID::Type type);
   virtual ~DesktopCaptureDevice();
 
   // VideoCaptureDevice interface.
@@ -47,7 +45,15 @@
   void SetNotificationWindowId(gfx::NativeViewId window_id);
 
  private:
+  friend class DesktopCaptureDeviceTest;
   class Core;
+
+  // Either |task_runner| or |thread| should be non-NULL, but not both.
+  DesktopCaptureDevice(scoped_refptr<base::SequencedTaskRunner> task_runner,
+                       scoped_ptr<base::Thread> thread,
+                       scoped_ptr<webrtc::DesktopCapturer> desktop_capturer,
+                       DesktopMediaID::Type type);
+
   scoped_refptr<Core> core_;
 
   DISALLOW_COPY_AND_ASSIGN(DesktopCaptureDevice);
diff --git a/content/browser/media/capture/desktop_capture_device_unittest.cc b/content/browser/media/capture/desktop_capture_device_unittest.cc
index 683f060..0c1a360 100644
--- a/content/browser/media/capture/desktop_capture_device_unittest.cc
+++ b/content/browser/media/capture/desktop_capture_device_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/sequenced_worker_pool.h"
+#include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -132,18 +133,28 @@
   bool generate_inverted_frames_;
 };
 
+}  // namespace
+
 class DesktopCaptureDeviceTest : public testing::Test {
  public:
   virtual void SetUp() OVERRIDE {
     worker_pool_ = new base::SequencedWorkerPool(3, "TestCaptureThread");
   }
 
+  void CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer> capturer) {
+    capture_device_.reset(new DesktopCaptureDevice(
+        worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
+        thread_.Pass(),
+        capturer.Pass(),
+        DesktopMediaID::TYPE_SCREEN));
+  }
+
  protected:
   scoped_refptr<base::SequencedWorkerPool> worker_pool_;
+  scoped_ptr<base::Thread> thread_;
+  scoped_ptr<DesktopCaptureDevice> capture_device_;
 };
 
-}  // namespace
-
 // There is currently no screen capturer implementation for ozone. So disable
 // the test that uses a real screen-capturer instead of FakeScreenCapturer.
 // http://crbug.com/260318
@@ -155,10 +166,8 @@
 TEST_F(DesktopCaptureDeviceTest, MAYBE_Capture) {
   scoped_ptr<webrtc::DesktopCapturer> capturer(
       webrtc::ScreenCapturer::Create());
-  DesktopCaptureDevice capture_device(
-      worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
-      capturer.Pass(),
-      DesktopMediaID::TYPE_SCREEN);
+  CreateScreenCaptureDevice(capturer.Pass());
+
   media::VideoCaptureFormat format;
   base::WaitableEvent done_event(false, false);
   int frame_size;
@@ -175,10 +184,10 @@
   capture_params.requested_format.frame_rate = kFrameRate;
   capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
   capture_params.allow_resolution_change = false;
-  capture_device.AllocateAndStart(
+  capture_device_->AllocateAndStart(
       capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
   EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
-  capture_device.StopAndDeAllocate();
+  capture_device_->StopAndDeAllocate();
 
   EXPECT_GT(format.frame_size.width(), 0);
   EXPECT_GT(format.frame_size.height(), 0);
@@ -194,10 +203,7 @@
 TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeConstantResolution) {
   FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
 
-  DesktopCaptureDevice capture_device(
-      worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
-      scoped_ptr<webrtc::DesktopCapturer>(mock_capturer),
-      DesktopMediaID::TYPE_SCREEN);
+  CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
 
   media::VideoCaptureFormat format;
   base::WaitableEvent done_event(false, false);
@@ -217,7 +223,7 @@
   capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
   capture_params.allow_resolution_change = false;
 
-  capture_device.AllocateAndStart(
+  capture_device_->AllocateAndStart(
       capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
 
   // Capture at least two frames, to ensure that the source frame size has
@@ -226,7 +232,7 @@
   done_event.Reset();
   EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
 
-  capture_device.StopAndDeAllocate();
+  capture_device_->StopAndDeAllocate();
 
   EXPECT_EQ(kTestFrameWidth1, format.frame_size.width());
   EXPECT_EQ(kTestFrameHeight1, format.frame_size.height());
@@ -242,10 +248,7 @@
 TEST_F(DesktopCaptureDeviceTest, ScreenResolutionChangeVariableResolution) {
   FakeScreenCapturer* mock_capturer = new FakeScreenCapturer();
 
-  DesktopCaptureDevice capture_device(
-      worker_pool_->GetSequencedTaskRunner(worker_pool_->GetSequenceToken()),
-      scoped_ptr<webrtc::DesktopCapturer>(mock_capturer),
-      DesktopMediaID::TYPE_SCREEN);
+  CreateScreenCaptureDevice(scoped_ptr<webrtc::DesktopCapturer>(mock_capturer));
 
   media::VideoCaptureFormat format;
   base::WaitableEvent done_event(false, false);
@@ -263,7 +266,7 @@
   capture_params.requested_format.pixel_format = media::PIXEL_FORMAT_I420;
   capture_params.allow_resolution_change = false;
 
-  capture_device.AllocateAndStart(
+  capture_device_->AllocateAndStart(
       capture_params, client.PassAs<media::VideoCaptureDevice::Client>());
 
   // Capture at least three frames, to ensure that the source frame size has
@@ -274,7 +277,7 @@
   done_event.Reset();
   EXPECT_TRUE(done_event.TimedWait(TestTimeouts::action_max_timeout()));
 
-  capture_device.StopAndDeAllocate();
+  capture_device_->StopAndDeAllocate();
 
   EXPECT_EQ(kTestFrameWidth1, format.frame_size.width());
   EXPECT_EQ(kTestFrameHeight1, format.frame_size.height());
diff --git a/content/browser/mojo/mojo_application_host.cc b/content/browser/mojo/mojo_application_host.cc
index 48d343a..efe2ddf 100644
--- a/content/browser/mojo/mojo_application_host.cc
+++ b/content/browser/mojo/mojo_application_host.cc
@@ -30,7 +30,7 @@
 }
 
 bool MojoApplicationHost::Init() {
-  DCHECK(shell_client_.is_null()) << "Already initialized!";
+  DCHECK(!shell_.get()) << "Already initialized!";
 
   mojo::embedder::PlatformChannelPair channel_pair;
 
@@ -43,10 +43,7 @@
   // Forward this to the client once we know its process handle.
   client_handle_ = channel_pair.PassClientHandle();
 
-  // TODO(darin): Provide a Shell implementation
-  shell_client_.reset(
-      mojo::ScopedShellClientHandle::From(message_pipe.Pass()), NULL);
-
+  shell_.reset(BindToPipe(new ShellImpl(), message_pipe.Pass()));
   return true;
 }
 
@@ -62,4 +59,14 @@
   return did_activate_;
 }
 
+void MojoApplicationHost::ShellImpl::SetClient(mojo::ShellClient* client) {
+  client_ = client;
+}
+
+void MojoApplicationHost::ShellImpl::Connect(
+    const mojo::String& url,
+    mojo::ScopedMessagePipeHandle handle) {
+  // TODO(darin): Provide something meaningful here.
+}
+
 }  // namespace content
diff --git a/content/browser/mojo/mojo_application_host.h b/content/browser/mojo/mojo_application_host.h
index 68f6c32..a28d2a3 100644
--- a/content/browser/mojo/mojo_application_host.h
+++ b/content/browser/mojo/mojo_application_host.h
@@ -8,7 +8,6 @@
 #include "base/process/process_handle.h"
 #include "mojo/common/channel_init.h"
 #include "mojo/embedder/scoped_platform_handle.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
 #include "mojo/public/interfaces/shell/shell.mojom.h"
 
 namespace IPC {
@@ -25,7 +24,7 @@
 class MojoApplicationHost {
  public:
   MojoApplicationHost();
-  ~MojoApplicationHost();
+  virtual ~MojoApplicationHost();
 
   // Two-phase initialization:
   //  1- Init makes the shell_client() available synchronously.
@@ -35,12 +34,34 @@
 
   bool did_activate() const { return did_activate_; }
 
-  mojo::ShellClient* shell_client() { return shell_client_.get(); }
+  mojo::ShellClient* shell_client() {
+    DCHECK(shell_.get());
+    return shell_->client();
+  }
 
  private:
+  class ShellImpl : public mojo::InterfaceImpl<mojo::Shell> {
+   public:
+    ShellImpl() : client_(NULL) {}
+    mojo::ShellClient* client() { return client_; }
+
+    virtual void OnConnectionError() OVERRIDE {
+      // TODO(darin): How should we handle this error?
+    }
+
+    // mojo::Shell methods:
+    virtual void SetClient(mojo::ShellClient* client) OVERRIDE;
+    virtual void Connect(const mojo::String& url,
+                         mojo::ScopedMessagePipeHandle handle) OVERRIDE;
+   private:
+    mojo::ShellClient* client_;
+  };
+
   mojo::common::ChannelInit channel_init_;
   mojo::embedder::ScopedPlatformHandle client_handle_;
-  mojo::RemotePtr<mojo::ShellClient> shell_client_;
+
+  scoped_ptr<ShellImpl> shell_;
+
   bool did_activate_;
 
   DISALLOW_COPY_AND_ASSIGN(MojoApplicationHost);
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index 047859a..0d285fd 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -761,7 +761,7 @@
 }
 
 void PluginServiceImpl::AddExtraPluginPath(const base::FilePath& path) {
- if (!NPAPIPluginsSupported()) {
+  if (!NPAPIPluginsSupported()) {
     // TODO(jam): remove and just have CHECK once we're sure this doesn't get
     // triggered.
     DVLOG(0) << "NPAPI plugins not supported";
@@ -799,8 +799,7 @@
 }
 
 bool PluginServiceImpl::NPAPIPluginsSupported() {
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_BSD) || \
-    (defined(OS_LINUX) && !defined(USE_AURA))
+#if defined(OS_WIN) || defined(OS_MACOSX)
   return true;
 #else
   return false;
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
index e4f603f..84d95ac 100644
--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -9,6 +9,7 @@
 #include "base/win/windows_version.h"
 #include "content/browser/accessibility/browser_accessibility_manager_win.h"
 #include "content/browser/accessibility/browser_accessibility_win.h"
+#include "content/public/browser/browser_accessibility_state.h"
 #include "content/public/common/content_switches.h"
 #include "ui/base/touch/touch_enabled.h"
 #include "ui/base/view_prop.h"
@@ -18,6 +19,11 @@
 
 namespace content {
 
+// A custom MSAA object id used to determine if a screen reader or some
+// other client is listening on MSAA events - if so, we enable full web
+// accessibility support.
+const int kIdScreenReaderHoneyPot = 1;
+
 LegacyRenderWidgetHostHWND::~LegacyRenderWidgetHostHWND() {
   ::DestroyWindow(hwnd());
 }
@@ -100,6 +106,14 @@
       hwnd(), OBJID_WINDOW, IID_IAccessible,
       reinterpret_cast<void **>(window_accessible_.Receive()));
   DCHECK(SUCCEEDED(hr));
+
+  if (!BrowserAccessibilityState::GetInstance()->IsAccessibleBrowser()) {
+    // Attempt to detect screen readers or other clients who want full
+    // accessibility support, by seeing if they respond to this event.
+    NotifyWinEvent(EVENT_SYSTEM_ALERT, hwnd(), kIdScreenReaderHoneyPot,
+                   CHILDID_SELF);
+  }
+
   return !!SUCCEEDED(hr);
 }
 
@@ -119,6 +133,13 @@
 LRESULT LegacyRenderWidgetHostHWND::OnGetObject(UINT message,
                                                 WPARAM w_param,
                                                 LPARAM l_param) {
+  if (kIdScreenReaderHoneyPot == l_param) {
+    // When an MSAA client has responded to our fake event on this id,
+    // enable screen reader support.
+    BrowserAccessibilityState::GetInstance()->OnScreenReaderDetected();
+    return static_cast<LRESULT>(0L);
+  }
+
   if (OBJID_CLIENT != l_param || !manager_)
     return static_cast<LRESULT>(0L);
 
@@ -303,4 +324,4 @@
   return 0;
 }
 
-}  // namespace content
\ No newline at end of file
+}  // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 4cf4cdc..c01dc5c 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -59,7 +59,6 @@
 #include "content/browser/indexed_db/indexed_db_dispatcher_host.h"
 #include "content/browser/loader/resource_message_filter.h"
 #include "content/browser/loader/resource_scheduler_filter.h"
-#include "content/browser/media/android/browser_demuxer_android.h"
 #include "content/browser/media/capture/audio_mirroring_manager.h"
 #include "content/browser/media/media_internals.h"
 #include "content/browser/message_port_message_filter.h"
@@ -150,6 +149,10 @@
 #include "webkit/browser/fileapi/sandbox_file_system_backend.h"
 #include "webkit/common/resource_type.h"
 
+#if defined(OS_ANDROID)
+#include "content/browser/media/android/browser_demuxer_android.h"
+#endif
+
 #if defined(OS_WIN)
 #include "base/win/scoped_com_initializer.h"
 #include "content/common/font_cache_dispatcher_win.h"
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index cddc4dc..358109f 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -21,9 +21,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_platform_file.h"
-#include "mojo/embedder/scoped_platform_handle.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
-#include "mojo/public/interfaces/shell/shell.mojom.h"
+#include "mojo/public/cpp/bindings/interface_ptr.h"
 
 struct ViewHostMsg_CompositorSurfaceBuffersSwapped_Params;
 
@@ -245,6 +243,14 @@
   void ConnectTo(const base::StringPiece& service_name,
                  mojo::ScopedMessagePipeHandle handle);
 
+  template <typename Interface>
+  void ConnectTo(const base::StringPiece& service_name,
+                 mojo::InterfacePtr<Interface>* ptr) {
+    mojo::MessagePipe pipe;
+    ptr->Bind(pipe.handle0.Pass());
+    ConnectTo(service_name, pipe.handle1.Pass());
+  }
+
  protected:
   // A proxy for our IPC::Channel that lives on the IO thread (see
   // browser_process.h)
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index c173bb9..49a17ef 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -687,12 +687,11 @@
 
   DCHECK(renderer_initialized_);
 
-  mojo::InterfacePipe<WebUISetup, mojo::AnyInterface> pipe;
-  mojo::RemotePtr<WebUISetup> web_ui_setup(pipe.handle_to_self.Pass(), NULL);
-  web_ui_setup->SetWebUIHandle(GetRoutingID(), handle.Pass());
-
+  WebUISetupPtr web_ui_setup;
   static_cast<RenderProcessHostImpl*>(GetProcess())->ConnectTo(
-      kRendererService_WebUISetup, pipe.handle_to_peer.Pass());
+      kRendererService_WebUISetup, &web_ui_setup);
+
+  web_ui_setup->SetWebUIHandle(GetRoutingID(), handle.Pass());
 }
 
 #if defined(OS_ANDROID)
diff --git a/content/browser/service_worker/database_proto.target.darwin-arm.mk b/content/browser/service_worker/database_proto.target.darwin-arm.mk
index c3e221e..16495c5 100644
--- a/content/browser/service_worker/database_proto.target.darwin-arm.mk
+++ b/content/browser/service_worker/database_proto.target.darwin-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -197,6 +198,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.darwin-arm64.mk b/content/browser/service_worker/database_proto.target.darwin-arm64.mk
index 14d103c..f7d896e 100644
--- a/content/browser/service_worker/database_proto.target.darwin-arm64.mk
+++ b/content/browser/service_worker/database_proto.target.darwin-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -190,6 +191,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.darwin-mips.mk b/content/browser/service_worker/database_proto.target.darwin-mips.mk
index f7ec6bb..7c0e14b 100644
--- a/content/browser/service_worker/database_proto.target.darwin-mips.mk
+++ b/content/browser/service_worker/database_proto.target.darwin-mips.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -199,6 +200,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.darwin-x86.mk b/content/browser/service_worker/database_proto.target.darwin-x86.mk
index 359a96e..a862113 100644
--- a/content/browser/service_worker/database_proto.target.darwin-x86.mk
+++ b/content/browser/service_worker/database_proto.target.darwin-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.darwin-x86_64.mk b/content/browser/service_worker/database_proto.target.darwin-x86_64.mk
index 238a569..d2f2b4e 100644
--- a/content/browser/service_worker/database_proto.target.darwin-x86_64.mk
+++ b/content/browser/service_worker/database_proto.target.darwin-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.linux-arm.mk b/content/browser/service_worker/database_proto.target.linux-arm.mk
index c3e221e..16495c5 100644
--- a/content/browser/service_worker/database_proto.target.linux-arm.mk
+++ b/content/browser/service_worker/database_proto.target.linux-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -197,6 +198,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.linux-arm64.mk b/content/browser/service_worker/database_proto.target.linux-arm64.mk
index 14d103c..f7d896e 100644
--- a/content/browser/service_worker/database_proto.target.linux-arm64.mk
+++ b/content/browser/service_worker/database_proto.target.linux-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -190,6 +191,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.linux-mips.mk b/content/browser/service_worker/database_proto.target.linux-mips.mk
index f7ec6bb..7c0e14b 100644
--- a/content/browser/service_worker/database_proto.target.linux-mips.mk
+++ b/content/browser/service_worker/database_proto.target.linux-mips.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -199,6 +200,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.linux-x86.mk b/content/browser/service_worker/database_proto.target.linux-x86.mk
index 359a96e..a862113 100644
--- a/content/browser/service_worker/database_proto.target.linux-x86.mk
+++ b/content/browser/service_worker/database_proto.target.linux-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/service_worker/database_proto.target.linux-x86_64.mk b/content/browser/service_worker/database_proto.target.linux-x86_64.mk
index 238a569..d2f2b4e 100644
--- a/content/browser/service_worker/database_proto.target.linux-x86_64.mk
+++ b/content/browser/service_worker/database_proto.target.linux-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.darwin-arm.mk b/content/browser/speech/proto/speech_proto.target.darwin-arm.mk
index 3efb7da..b4c926e 100644
--- a/content/browser/speech/proto/speech_proto.target.darwin-arm.mk
+++ b/content/browser/speech/proto/speech_proto.target.darwin-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -197,6 +198,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.darwin-arm64.mk b/content/browser/speech/proto/speech_proto.target.darwin-arm64.mk
index 3d2b88f..e1e2bc3 100644
--- a/content/browser/speech/proto/speech_proto.target.darwin-arm64.mk
+++ b/content/browser/speech/proto/speech_proto.target.darwin-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -190,6 +191,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.darwin-mips.mk b/content/browser/speech/proto/speech_proto.target.darwin-mips.mk
index bd168a8..fcd9499 100644
--- a/content/browser/speech/proto/speech_proto.target.darwin-mips.mk
+++ b/content/browser/speech/proto/speech_proto.target.darwin-mips.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -199,6 +200,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.darwin-x86.mk b/content/browser/speech/proto/speech_proto.target.darwin-x86.mk
index 034dad0..1ad1a25 100644
--- a/content/browser/speech/proto/speech_proto.target.darwin-x86.mk
+++ b/content/browser/speech/proto/speech_proto.target.darwin-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.darwin-x86_64.mk b/content/browser/speech/proto/speech_proto.target.darwin-x86_64.mk
index 01c2092..7009b48 100644
--- a/content/browser/speech/proto/speech_proto.target.darwin-x86_64.mk
+++ b/content/browser/speech/proto/speech_proto.target.darwin-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.linux-arm.mk b/content/browser/speech/proto/speech_proto.target.linux-arm.mk
index 3efb7da..b4c926e 100644
--- a/content/browser/speech/proto/speech_proto.target.linux-arm.mk
+++ b/content/browser/speech/proto/speech_proto.target.linux-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -197,6 +198,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.linux-arm64.mk b/content/browser/speech/proto/speech_proto.target.linux-arm64.mk
index 3d2b88f..e1e2bc3 100644
--- a/content/browser/speech/proto/speech_proto.target.linux-arm64.mk
+++ b/content/browser/speech/proto/speech_proto.target.linux-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -190,6 +191,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.linux-mips.mk b/content/browser/speech/proto/speech_proto.target.linux-mips.mk
index bd168a8..fcd9499 100644
--- a/content/browser/speech/proto/speech_proto.target.linux-mips.mk
+++ b/content/browser/speech/proto/speech_proto.target.linux-mips.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -199,6 +200,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.linux-x86.mk b/content/browser/speech/proto/speech_proto.target.linux-x86.mk
index 034dad0..1ad1a25 100644
--- a/content/browser/speech/proto/speech_proto.target.linux-x86.mk
+++ b/content/browser/speech/proto/speech_proto.target.linux-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/speech/proto/speech_proto.target.linux-x86_64.mk b/content/browser/speech/proto/speech_proto.target.linux-x86_64.mk
index 01c2092..7009b48 100644
--- a/content/browser/speech/proto/speech_proto.target.linux-x86_64.mk
+++ b/content/browser/speech/proto/speech_proto.target.linux-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
@@ -198,6 +199,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DPROTOBUF_USE_DLLS' \
 	'-DGOOGLE_PROTOBUF_NO_RTTI' \
 	'-DGOOGLE_PROTOBUF_NO_STATIC_INITIALIZER' \
diff --git a/content/browser/web_contents/web_contents_view_aura_browsertest.cc b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
index c20a888..330f624 100644
--- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc
+++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
@@ -616,9 +616,18 @@
   delete web_contents->GetContentNativeView();
 }
 
-// TODO(dalecurtis): Test disabled due to flakiness.  http://crbug.com/369871.
+
+#if defined(OS_WIN)
+// This appears to be flaky in the same was as the other overscroll
+// tests. Enabling for non-Windows platforms.
+// See http://crbug.com/369871.
+#define MAYBE_RepeatedQuickOverscrollGestures DISABLED_RepeatedQuickOverscrollGestures
+#else
+#define MAYBE_RepeatedQuickOverscrollGestures RepeatedQuickOverscrollGestures
+#endif
+
 IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest,
-                       DISABLED_RepeatedQuickOverscrollGestures) {
+                       MAYBE_RepeatedQuickOverscrollGestures) {
   ASSERT_NO_FATAL_FAILURE(
       StartTestWithPage("files/overscroll_navigation.html"));
 
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc
index 598dbe1..039db85 100644
--- a/content/browser/webui/web_ui_mojo_browsertest.cc
+++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -25,7 +25,6 @@
 #include "grit/content_resources.h"
 #include "mojo/common/test/test_utils.h"
 #include "mojo/public/cpp/bindings/allocation_scope.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
 #include "mojo/public/js/bindings/constants.h"
 
 namespace content {
@@ -54,23 +53,24 @@
   return true;
 }
 
-class BrowserTargetImpl : public mojo::BrowserTarget {
+class BrowserTargetImpl : public BrowserTarget {
  public:
-  BrowserTargetImpl(mojo::ScopedRendererTargetHandle& handle,
+  BrowserTargetImpl(mojo::ScopedMessagePipeHandle handle,
                     base::RunLoop* run_loop)
-      : client_(handle.Pass(), this),
+      : renderer_(mojo::MakeProxy<RendererTarget>(handle.Pass())),
         run_loop_(run_loop) {
+    renderer_->SetClient(this);
   }
 
   virtual ~BrowserTargetImpl() {}
 
-  // mojo::BrowserTarget overrides:
+  // BrowserTarget overrides:
   virtual void PingResponse() OVERRIDE {
     NOTREACHED();
   }
 
  protected:
-  mojo::RemotePtr<mojo::RendererTarget> client_;
+  RendererTargetPtr renderer_;
   base::RunLoop* run_loop_;
 
  private:
@@ -79,15 +79,15 @@
 
 class PingBrowserTargetImpl : public BrowserTargetImpl {
  public:
-  PingBrowserTargetImpl(mojo::ScopedRendererTargetHandle handle,
+  PingBrowserTargetImpl(mojo::ScopedMessagePipeHandle handle,
                         base::RunLoop* run_loop)
-      : BrowserTargetImpl(handle, run_loop) {
-    client_->Ping();
+      : BrowserTargetImpl(handle.Pass(), run_loop) {
+    renderer_->Ping();
   }
 
   virtual ~PingBrowserTargetImpl() {}
 
-  // mojo::BrowserTarget overrides:
+  // BrowserTarget overrides:
   // Quit the RunLoop when called.
   virtual void PingResponse() OVERRIDE {
     got_message = true;
@@ -128,11 +128,10 @@
 
   // WebUIController overrides:
   virtual void RenderViewCreated(RenderViewHost* render_view_host) OVERRIDE {
-    mojo::InterfacePipe<mojo::BrowserTarget, mojo::RendererTarget> pipe;
-    browser_target_.reset(new PingBrowserTargetImpl(
-        pipe.handle_to_peer.Pass(), run_loop_));
-    render_view_host->SetWebUIHandle(
-        mojo::ScopedMessagePipeHandle(pipe.handle_to_self.release()));
+    mojo::MessagePipe pipe;
+    browser_target_.reset(
+        new PingBrowserTargetImpl(pipe.handle0.Pass(), run_loop_));
+    render_view_host->SetWebUIHandle(pipe.handle1.Pass());
   }
 
  private:
diff --git a/content/child/child_thread.cc b/content/child/child_thread.cc
index e39ef4c..1ac5468 100644
--- a/content/child/child_thread.cc
+++ b/content/child/child_thread.cc
@@ -29,6 +29,7 @@
 #include "content/child/child_resource_message_filter.h"
 #include "content/child/child_shared_bitmap_manager.h"
 #include "content/child/fileapi/file_system_dispatcher.h"
+#include "content/child/fileapi/webfilesystem_impl.h"
 #include "content/child/mojo/mojo_application.h"
 #include "content/child/power_monitor_broadcast_source.h"
 #include "content/child/quota_dispatcher.h"
@@ -340,6 +341,7 @@
   // safely shutdown blink in their Shutdown implementation.
   file_system_dispatcher_.reset();
   quota_dispatcher_.reset();
+  WebFileSystemImpl::DeleteThreadSpecificInstance();
 }
 
 void ChildThread::OnChannelConnected(int32 peer_pid) {
diff --git a/content/child/child_thread.h b/content/child/child_thread.h
index 8887e7a..1b04830 100644
--- a/content/child/child_thread.h
+++ b/content/child/child_thread.h
@@ -58,7 +58,7 @@
 // The main thread of a child process derives from this class.
 class CONTENT_EXPORT ChildThread : public IPC::Listener,
                                    public IPC::Sender,
-                                   public mojo::ShellClient {
+                                   public NON_EXPORTED_BASE(mojo::ShellClient) {
  public:
   // Creates the thread.
   ChildThread();
diff --git a/content/child/mojo/mojo_application.cc b/content/child/mojo/mojo_application.cc
index 1d61c0b..5cec176 100644
--- a/content/child/mojo/mojo_application.cc
+++ b/content/child/mojo/mojo_application.cc
@@ -38,8 +38,8 @@
                          ChildProcess::current()->io_message_loop_proxy());
   DCHECK(message_pipe.is_valid());
 
-  shell_.reset(
-      mojo::ScopedShellHandle::From(message_pipe.Pass()), shell_client_);
+  shell_.Bind(message_pipe.Pass());
+  shell_->SetClient(shell_client_);
 }
 
 }  // namespace content
diff --git a/content/child/mojo/mojo_application.h b/content/child/mojo/mojo_application.h
index fad9888..88646b6 100644
--- a/content/child/mojo/mojo_application.h
+++ b/content/child/mojo/mojo_application.h
@@ -7,7 +7,6 @@
 
 #include "ipc/ipc_platform_file.h"
 #include "mojo/common/channel_init.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
 #include "mojo/public/interfaces/shell/shell.mojom.h"
 
 namespace IPC {
@@ -36,7 +35,7 @@
   void OnActivate(const IPC::PlatformFileForTransit& file);
 
   mojo::common::ChannelInit channel_init_;
-  mojo::RemotePtr<mojo::Shell> shell_;
+  mojo::ShellPtr shell_;
   mojo::ShellClient* shell_client_;
 
   DISALLOW_COPY_AND_ASSIGN(MojoApplication);
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
index b6a877f..9e6e923 100644
--- a/content/child/resource_dispatcher.cc
+++ b/content/child/resource_dispatcher.cc
@@ -47,10 +47,7 @@
   *time = converter.ToLocalTimeTicks(remote_time).ToTimeTicks();
 }
 
-
-}  // namespace
-
-static void CrashOnMapFailure() {
+void CrashOnMapFailure() {
 #if defined(OS_WIN)
   DWORD last_err = GetLastError();
   base::debug::Alias(&last_err);
@@ -59,7 +56,7 @@
 }
 
 // Each resource request is assigned an ID scoped to this process.
-static int MakeRequestID() {
+int MakeRequestID() {
   // NOTE: The resource_dispatcher_host also needs probably unique
   // request_ids, so they count down from -2 (-1 is a special we're
   // screwed value), while the renderer process counts up.
@@ -67,6 +64,8 @@
   return next_request_id++;
 }
 
+}  // namespace
+
 // ResourceLoaderBridge implementation ----------------------------------------
 
 class IPCResourceLoaderBridge : public ResourceLoaderBridge {
@@ -162,11 +161,6 @@
     // this operation may fail, as the dispatcher will have preemptively
     // removed us when the renderer sends the ReceivedAllData message.
     dispatcher_->RemovePendingRequest(request_id_);
-
-    if (request_.download_to_file) {
-      dispatcher_->message_sender()->Send(
-          new ResourceHostMsg_ReleaseDownloadedFile(request_id_));
-    }
   }
 }
 
@@ -190,7 +184,8 @@
                                                request_.resource_type,
                                                request_.origin_pid,
                                                frame_origin_,
-                                               request_.url);
+                                               request_.url,
+                                               request_.download_to_file);
 
   return dispatcher_->message_sender()->Send(
       new ResourceHostMsg_RequestResource(routing_id_, request_id_, request_));
@@ -297,6 +292,18 @@
     return true;
   }
 
+  // If the request has been canceled, only dispatch
+  // ResourceMsg_RequestComplete (otherwise resource leaks) and drop other
+  // messages.
+  if (request_info->is_canceled) {
+    if (message.type() == ResourceMsg_RequestComplete::ID) {
+      DispatchMessage(message);
+    } else {
+      ReleaseResourcesInDataMessage(message);
+    }
+    return true;
+  }
+
   if (request_info->is_deferred) {
     request_info->deferred_message_queue.push_back(new IPC::Message(message));
     return true;
@@ -561,11 +568,16 @@
                                           ResourceType::Type resource_type,
                                           int origin_pid,
                                           const GURL& frame_origin,
-                                          const GURL& request_url) {
+                                          const GURL& request_url,
+                                          bool download_to_file) {
   // Compute a unique request_id for this renderer process.
   int id = MakeRequestID();
-  pending_requests_[id] = PendingRequestInfo(
-      callback, resource_type, origin_pid, frame_origin, request_url);
+  pending_requests_[id] = PendingRequestInfo(callback,
+                                             resource_type,
+                                             origin_pid,
+                                             frame_origin,
+                                             request_url,
+                                             download_to_file);
   return id;
 }
 
@@ -575,9 +587,17 @@
     return false;
 
   PendingRequestInfo& request_info = it->second;
+
+  bool release_downloaded_file = request_info.download_to_file;
+
   ReleaseResourcesInMessageQueue(&request_info.deferred_message_queue);
   pending_requests_.erase(it);
 
+  if (release_downloaded_file) {
+    message_sender_->Send(
+        new ResourceHostMsg_ReleaseDownloadedFile(request_id));
+  }
+
   return true;
 }
 
@@ -588,6 +608,46 @@
     return;
   }
 
+  PendingRequestInfo& request_info = it->second;
+  request_info.is_canceled = true;
+
+  // Because message handlers could result in request_info being destroyed,
+  // we need to work with a stack reference to the deferred queue.
+  MessageQueue queue;
+  queue.swap(request_info.deferred_message_queue);
+  // Removes pending requests. If ResourceMsg_RequestComplete was queued,
+  // dispatch it.
+  bool first_message = true;
+  while (!queue.empty()) {
+    IPC::Message* message = queue.front();
+    if (message->type() == ResourceMsg_RequestComplete::ID) {
+      if (first_message) {
+        // Dispatch as-is.
+        DispatchMessage(*message);
+      } else {
+        // If we skip some ResourceMsg_DataReceived and then dispatched the
+        // original ResourceMsg_RequestComplete(status=success), chrome will
+        // crash because it entered an unexpected state. So replace
+        // ResourceMsg_RequestComplete with failure status.
+        ResourceMsg_RequestCompleteData request_complete_data;
+        request_complete_data.error_code = net::ERR_ABORTED;
+        request_complete_data.was_ignored_by_handler = false;
+        request_complete_data.exists_in_cache = false;
+        request_complete_data.completion_time = base::TimeTicks();
+        request_complete_data.encoded_data_length = 0;
+
+        ResourceMsg_RequestComplete error_message(request_id,
+            request_complete_data);
+        DispatchMessage(error_message);
+      }
+    } else {
+      ReleaseResourcesInDataMessage(*message);
+    }
+    first_message = false;
+    queue.pop_front();
+    delete message;
+  }
+
   // |request_id| will be removed from |pending_requests_| when
   // OnRequestComplete returns with ERR_ABORTED.
   message_sender()->Send(new ResourceHostMsg_CancelRequest(request_id));
@@ -615,9 +675,10 @@
   }
 }
 
-void ResourceDispatcher::DidChangePriority(
-    int routing_id, int request_id, net::RequestPriority new_priority,
-    int intra_priority_value) {
+void ResourceDispatcher::DidChangePriority(int routing_id,
+                                           int request_id,
+                                           net::RequestPriority new_priority,
+                                           int intra_priority_value) {
   DCHECK(ContainsKey(pending_requests_, request_id));
   message_sender()->Send(new ResourceHostMsg_DidChangePriority(
       request_id, new_priority, intra_priority_value));
@@ -627,6 +688,8 @@
     : peer(NULL),
       resource_type(ResourceType::SUB_RESOURCE),
       is_deferred(false),
+      is_canceled(false),
+      download_to_file(false),
       blocked_response(false),
       buffer_size(0) {
 }
@@ -636,14 +699,17 @@
     ResourceType::Type resource_type,
     int origin_pid,
     const GURL& frame_origin,
-    const GURL& request_url)
+    const GURL& request_url,
+    bool download_to_file)
     : peer(peer),
       resource_type(resource_type),
       origin_pid(origin_pid),
       is_deferred(false),
+      is_canceled(false),
       url(request_url),
       frame_origin(frame_origin),
       response_url(request_url),
+      download_to_file(download_to_file),
       request_start(base::TimeTicks::Now()),
       blocked_response(false) {}
 
diff --git a/content/child/resource_dispatcher.h b/content/child/resource_dispatcher.h
index 5aabbd4..d407579 100644
--- a/content/child/resource_dispatcher.h
+++ b/content/child/resource_dispatcher.h
@@ -52,33 +52,33 @@
   webkit_glue::ResourceLoaderBridge* CreateBridge(
       const RequestInfo& request_info);
 
-  // Adds a request from the pending_requests_ list, returning the new
-  // requests' ID
+  // Adds a request from the |pending_requests_| list, returning the new
+  // requests' ID.
   int AddPendingRequest(RequestPeer* callback,
                         ResourceType::Type resource_type,
                         int origin_pid,
                         const GURL& frame_origin,
-                        const GURL& request_url);
+                        const GURL& request_url,
+                        bool download_to_file);
 
-  // Removes a request from the pending_requests_ list, returning true if the
+  // Removes a request from the |pending_requests_| list, returning true if the
   // request was found and removed.
   bool RemovePendingRequest(int request_id);
 
-  // Cancels a request in the pending_requests_ list.
+  // Cancels a request in the |pending_requests_| list.
   void CancelPendingRequest(int request_id);
 
-  IPC::Sender* message_sender() const {
-    return message_sender_;
-  }
-
   // Toggles the is_deferred attribute for the specified request.
   void SetDefersLoading(int request_id, bool value);
 
   // Indicates the priority of the specified request changed.
-  void DidChangePriority(int routing_id, int request_id,
+  void DidChangePriority(int routing_id,
+                         int request_id,
                          net::RequestPriority new_priority,
                          int intra_priority_value);
 
+  IPC::Sender* message_sender() const { return message_sender_; }
+
   // This does not take ownership of the delegate. It is expected that the
   // delegate have a longer lifetime than the ResourceDispatcher.
   void set_delegate(ResourceDispatcherDelegate* delegate) {
@@ -101,7 +101,8 @@
                        ResourceType::Type resource_type,
                        int origin_pid,
                        const GURL& frame_origin,
-                       const GURL& request_url);
+                       const GURL& request_url,
+                       bool download_to_file);
 
     ~PendingRequestInfo();
 
@@ -113,12 +114,14 @@
     int origin_pid;
     MessageQueue deferred_message_queue;
     bool is_deferred;
+    bool is_canceled;
     // Original requested url.
     GURL url;
     // The security origin of the frame that initiates this request.
     GURL frame_origin;
     // The url of the latest response even in case of redirection.
     GURL response_url;
+    bool download_to_file;
     linked_ptr<IPC::Message> pending_redirect_message;
     base::TimeTicks request_start;
     base::TimeTicks response_start;
@@ -138,33 +141,24 @@
   void FollowPendingRedirect(int request_id, PendingRequestInfo& request_info);
 
   // Message response handlers, called by the message handler for this process.
-  void OnUploadProgress(
-      int request_id,
-      int64 position,
-      int64 size);
+  void OnUploadProgress(int request_id, int64 position, int64 size);
   void OnReceivedResponse(int request_id, const ResourceResponseHead&);
   void OnReceivedCachedMetadata(int request_id, const std::vector<char>& data);
-  void OnReceivedRedirect(
-      int request_id,
-      const GURL& new_url,
-      const ResourceResponseHead& response_head);
-  void OnSetDataBuffer(
-      int request_id,
-      base::SharedMemoryHandle shm_handle,
-      int shm_size,
-      base::ProcessId renderer_pid);
-  void OnReceivedData(
-      int request_id,
-      int data_offset,
-      int data_length,
-      int encoded_data_length);
-  void OnDownloadedData(
-      int request_id,
-      int data_len,
-      int encoded_data_length);
+  void OnReceivedRedirect(int request_id,
+                          const GURL& new_url,
+                          const ResourceResponseHead& response_head);
+  void OnSetDataBuffer(int request_id,
+                       base::SharedMemoryHandle shm_handle,
+                       int shm_size,
+                       base::ProcessId renderer_pid);
+  void OnReceivedData(int request_id,
+                      int data_offset,
+                      int data_length,
+                      int encoded_data_length);
+  void OnDownloadedData(int request_id, int data_len, int encoded_data_length);
   void OnRequestComplete(
       int request_id,
-      const ResourceMsg_RequestCompleteData &request_complete_data);
+      const ResourceMsg_RequestCompleteData& request_complete_data);
 
   // Dispatch the message to one of the message response handlers.
   void DispatchMessage(const IPC::Message& message);
diff --git a/content/common/plugin_list.h b/content/common/plugin_list.h
index 87319da..2f775d2 100644
--- a/content/common/plugin_list.h
+++ b/content/common/plugin_list.h
@@ -34,7 +34,6 @@
 // This object is thread safe.
 class CONTENT_EXPORT PluginList {
  public:
-
   // Gets the one instance of the PluginList.
   static PluginList* Singleton();
 
@@ -159,18 +158,6 @@
   static bool ReadWebPluginInfo(const base::FilePath& filename,
                                 WebPluginInfo* info);
 
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
-  // Parse the result of an NP_GetMIMEDescription() call.
-  // This API is only used on Unixes, and is exposed here for testing.
-  static void ParseMIMEDescription(const std::string& description,
-      std::vector<WebPluginMimeType>* mime_types);
-
-  // Extract a version number from a description string.
-  // This API is only used on Unixes, and is exposed here for testing.
-  static void ExtractVersionString(const std::string& version,
-                                   WebPluginInfo* info);
-#endif
-
  private:
   enum LoadingState {
     LOADING_STATE_NEEDS_REFRESH,
diff --git a/content/common/plugin_list_posix.cc b/content/common/plugin_list_posix.cc
index bdbd0c8..122fd59 100644
--- a/content/common/plugin_list_posix.cc
+++ b/content/common/plugin_list_posix.cc
@@ -4,586 +4,33 @@
 
 #include "content/common/plugin_list.h"
 
-#include <algorithm>
-#include <dlfcn.h>
-#if defined(OS_OPENBSD)
-#include <sys/exec_elf.h>
-#else
-#include <elf.h>
-#endif
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "base/cpu.h"
-#include "base/file_util.h"
-#include "base/files/file_enumerator.h"
-#include "base/native_library.h"
-#include "base/path_service.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/sha1.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build/build_config.h"
-#include "third_party/npapi/bindings/nphostapi.h"
-
 namespace content {
 
-namespace {
-
-// We build up a list of files and mtimes so we can sort them.
-typedef std::pair<base::FilePath, base::Time> FileAndTime;
-typedef std::vector<FileAndTime> FileTimeList;
-
-enum PluginQuirk {
-  // No quirks - plugin is outright banned.
-  PLUGIN_QUIRK_NONE = 0,
-  // Plugin is using SSE2 instructions without checking for SSE2 instruction
-  // support. Ban the plugin if the system has no SSE2 support.
-  PLUGIN_QUIRK_MISSING_SSE2_CHECK = 1 << 0,
-};
-
-// Copied from nsplugindefs.h instead of including the file since it has a bunch
-// of dependencies.
-enum nsPluginVariable {
-  nsPluginVariable_NameString        = 1,
-  nsPluginVariable_DescriptionString = 2
-};
-
-// Comparator used to sort by descending mtime then ascending filename.
-bool CompareTime(const FileAndTime& a, const FileAndTime& b) {
-  if (a.second == b.second) {
-    // Fall back on filename sorting, just to make the predicate valid.
-    return a.first < b.first;
-  }
-
-  // Sort by mtime, descending.
-  return a.second > b.second;
-}
-
-// Checks to see if the current environment meets any of the condtions set in
-// |quirks|. Returns true if any of the conditions are met, or if |quirks| is
-// PLUGIN_QUIRK_NONE.
-bool CheckQuirks(PluginQuirk quirks) {
-  if (quirks == PLUGIN_QUIRK_NONE)
-    return true;
-
-  if ((quirks & PLUGIN_QUIRK_MISSING_SSE2_CHECK) != 0) {
-    base::CPU cpu;
-    if (!cpu.has_sse2())
-      return true;
-  }
-
-  return false;
-}
-
-// Return true if |path| matches a known (file size, sha1sum) pair.
-// Also check against any PluginQuirks the bad plugin may have.
-// The use of the file size is an optimization so we don't have to read in
-// the entire file unless we have to.
-bool IsBlacklistedBySha1sumAndQuirks(const base::FilePath& path) {
-  const struct BadEntry {
-    int64 size;
-    std::string sha1;
-    PluginQuirk quirks;
-  } bad_entries[] = {
-    // Flash 9 r31 - http://crbug.com/29237
-    { 7040080, "fa5803061125ca47846713b34a26a42f1f1e98bb", PLUGIN_QUIRK_NONE },
-    // Flash 9 r48 - http://crbug.com/29237
-    { 7040036, "0c4b3768a6d4bfba003088e4b9090d381de1af2b", PLUGIN_QUIRK_NONE },
-    // Flash 11.2.202.236, 32-bit - http://crbug.com/140086
-    { 17406436, "1e07eac912faf9426c52a288c76c3b6238f90b6b",
-      PLUGIN_QUIRK_MISSING_SSE2_CHECK },
-    // Flash 11.2.202.238, 32-bit - http://crbug.com/140086
-    { 17410532, "e9401097e97c8443a7d9156be62184ffe1addd5c",
-      PLUGIN_QUIRK_MISSING_SSE2_CHECK },
-  };
-
-  int64 size;
-  if (!base::GetFileSize(path, &size))
-    return false;
-  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(bad_entries); i++) {
-    if (bad_entries[i].size != size)
-      continue;
-
-    std::string file_content;
-    if (!base::ReadFileToString(path, &file_content))
-      continue;
-    std::string sha1 = base::SHA1HashString(file_content);
-    std::string sha1_readable;
-    for (size_t j = 0; j < sha1.size(); j++)
-      base::StringAppendF(&sha1_readable, "%02x", sha1[j] & 0xFF);
-    if (bad_entries[i].sha1 == sha1_readable)
-      return CheckQuirks(bad_entries[i].quirks);
-  }
-  return false;
-}
-
-// Some plugins are shells around other plugins; we prefer to use the
-// real plugin directly, if it's available.  This function returns
-// true if we should prefer other plugins over this one.  We'll still
-// use a "undesirable" plugin if no other option is available.
-bool IsUndesirablePlugin(const WebPluginInfo& info) {
-  std::string filename = info.path.BaseName().value();
-  const char* kUndesiredPlugins[] = {
-    "npcxoffice",  // Crossover
-    "npwrapper",   // nspluginwrapper
-  };
-  for (size_t i = 0; i < arraysize(kUndesiredPlugins); i++) {
-    if (filename.find(kUndesiredPlugins[i]) != std::string::npos) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Return true if we shouldn't load a plugin at all.
-// This is an ugly hack to blacklist Adobe Acrobat due to not supporting
-// its Xt-based mainloop.
-// http://code.google.com/p/chromium/issues/detail?id=38229
-bool IsBlacklistedPlugin(const base::FilePath& path) {
-  const char* kBlackListedPlugins[] = {
-    "nppdf.so",           // Adobe PDF
-  };
-  std::string filename = path.BaseName().value();
-  for (size_t i = 0; i < arraysize(kBlackListedPlugins); i++) {
-    if (filename.find(kBlackListedPlugins[i]) != std::string::npos) {
-      return true;
-    }
-  }
-  return IsBlacklistedBySha1sumAndQuirks(path);
-}
-
-// Read the ELF header and return true if it is usable on
-// the current architecture (e.g. 32-bit ELF on 32-bit build).
-// Returns false on other errors as well.
-bool ELFMatchesCurrentArchitecture(const base::FilePath& filename) {
-  // First make sure we can open the file and it is in fact, a regular file.
-  struct stat stat_buf;
-  // Open with O_NONBLOCK so we don't block on pipes.
-  int fd = open(filename.value().c_str(), O_RDONLY|O_NONBLOCK);
-  if (fd < 0)
-    return false;
-  bool ret = (fstat(fd, &stat_buf) >= 0 && S_ISREG(stat_buf.st_mode));
-  if (IGNORE_EINTR(close(fd)) < 0)
-    return false;
-  if (!ret)
-    return false;
-
-  const size_t kELFBufferSize = 5;
-  char buffer[kELFBufferSize];
-  if (!base::ReadFile(filename, buffer, kELFBufferSize))
-    return false;
-
-  if (buffer[0] != ELFMAG0 ||
-      buffer[1] != ELFMAG1 ||
-      buffer[2] != ELFMAG2 ||
-      buffer[3] != ELFMAG3) {
-    // Not an ELF file, perhaps?
-    return false;
-  }
-
-  int elf_class = buffer[EI_CLASS];
-#if defined(ARCH_CPU_32_BITS)
-  if (elf_class == ELFCLASS32)
-    return true;
-#elif defined(ARCH_CPU_64_BITS)
-  if (elf_class == ELFCLASS64)
-    return true;
-#endif
-
-  return false;
-}
-
-// This structure matches enough of nspluginwrapper's NPW_PluginInfo
-// for us to extract the real plugin path.
-struct __attribute__((packed)) NSPluginWrapperInfo {
-  char ident[32];  // NSPluginWrapper magic identifier (includes version).
-  char path[PATH_MAX];  // Path to wrapped plugin.
-};
-
-// Test a plugin for whether it's been wrapped by NSPluginWrapper, and
-// if so attempt to unwrap it.  Pass in an opened plugin handle; on
-// success, |dl| and |unwrapped_path| will be filled in with the newly
-// opened plugin.  On failure, params are left unmodified.
-void UnwrapNSPluginWrapper(void **dl, base::FilePath* unwrapped_path) {
-  NSPluginWrapperInfo* info =
-      reinterpret_cast<NSPluginWrapperInfo*>(dlsym(*dl, "NPW_Plugin"));
-  if (!info)
-    return;  // Not a NSPW plugin.
-
-  // Here we could check the NSPW ident field for the versioning
-  // information, but the path field is available in all versions
-  // anyway.
-
-  // Grab the path to the wrapped plugin.  Just in case the structure
-  // format changes, protect against the path not being null-terminated.
-  char* path_end = static_cast<char*>(memchr(info->path, '\0',
-                                             sizeof(info->path)));
-  if (!path_end)
-    path_end = info->path + sizeof(info->path);
-  base::FilePath path = base::FilePath(
-      std::string(info->path, path_end - info->path));
-
-  if (!ELFMatchesCurrentArchitecture(path)) {
-    LOG(WARNING) << path.value() << " is nspluginwrapper wrapping a "
-                 << "plugin for a different architecture; it will "
-                 << "work better if you instead use a native plugin.";
-    return;
-  }
-
-  base::NativeLibraryLoadError error;
-  void* newdl = base::LoadNativeLibrary(path, &error);
-  if (!newdl) {
-    // We couldn't load the unwrapped plugin for some reason, despite
-    // being able to load the wrapped one.  Just use the wrapped one.
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Could not use unwrapped nspluginwrapper plugin "
-        << unwrapped_path->value() << " (" << error.ToString() << "), "
-        << "using the wrapped one.";
-    return;
-  }
-
-  // Unload the wrapped plugin, and use the wrapped plugin instead.
-  LOG_IF(ERROR, PluginList::DebugPluginLoading())
-      << "Using unwrapped version " << unwrapped_path->value()
-      << " of nspluginwrapper-wrapped plugin.";
-  base::UnloadNativeLibrary(*dl);
-  *dl = newdl;
-  *unwrapped_path = path;
-}
-
-}  // namespace
-
 bool PluginList::ReadWebPluginInfo(const base::FilePath& filename,
                                    WebPluginInfo* info) {
-  // The file to reference is:
-  // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirUnix.cpp
-
-  // Skip files that aren't appropriate for our architecture.
-  if (!ELFMatchesCurrentArchitecture(filename)) {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Skipping plugin " << filename.value()
-        << " because it doesn't match the current architecture.";
-    return false;
-  }
-
-  base::NativeLibraryLoadError error;
-  void* dl = base::LoadNativeLibrary(filename, &error);
-  if (!dl) {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "While reading plugin info, unable to load library "
-        << filename.value() << " (" << error.ToString() << "), skipping.";
-    return false;
-  }
-
-  info->path = filename;
-
-  // Attempt to swap in the wrapped plugin if this is nspluginwrapper.
-  UnwrapNSPluginWrapper(&dl, &info->path);
-
-  // See comments in plugin_lib_mac regarding this symbol.
-  typedef const char* (*NP_GetMimeDescriptionType)();
-  NP_GetMimeDescriptionType NP_GetMIMEDescription =
-      reinterpret_cast<NP_GetMimeDescriptionType>(
-          dlsym(dl, "NP_GetMIMEDescription"));
-  const char* mime_description = NULL;
-  if (!NP_GetMIMEDescription) {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Plugin " << filename.value() << " doesn't have a "
-        << "NP_GetMIMEDescription symbol";
-    return false;
-  }
-  mime_description = NP_GetMIMEDescription();
-
-  if (!mime_description) {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "MIME description for " << filename.value() << " is empty";
-    return false;
-  }
-  ParseMIMEDescription(mime_description, &info->mime_types);
-
-  // The plugin name and description live behind NP_GetValue calls.
-  typedef NPError (*NP_GetValueType)(void* unused,
-                                     nsPluginVariable variable,
-                                     void* value_out);
-  NP_GetValueType NP_GetValue =
-      reinterpret_cast<NP_GetValueType>(dlsym(dl, "NP_GetValue"));
-  if (NP_GetValue) {
-    const char* name = NULL;
-    NP_GetValue(NULL, nsPluginVariable_NameString, &name);
-    if (name) {
-      info->name = base::UTF8ToUTF16(name);
-      ExtractVersionString(name, info);
-    }
-
-    const char* description = NULL;
-    NP_GetValue(NULL, nsPluginVariable_DescriptionString, &description);
-    if (description) {
-      info->desc = base::UTF8ToUTF16(description);
-      if (info->version.empty())
-        ExtractVersionString(description, info);
-    }
-
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Got info for plugin " << filename.value()
-        << " Name = \"" << base::UTF16ToUTF8(info->name)
-        << "\", Description = \"" << base::UTF16ToUTF8(info->desc)
-        << "\", Version = \"" << base::UTF16ToUTF8(info->version)
-        << "\".";
-  } else {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Plugin " << filename.value()
-        << " has no GetValue() and probably won't work.";
-  }
-
-  // Intentionally not unloading the plugin here, it can lead to crashes.
-
-  return true;
+  return false;
 }
 
-// static
-void PluginList::ParseMIMEDescription(
-    const std::string& description,
-    std::vector<WebPluginMimeType>* mime_types) {
-  // We parse the description here into WebPluginMimeType structures.
-  // Naively from the NPAPI docs you'd think you could use
-  // string-splitting, but the Firefox parser turns out to do something
-  // different: find the first colon, then the second, then a semi.
-  //
-  // See ParsePluginMimeDescription near
-  // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginsDirUtils.h#53
-
-  std::string::size_type ofs = 0;
-  for (;;) {
-    WebPluginMimeType mime_type;
-
-    std::string::size_type end = description.find(':', ofs);
-    if (end == std::string::npos)
-      break;
-    mime_type.mime_type = description.substr(ofs, end - ofs);
-    ofs = end + 1;
-
-    end = description.find(':', ofs);
-    if (end == std::string::npos)
-      break;
-    const std::string extensions = description.substr(ofs, end - ofs);
-    base::SplitString(extensions, ',', &mime_type.file_extensions);
-    ofs = end + 1;
-
-    end = description.find(';', ofs);
-    // It's ok for end to run off the string here.  If there's no
-    // trailing semicolon we consume the remainder of the string.
-    if (end != std::string::npos) {
-      mime_type.description =
-          base::UTF8ToUTF16(description.substr(ofs, end - ofs));
-    } else {
-      mime_type.description = base::UTF8ToUTF16(description.substr(ofs));
-    }
-    mime_types->push_back(mime_type);
-    if (end == std::string::npos)
-      break;
-    ofs = end + 1;
-  }
+void PluginList::GetPluginDirectories(
+    std::vector<base::FilePath>* plugin_dirs) {
 }
 
-// static
-void PluginList::ExtractVersionString(const std::string& desc,
-                                      WebPluginInfo* info) {
-  // This matching works by extracting a version substring, along the lines of:
-  // No postfix: second match in .*<prefix>.*$
-  // With postfix: second match .*<prefix>.*<postfix>
-  static const struct {
-    const char* kPrefix;
-    const char* kPostfix;
-  } kPrePostFixes[] = {
-    { "Shockwave Flash ", 0 },
-    { "Java(TM) Plug-in ", 0 },
-    { "(using IcedTea-Web ", " " },
-    { 0, 0 }
-  };
-  std::string version;
-  for (size_t i = 0; kPrePostFixes[i].kPrefix; ++i) {
-    size_t pos;
-    if ((pos = desc.find(kPrePostFixes[i].kPrefix)) != std::string::npos) {
-      version = desc.substr(pos + strlen(kPrePostFixes[i].kPrefix));
-      pos = std::string::npos;
-      if (kPrePostFixes[i].kPostfix)
-        pos = version.find(kPrePostFixes[i].kPostfix);
-      if (pos != std::string::npos)
-        version = version.substr(0, pos);
-      break;
-    }
-  }
-  if (!version.empty()) {
-    info->version = base::UTF8ToUTF16(version);
-  }
-}
-
-void PluginList::GetPluginDirectories(std::vector<base::FilePath>* plugin_dirs) {
-  // See http://groups.google.com/group/chromium-dev/browse_thread/thread/7a70e5fcbac786a9
-  // for discussion.
-  // We first consult Chrome-specific dirs, then fall back on the logic
-  // Mozilla uses.
-
-  if (PluginList::plugins_discovery_disabled_)
-    return;
-
-  // Note: "extra" plugin dirs and paths are examined before these.
-  // "Extra" are those added by PluginList::AddExtraPluginDir() and
-  // PluginList::AddExtraPluginPath().
-
-  // The Chrome binary dir + "plugins/".
-  base::FilePath dir;
-  PathService::Get(base::DIR_EXE, &dir);
-  plugin_dirs->push_back(dir.Append("plugins"));
-
-  // Chrome OS only loads plugins from /opt/google/chrome/plugins.
-#if !defined(OS_CHROMEOS)
-  // Mozilla code to reference:
-  // http://mxr.mozilla.org/firefox/ident?i=NS_APP_PLUGINS_DIR_LIST
-  // and tens of accompanying files (mxr is very helpful).
-  // This code carefully matches their behavior for compat reasons.
-
-  // 1) MOZ_PLUGIN_PATH env variable.
-  const char* moz_plugin_path = getenv("MOZ_PLUGIN_PATH");
-  if (moz_plugin_path) {
-    std::vector<std::string> paths;
-    base::SplitString(moz_plugin_path, ':', &paths);
-    for (size_t i = 0; i < paths.size(); ++i)
-      plugin_dirs->push_back(base::FilePath(paths[i]));
-  }
-
-  // 2) NS_USER_PLUGINS_DIR: ~/.mozilla/plugins.
-  // This is a de-facto standard, so even though we're not Mozilla, let's
-  // look in there too.
-  base::FilePath home = base::GetHomeDir();
-  if (!home.empty())
-    plugin_dirs->push_back(home.Append(".mozilla/plugins"));
-
-  // 3) NS_SYSTEM_PLUGINS_DIR:
-  // This varies across different browsers and versions, so check 'em all.
-  plugin_dirs->push_back(base::FilePath("/usr/lib/browser-plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib/mozilla/plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib/firefox/plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib/xulrunner-addons/plugins"));
-
-#if defined(ARCH_CPU_64_BITS)
-  // On my Ubuntu system, /usr/lib64 is a symlink to /usr/lib.
-  // But a user reported on their Fedora system they are separate.
-  plugin_dirs->push_back(base::FilePath("/usr/lib64/browser-plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib64/mozilla/plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib64/firefox/plugins"));
-  plugin_dirs->push_back(base::FilePath("/usr/lib64/xulrunner-addons/plugins"));
-#endif  // defined(ARCH_CPU_64_BITS)
-#endif  // !defined(OS_CHROMEOS)
-}
-
-void PluginList::GetPluginsInDir(
-    const base::FilePath& dir_path, std::vector<base::FilePath>* plugins) {
-  // See ScanPluginsDirectory near
-  // http://mxr.mozilla.org/firefox/source/modules/plugin/base/src/nsPluginHostImpl.cpp#5052
-
-  // Construct and stat a list of all filenames under consideration, for
-  // later sorting by mtime.
-  FileTimeList files;
-  base::FileEnumerator enumerator(dir_path,
-                                  false,  // not recursive
-                                  base::FileEnumerator::FILES);
-  for (base::FilePath path = enumerator.Next(); !path.value().empty();
-       path = enumerator.Next()) {
-    // Skip over Mozilla .xpt files.
-    if (path.MatchesExtension(FILE_PATH_LITERAL(".xpt")))
-      continue;
-
-    // Java doesn't like being loaded through a symlink, since it uses
-    // its path to find dependent data files.
-    // MakeAbsoluteFilePath calls through to realpath(), which resolves
-    // symlinks.
-    base::FilePath orig_path = path;
-    path = base::MakeAbsoluteFilePath(path);
-    if (path.empty())
-      path = orig_path;
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << "Resolved " << orig_path.value() << " -> " << path.value();
-
-    if (std::find(plugins->begin(), plugins->end(), path) != plugins->end()) {
-      LOG_IF(ERROR, PluginList::DebugPluginLoading())
-          << "Skipping duplicate instance of " << path.value();
-      continue;
-    }
-
-    if (IsBlacklistedPlugin(path)) {
-      LOG_IF(ERROR, PluginList::DebugPluginLoading())
-          << "Skipping blacklisted plugin " << path.value();
-      continue;
-    }
-
-    // Flash stops working if the containing directory involves 'netscape'.
-    // No joke.  So use the other path if it's better.
-    static const char kFlashPlayerFilename[] = "libflashplayer.so";
-    static const char kNetscapeInPath[] = "/netscape/";
-    if (path.BaseName().value() == kFlashPlayerFilename &&
-        path.value().find(kNetscapeInPath) != std::string::npos) {
-      if (orig_path.value().find(kNetscapeInPath) == std::string::npos) {
-        // Go back to the old path.
-        path = orig_path;
-      } else {
-        LOG_IF(ERROR, PluginList::DebugPluginLoading())
-            << "Flash misbehaves when used from a directory containing "
-            << kNetscapeInPath << ", so skipping " << orig_path.value();
-        continue;
-      }
-    }
-
-    // Get mtime.
-    base::File::Info info;
-    if (!base::GetFileInfo(path, &info))
-      continue;
-
-    files.push_back(std::make_pair(path, info.last_modified));
-  }
-
-  // Sort the file list by time (and filename).
-  std::sort(files.begin(), files.end(), CompareTime);
-
-  // Load the files in order.
-  for (FileTimeList::const_iterator i = files.begin(); i != files.end(); ++i) {
-    plugins->push_back(i->first);
-  }
+void PluginList::GetPluginsInDir(const base::FilePath& dir_path,
+                                 std::vector<base::FilePath>* plugins) {
 }
 
 bool PluginList::ShouldLoadPluginUsingPluginList(
-    const WebPluginInfo& info, std::vector<WebPluginInfo>* plugins) {
+    const WebPluginInfo& info,
+    std::vector<WebPluginInfo>* plugins) {
   LOG_IF(ERROR, PluginList::DebugPluginLoading())
       << "Considering " << info.path.value() << " (" << info.name << ")";
 
-  if (IsUndesirablePlugin(info)) {
-    LOG_IF(ERROR, PluginList::DebugPluginLoading())
-        << info.path.value() << " is undesirable.";
-
-    // See if we have a better version of this plugin.
-    for (size_t j = 0; j < plugins->size(); ++j) {
-      if ((*plugins)[j].name == info.name &&
-          !IsUndesirablePlugin((*plugins)[j])) {
-        // Skip the current undesirable one so we can use the better one
-        // we just found.
-        LOG_IF(ERROR, PluginList::DebugPluginLoading())
-            << "Skipping " << info.path.value() << ", preferring "
-            << (*plugins)[j].path.value();
-        return false;
-      }
-    }
+  if (info.type == WebPluginInfo::PLUGIN_TYPE_NPAPI) {
+    NOTREACHED() << "NPAPI plugins are not supported";
+    return false;
   }
 
-  // TODO(evanm): prefer the newest version of flash, etc. here?
-
   VLOG_IF(1, PluginList::DebugPluginLoading()) << "Using " << info.path.value();
-
   return true;
 }
 
diff --git a/content/common/plugin_list_unittest.cc b/content/common/plugin_list_unittest.cc
index 6980699..859ac13 100644
--- a/content/common/plugin_list_unittest.cc
+++ b/content/common/plugin_list_unittest.cc
@@ -136,116 +136,4 @@
   EXPECT_EQ(kFooMimeType, actual_mime_types.front());
 }
 
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
-
-// Test parsing a simple description: Real Audio.
-TEST(MIMEDescriptionParse, Simple) {
-  std::vector<WebPluginMimeType> types;
-  PluginList::ParseMIMEDescription(
-      "audio/x-pn-realaudio-plugin:rpm:RealAudio document;",
-      &types);
-  ASSERT_EQ(1U, types.size());
-  const WebPluginMimeType& type = types[0];
-  EXPECT_EQ("audio/x-pn-realaudio-plugin", type.mime_type);
-  ASSERT_EQ(1U, type.file_extensions.size());
-  EXPECT_EQ("rpm", type.file_extensions[0]);
-  EXPECT_EQ(base::ASCIIToUTF16("RealAudio document"), type.description);
-}
-
-// Test parsing a multi-entry description: QuickTime as provided by Totem.
-TEST(MIMEDescriptionParse, Multi) {
-  std::vector<WebPluginMimeType> types;
-  PluginList::ParseMIMEDescription(
-      "video/quicktime:mov:QuickTime video;video/mp4:mp4:MPEG-4 "
-      "video;image/x-macpaint:pntg:MacPaint Bitmap image;image/x"
-      "-quicktime:pict, pict1, pict2:QuickTime image;video/x-m4v"
-      ":m4v:MPEG-4 video;",
-      &types);
-
-  ASSERT_EQ(5U, types.size());
-
-  // Check the x-quicktime one, since it looks tricky with spaces in the
-  // extension list.
-  const WebPluginMimeType& type = types[3];
-  EXPECT_EQ("image/x-quicktime", type.mime_type);
-  ASSERT_EQ(3U, type.file_extensions.size());
-  EXPECT_EQ("pict2", type.file_extensions[2]);
-  EXPECT_EQ(base::ASCIIToUTF16("QuickTime image"), type.description);
-}
-
-// Test parsing a Japanese description, since we got this wrong in the past.
-// This comes from loading Totem with LANG=ja_JP.UTF-8.
-TEST(MIMEDescriptionParse, JapaneseUTF8) {
-  std::vector<WebPluginMimeType> types;
-  PluginList::ParseMIMEDescription(
-      "audio/x-ogg:ogg:Ogg \xe3\x82\xaa\xe3\x83\xbc\xe3\x83\x87"
-      "\xe3\x82\xa3\xe3\x83\xaa",
-      &types);
-
-  ASSERT_EQ(1U, types.size());
-  // Check we got the right number of Unicode characters out of the parse.
-  EXPECT_EQ(9U, types[0].description.size());
-}
-
-// Test that we handle corner cases gracefully.
-TEST(MIMEDescriptionParse, CornerCases) {
-  std::vector<WebPluginMimeType> types;
-  PluginList::ParseMIMEDescription("mime/type:", &types);
-  EXPECT_TRUE(types.empty());
-
-  types.clear();
-  PluginList::ParseMIMEDescription("mime/type:ext1:", &types);
-  ASSERT_EQ(1U, types.size());
-  EXPECT_EQ("mime/type", types[0].mime_type);
-  EXPECT_EQ(1U, types[0].file_extensions.size());
-  EXPECT_EQ("ext1", types[0].file_extensions[0]);
-  EXPECT_EQ(base::string16(), types[0].description);
-}
-
-// This Java plugin has embedded semicolons in the mime type.
-TEST(MIMEDescriptionParse, ComplicatedJava) {
-  std::vector<WebPluginMimeType> types;
-  PluginList::ParseMIMEDescription(
-      "application/x-java-vm:class,jar:IcedTea;application/x-java"
-      "-applet:class,jar:IcedTea;application/x-java-applet;versio"
-      "n=1.1:class,jar:IcedTea;application/x-java-applet;version="
-      "1.1.1:class,jar:IcedTea;application/x-java-applet;version="
-      "1.1.2:class,jar:IcedTea;application/x-java-applet;version="
-      "1.1.3:class,jar:IcedTea;application/x-java-applet;version="
-      "1.2:class,jar:IcedTea;application/x-java-applet;version=1."
-      "2.1:class,jar:IcedTea;application/x-java-applet;version=1."
-      "2.2:class,jar:IcedTea;application/x-java-applet;version=1."
-      "3:class,jar:IcedTea;application/x-java-applet;version=1.3."
-      "1:class,jar:IcedTea;application/x-java-applet;version=1.4:"
-      "class,jar:IcedTea",
-      &types);
-
-  ASSERT_EQ(12U, types.size());
-  for (size_t i = 0; i < types.size(); ++i)
-    EXPECT_EQ(base::ASCIIToUTF16("IcedTea"), types[i].description);
-
-  // Verify that the mime types with semis are coming through ok.
-  EXPECT_TRUE(types[4].mime_type.find(';') != std::string::npos);
-}
-
-// Make sure we understand how to get the version numbers for common Linux
-// plug-ins.
-TEST(PluginDescriptionParse, ExtractVersion) {
-  WebPluginInfo info;
-  PluginList::ExtractVersionString("Shockwave Flash 10.1 r102", &info);
-  EXPECT_EQ(base::ASCIIToUTF16("10.1 r102"), info.version);
-  PluginList::ExtractVersionString("Java(TM) Plug-in 1.6.0_22", &info);
-  EXPECT_EQ(base::ASCIIToUTF16("1.6.0_22"), info.version);
-  // It's actually much more likely for a modern Linux distribution to have
-  // IcedTea.
-  PluginList::ExtractVersionString(
-      "IcedTea-Web Plugin "
-      "(using IcedTea-Web 1.2 (1.2-2ubuntu0.10.04.2))",
-      &info);
-  EXPECT_EQ(base::ASCIIToUTF16("1.2"), info.version);
-}
-
-#endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
-
-
 }  // namespace content
diff --git a/content/common_aidl.target.darwin-arm.mk b/content/common_aidl.target.darwin-arm.mk
index ca3b197..d72141d 100644
--- a/content/common_aidl.target.darwin-arm.mk
+++ b/content/common_aidl.target.darwin-arm.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.darwin-arm64.mk b/content/common_aidl.target.darwin-arm64.mk
index 583fb72..e2d4724 100644
--- a/content/common_aidl.target.darwin-arm64.mk
+++ b/content/common_aidl.target.darwin-arm64.mk
@@ -99,6 +99,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.darwin-mips.mk b/content/common_aidl.target.darwin-mips.mk
index ec3e714..02eac21 100644
--- a/content/common_aidl.target.darwin-mips.mk
+++ b/content/common_aidl.target.darwin-mips.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.darwin-x86.mk b/content/common_aidl.target.darwin-x86.mk
index 82f4ade..f2f3f92 100644
--- a/content/common_aidl.target.darwin-x86.mk
+++ b/content/common_aidl.target.darwin-x86.mk
@@ -103,6 +103,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -187,6 +188,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.darwin-x86_64.mk b/content/common_aidl.target.darwin-x86_64.mk
index 9df41b3..5265078 100644
--- a/content/common_aidl.target.darwin-x86_64.mk
+++ b/content/common_aidl.target.darwin-x86_64.mk
@@ -103,6 +103,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -187,6 +188,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.linux-arm.mk b/content/common_aidl.target.linux-arm.mk
index dcf9384..d08eab6 100644
--- a/content/common_aidl.target.linux-arm.mk
+++ b/content/common_aidl.target.linux-arm.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.linux-arm64.mk b/content/common_aidl.target.linux-arm64.mk
index d3e5a26..aece78b 100644
--- a/content/common_aidl.target.linux-arm64.mk
+++ b/content/common_aidl.target.linux-arm64.mk
@@ -99,6 +99,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.linux-mips.mk b/content/common_aidl.target.linux-mips.mk
index 94142f3..cc33699 100644
--- a/content/common_aidl.target.linux-mips.mk
+++ b/content/common_aidl.target.linux-mips.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.linux-x86.mk b/content/common_aidl.target.linux-x86.mk
index 2b27b09..580b7fa 100644
--- a/content/common_aidl.target.linux-x86.mk
+++ b/content/common_aidl.target.linux-x86.mk
@@ -103,6 +103,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -187,6 +188,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/common_aidl.target.linux-x86_64.mk b/content/common_aidl.target.linux-x86_64.mk
index 00d980e..5f63439 100644
--- a/content/common_aidl.target.linux-x86_64.mk
+++ b/content/common_aidl.target.linux-x86_64.mk
@@ -103,6 +103,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -187,6 +188,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_app_both.target.darwin-arm.mk b/content/content_app_both.target.darwin-arm.mk
index 98be9b7..a02da51 100644
--- a/content/content_app_both.target.darwin-arm.mk
+++ b/content/content_app_both.target.darwin-arm.mk
@@ -90,6 +90,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.darwin-arm64.mk b/content/content_app_both.target.darwin-arm64.mk
index 9ea3856..0e154a0 100644
--- a/content/content_app_both.target.darwin-arm64.mk
+++ b/content/content_app_both.target.darwin-arm64.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -209,6 +210,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.darwin-mips.mk b/content/content_app_both.target.darwin-mips.mk
index 76e991e..5aba1cf 100644
--- a/content/content_app_both.target.darwin-mips.mk
+++ b/content/content_app_both.target.darwin-mips.mk
@@ -90,6 +90,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.darwin-x86.mk b/content/content_app_both.target.darwin-x86.mk
index bc4148c..d03d738 100644
--- a/content/content_app_both.target.darwin-x86.mk
+++ b/content/content_app_both.target.darwin-x86.mk
@@ -91,6 +91,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DU_USING_ICU_NAMESPACE=0' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DU_USING_ICU_NAMESPACE=0' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_app_both.target.darwin-x86_64.mk b/content/content_app_both.target.darwin-x86_64.mk
index 1f07488..45f6f71 100644
--- a/content/content_app_both.target.darwin-x86_64.mk
+++ b/content/content_app_both.target.darwin-x86_64.mk
@@ -91,6 +91,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -217,6 +218,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.linux-arm.mk b/content/content_app_both.target.linux-arm.mk
index 98be9b7..a02da51 100644
--- a/content/content_app_both.target.linux-arm.mk
+++ b/content/content_app_both.target.linux-arm.mk
@@ -90,6 +90,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.linux-arm64.mk b/content/content_app_both.target.linux-arm64.mk
index 9ea3856..0e154a0 100644
--- a/content/content_app_both.target.linux-arm64.mk
+++ b/content/content_app_both.target.linux-arm64.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -209,6 +210,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.linux-mips.mk b/content/content_app_both.target.linux-mips.mk
index 76e991e..5aba1cf 100644
--- a/content/content_app_both.target.linux-mips.mk
+++ b/content/content_app_both.target.linux-mips.mk
@@ -90,6 +90,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_app_both.target.linux-x86.mk b/content/content_app_both.target.linux-x86.mk
index bc4148c..d03d738 100644
--- a/content/content_app_both.target.linux-x86.mk
+++ b/content/content_app_both.target.linux-x86.mk
@@ -91,6 +91,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DU_USING_ICU_NAMESPACE=0' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -216,6 +217,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DU_USING_ICU_NAMESPACE=0' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_app_both.target.linux-x86_64.mk b/content/content_app_both.target.linux-x86_64.mk
index 1f07488..45f6f71 100644
--- a/content/content_app_both.target.linux-x86_64.mk
+++ b/content/content_app_both.target.linux-x86_64.mk
@@ -91,6 +91,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
@@ -217,6 +218,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DU_USING_ICU_NAMESPACE=0' \
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 25ac91b..41c2c0a 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -83,6 +83,7 @@
     'public/browser/certificate_request_result_type.h',
     'public/browser/content_browser_client.cc',
     'public/browser/content_browser_client.h',
+    'public/browser/context_factory.h',
     'public/browser/cookie_store_factory.h',
     'public/browser/desktop_media_id.cc',
     'public/browser/desktop_media_id.h',
@@ -258,6 +259,8 @@
     'browser/android/browser_startup_controller.h',
     'browser/android/child_process_launcher_android.cc',
     'browser/android/child_process_launcher_android.h',
+    'browser/android/content_readback_handler.cc',
+    'browser/android/content_readback_handler.h',
     'browser/android/content_settings.cc',
     'browser/android/content_settings.h',
     'browser/android/content_startup_flags.cc',
@@ -379,6 +382,7 @@
     'browser/compositor/software_output_device_win.h',
     'browser/compositor/software_output_device_x11.cc',
     'browser/compositor/software_output_device_x11.h',
+    'browser/context_factory.cc',
     'browser/cross_site_request_manager.cc',
     'browser/cross_site_request_manager.h',
     'browser/devtools/devtools_agent_host_impl.cc',
@@ -1665,6 +1669,8 @@
         ['exclude', '^browser/web_contents/touch_editable_impl_aura.h'],
         ['exclude', '^browser/renderer_host/ui_events_helper.cc'],
         ['exclude', '^browser/renderer_host/ui_events_helper.h'],
+        ['exclude', '^browser/context_factory.cc'],
+        ['exclude', '^public/browser/context_factory.h'],
       ],
     }],
     ['use_aura==1 or OS=="mac"', {
diff --git a/content/content_browser.target.darwin-arm.mk b/content/content_browser.target.darwin-arm.mk
index f1155a9..d293c03 100644
--- a/content/content_browser.target.darwin-arm.mk
+++ b/content/content_browser.target.darwin-arm.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -566,6 +567,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.darwin-arm64.mk b/content/content_browser.target.darwin-arm64.mk
index 9f915cb..e489f78 100644
--- a/content/content_browser.target.darwin-arm64.mk
+++ b/content/content_browser.target.darwin-arm64.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -563,6 +564,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -730,6 +732,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.darwin-mips.mk b/content/content_browser.target.darwin-mips.mk
index 8a2c57a..5d440ac 100644
--- a/content/content_browser.target.darwin-mips.mk
+++ b/content/content_browser.target.darwin-mips.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -566,6 +567,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.darwin-x86.mk b/content/content_browser.target.darwin-x86.mk
index d8bd77f..d46f759 100644
--- a/content/content_browser.target.darwin-x86.mk
+++ b/content/content_browser.target.darwin-x86.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -567,6 +568,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_browser.target.darwin-x86_64.mk b/content/content_browser.target.darwin-x86_64.mk
index 5110287..7d54bfc 100644
--- a/content/content_browser.target.darwin-x86_64.mk
+++ b/content/content_browser.target.darwin-x86_64.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -567,6 +568,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -738,6 +740,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.linux-arm.mk b/content/content_browser.target.linux-arm.mk
index f1155a9..d293c03 100644
--- a/content/content_browser.target.linux-arm.mk
+++ b/content/content_browser.target.linux-arm.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -566,6 +567,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.linux-arm64.mk b/content/content_browser.target.linux-arm64.mk
index 9f915cb..e489f78 100644
--- a/content/content_browser.target.linux-arm64.mk
+++ b/content/content_browser.target.linux-arm64.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -563,6 +564,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -730,6 +732,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.linux-mips.mk b/content/content_browser.target.linux-mips.mk
index 8a2c57a..5d440ac 100644
--- a/content/content_browser.target.linux-mips.mk
+++ b/content/content_browser.target.linux-mips.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -566,6 +567,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_browser.target.linux-x86.mk b/content/content_browser.target.linux-x86.mk
index d8bd77f..d46f759 100644
--- a/content/content_browser.target.linux-x86.mk
+++ b/content/content_browser.target.linux-x86.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -567,6 +568,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -737,6 +739,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_browser.target.linux-x86_64.mk b/content/content_browser.target.linux-x86_64.mk
index 5110287..7d54bfc 100644
--- a/content/content_browser.target.linux-x86_64.mk
+++ b/content/content_browser.target.linux-x86_64.mk
@@ -100,6 +100,7 @@
 	content/browser/android/browser_jni_registrar.cc \
 	content/browser/android/browser_startup_controller.cc \
 	content/browser/android/child_process_launcher_android.cc \
+	content/browser/android/content_readback_handler.cc \
 	content/browser/android/content_settings.cc \
 	content/browser/android/content_startup_flags.cc \
 	content/browser/android/content_video_view.cc \
@@ -567,6 +568,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -738,6 +740,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_child.target.darwin-arm.mk b/content/content_child.target.darwin-arm.mk
index 7b86b37..f9c3df6 100644
--- a/content/content_child.target.darwin-arm.mk
+++ b/content/content_child.target.darwin-arm.mk
@@ -167,6 +167,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.darwin-arm64.mk b/content/content_child.target.darwin-arm64.mk
index cc05b03..fbbcdd1 100644
--- a/content/content_child.target.darwin-arm64.mk
+++ b/content/content_child.target.darwin-arm64.mk
@@ -164,6 +164,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -303,6 +304,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.darwin-mips.mk b/content/content_child.target.darwin-mips.mk
index b35db36..ebb197d 100644
--- a/content/content_child.target.darwin-mips.mk
+++ b/content/content_child.target.darwin-mips.mk
@@ -167,6 +167,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.darwin-x86.mk b/content/content_child.target.darwin-x86.mk
index b21b62c..0e96590 100644
--- a/content/content_child.target.darwin-x86.mk
+++ b/content/content_child.target.darwin-x86.mk
@@ -168,6 +168,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.darwin-x86_64.mk b/content/content_child.target.darwin-x86_64.mk
index b7d7290..562471c 100644
--- a/content/content_child.target.darwin-x86_64.mk
+++ b/content/content_child.target.darwin-x86_64.mk
@@ -168,6 +168,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -312,6 +313,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.linux-arm.mk b/content/content_child.target.linux-arm.mk
index 7b86b37..f9c3df6 100644
--- a/content/content_child.target.linux-arm.mk
+++ b/content/content_child.target.linux-arm.mk
@@ -167,6 +167,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.linux-arm64.mk b/content/content_child.target.linux-arm64.mk
index cc05b03..fbbcdd1 100644
--- a/content/content_child.target.linux-arm64.mk
+++ b/content/content_child.target.linux-arm64.mk
@@ -164,6 +164,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -303,6 +304,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.linux-mips.mk b/content/content_child.target.linux-mips.mk
index b35db36..ebb197d 100644
--- a/content/content_child.target.linux-mips.mk
+++ b/content/content_child.target.linux-mips.mk
@@ -167,6 +167,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.linux-x86.mk b/content/content_child.target.linux-x86.mk
index b21b62c..0e96590 100644
--- a/content/content_child.target.linux-x86.mk
+++ b/content/content_child.target.linux-x86.mk
@@ -168,6 +168,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -310,6 +311,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_child.target.linux-x86_64.mk b/content/content_child.target.linux-x86_64.mk
index b7d7290..562471c 100644
--- a/content/content_child.target.linux-x86_64.mk
+++ b/content/content_child.target.linux-x86_64.mk
@@ -168,6 +168,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -312,6 +313,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_common.target.darwin-arm.mk b/content/content_common.target.darwin-arm.mk
index dd34bfe..7460725 100644
--- a/content/content_common.target.darwin-arm.mk
+++ b/content/content_common.target.darwin-arm.mk
@@ -223,6 +223,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
@@ -385,6 +386,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
diff --git a/content/content_common.target.darwin-arm64.mk b/content/content_common.target.darwin-arm64.mk
index 2a2d123..e4a18e8 100644
--- a/content/content_common.target.darwin-arm64.mk
+++ b/content/content_common.target.darwin-arm64.mk
@@ -218,6 +218,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -375,6 +376,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.darwin-mips.mk b/content/content_common.target.darwin-mips.mk
index 6d54cb7..2dd308e 100644
--- a/content/content_common.target.darwin-mips.mk
+++ b/content/content_common.target.darwin-mips.mk
@@ -221,6 +221,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -382,6 +383,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.darwin-x86.mk b/content/content_common.target.darwin-x86.mk
index c695a83..9c9d2c9 100644
--- a/content/content_common.target.darwin-x86.mk
+++ b/content/content_common.target.darwin-x86.mk
@@ -224,6 +224,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -385,6 +386,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.darwin-x86_64.mk b/content/content_common.target.darwin-x86_64.mk
index f5a3222..4a1c672 100644
--- a/content/content_common.target.darwin-x86_64.mk
+++ b/content/content_common.target.darwin-x86_64.mk
@@ -224,6 +224,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
@@ -386,6 +387,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
diff --git a/content/content_common.target.linux-arm.mk b/content/content_common.target.linux-arm.mk
index dd34bfe..7460725 100644
--- a/content/content_common.target.linux-arm.mk
+++ b/content/content_common.target.linux-arm.mk
@@ -223,6 +223,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
@@ -385,6 +386,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
diff --git a/content/content_common.target.linux-arm64.mk b/content/content_common.target.linux-arm64.mk
index 2a2d123..e4a18e8 100644
--- a/content/content_common.target.linux-arm64.mk
+++ b/content/content_common.target.linux-arm64.mk
@@ -218,6 +218,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -375,6 +376,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.linux-mips.mk b/content/content_common.target.linux-mips.mk
index 6d54cb7..2dd308e 100644
--- a/content/content_common.target.linux-mips.mk
+++ b/content/content_common.target.linux-mips.mk
@@ -221,6 +221,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -382,6 +383,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.linux-x86.mk b/content/content_common.target.linux-x86.mk
index c695a83..9c9d2c9 100644
--- a/content/content_common.target.linux-x86.mk
+++ b/content/content_common.target.linux-x86.mk
@@ -224,6 +224,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
@@ -385,6 +386,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
diff --git a/content/content_common.target.linux-x86_64.mk b/content/content_common.target.linux-x86_64.mk
index f5a3222..4a1c672 100644
--- a/content/content_common.target.linux-x86_64.mk
+++ b/content/content_common.target.linux-x86_64.mk
@@ -224,6 +224,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
@@ -386,6 +387,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_SECCOMP_BPF' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DPOSIX_AVOID_MMAP' \
diff --git a/content/content_common_mojo_bindings.target.darwin-arm.mk b/content/content_common_mojo_bindings.target.darwin-arm.mk
index 3d3fecd..c8dc3be 100644
--- a/content/content_common_mojo_bindings.target.darwin-arm.mk
+++ b/content/content_common_mojo_bindings.target.darwin-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -193,6 +194,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.darwin-arm64.mk b/content/content_common_mojo_bindings.target.darwin-arm64.mk
index 4cd9159..34e3f04 100644
--- a/content/content_common_mojo_bindings.target.darwin-arm64.mk
+++ b/content/content_common_mojo_bindings.target.darwin-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.darwin-mips.mk b/content/content_common_mojo_bindings.target.darwin-mips.mk
index 5a6c439..fc51acb 100644
--- a/content/content_common_mojo_bindings.target.darwin-mips.mk
+++ b/content/content_common_mojo_bindings.target.darwin-mips.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -193,6 +194,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.darwin-x86.mk b/content/content_common_mojo_bindings.target.darwin-x86.mk
index 559cb90..8ea9b0b 100644
--- a/content/content_common_mojo_bindings.target.darwin-x86.mk
+++ b/content/content_common_mojo_bindings.target.darwin-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -194,6 +195,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.darwin-x86_64.mk b/content/content_common_mojo_bindings.target.darwin-x86_64.mk
index d07587f..293f58d 100644
--- a/content/content_common_mojo_bindings.target.darwin-x86_64.mk
+++ b/content/content_common_mojo_bindings.target.darwin-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -194,6 +195,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.linux-arm.mk b/content/content_common_mojo_bindings.target.linux-arm.mk
index 3d3fecd..c8dc3be 100644
--- a/content/content_common_mojo_bindings.target.linux-arm.mk
+++ b/content/content_common_mojo_bindings.target.linux-arm.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -193,6 +194,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.linux-arm64.mk b/content/content_common_mojo_bindings.target.linux-arm64.mk
index 4cd9159..34e3f04 100644
--- a/content/content_common_mojo_bindings.target.linux-arm64.mk
+++ b/content/content_common_mojo_bindings.target.linux-arm64.mk
@@ -102,6 +102,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -186,6 +187,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.linux-mips.mk b/content/content_common_mojo_bindings.target.linux-mips.mk
index 5a6c439..fc51acb 100644
--- a/content/content_common_mojo_bindings.target.linux-mips.mk
+++ b/content/content_common_mojo_bindings.target.linux-mips.mk
@@ -105,6 +105,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -193,6 +194,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.linux-x86.mk b/content/content_common_mojo_bindings.target.linux-x86.mk
index 559cb90..8ea9b0b 100644
--- a/content/content_common_mojo_bindings.target.linux-x86.mk
+++ b/content/content_common_mojo_bindings.target.linux-x86.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -194,6 +195,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_common_mojo_bindings.target.linux-x86_64.mk b/content/content_common_mojo_bindings.target.linux-x86_64.mk
index d07587f..293f58d 100644
--- a/content/content_common_mojo_bindings.target.linux-x86_64.mk
+++ b/content/content_common_mojo_bindings.target.linux-x86_64.mk
@@ -106,6 +106,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -194,6 +195,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_gpu.target.darwin-arm.mk b/content/content_gpu.target.darwin-arm.mk
index 253ae53..1ee058f 100644
--- a/content/content_gpu.target.darwin-arm.mk
+++ b/content/content_gpu.target.darwin-arm.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -211,6 +212,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.darwin-arm64.mk b/content/content_gpu.target.darwin-arm64.mk
index a8b4a2d..1bfaac1 100644
--- a/content/content_gpu.target.darwin-arm64.mk
+++ b/content/content_gpu.target.darwin-arm64.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -204,6 +205,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.darwin-mips.mk b/content/content_gpu.target.darwin-mips.mk
index da86a58..8e4bdbe 100644
--- a/content/content_gpu.target.darwin-mips.mk
+++ b/content/content_gpu.target.darwin-mips.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -211,6 +212,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.darwin-x86.mk b/content/content_gpu.target.darwin-x86.mk
index 9f9bb07..8dc1ab0 100644
--- a/content/content_gpu.target.darwin-x86.mk
+++ b/content/content_gpu.target.darwin-x86.mk
@@ -88,6 +88,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -212,6 +213,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.darwin-x86_64.mk b/content/content_gpu.target.darwin-x86_64.mk
index 9adf2ba..434e025 100644
--- a/content/content_gpu.target.darwin-x86_64.mk
+++ b/content/content_gpu.target.darwin-x86_64.mk
@@ -88,6 +88,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -212,6 +213,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.linux-arm.mk b/content/content_gpu.target.linux-arm.mk
index 253ae53..1ee058f 100644
--- a/content/content_gpu.target.linux-arm.mk
+++ b/content/content_gpu.target.linux-arm.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -211,6 +212,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.linux-arm64.mk b/content/content_gpu.target.linux-arm64.mk
index a8b4a2d..1bfaac1 100644
--- a/content/content_gpu.target.linux-arm64.mk
+++ b/content/content_gpu.target.linux-arm64.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -204,6 +205,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.linux-mips.mk b/content/content_gpu.target.linux-mips.mk
index da86a58..8e4bdbe 100644
--- a/content/content_gpu.target.linux-mips.mk
+++ b/content/content_gpu.target.linux-mips.mk
@@ -87,6 +87,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -211,6 +212,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.linux-x86.mk b/content/content_gpu.target.linux-x86.mk
index 9f9bb07..8dc1ab0 100644
--- a/content/content_gpu.target.linux-x86.mk
+++ b/content/content_gpu.target.linux-x86.mk
@@ -88,6 +88,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -212,6 +213,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_gpu.target.linux-x86_64.mk b/content/content_gpu.target.linux-x86_64.mk
index 9adf2ba..434e025 100644
--- a/content/content_gpu.target.linux-x86_64.mk
+++ b/content/content_gpu.target.linux-x86_64.mk
@@ -88,6 +88,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
@@ -212,6 +213,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DSK_ENABLE_INST_COUNT=0' \
 	'-DSK_SUPPORT_GPU=1' \
diff --git a/content/content_jni.gypi b/content/content_jni.gypi
index 9e0f0a9..4418e77 100644
--- a/content/content_jni.gypi
+++ b/content/content_jni.gypi
@@ -15,6 +15,7 @@
     'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java',
     'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java',
     'public/android/java/src/org/chromium/content/browser/ContentSettings.java',
+    'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java',
     'public/android/java/src/org/chromium/content/browser/ContentVideoView.java',
     'public/android/java/src/org/chromium/content/browser/ContentViewCore.java',
     'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java',
diff --git a/content/content_jni_headers.target.darwin-arm.mk b/content/content_jni_headers.target.darwin-arm.mk
index c37449f..ea7435e 100644
--- a/content/content_jni_headers.target.darwin-arm.mk
+++ b/content/content_jni_headers.target.darwin-arm.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -414,6 +425,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -498,6 +510,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.darwin-arm64.mk b/content/content_jni_headers.target.darwin-arm64.mk
index bf40706..bed7dba 100644
--- a/content/content_jni_headers.target.darwin-arm64.mk
+++ b/content/content_jni_headers.target.darwin-arm64.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -411,6 +422,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -491,6 +503,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.darwin-mips.mk b/content/content_jni_headers.target.darwin-mips.mk
index 857e7d5..c3735cf 100644
--- a/content/content_jni_headers.target.darwin-mips.mk
+++ b/content/content_jni_headers.target.darwin-mips.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -414,6 +425,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -498,6 +510,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.darwin-x86.mk b/content/content_jni_headers.target.darwin-x86.mk
index 4c400cd..3492a82 100644
--- a/content/content_jni_headers.target.darwin-x86.mk
+++ b/content/content_jni_headers.target.darwin-x86.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -415,6 +426,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -499,6 +511,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.darwin-x86_64.mk b/content/content_jni_headers.target.darwin-x86_64.mk
index af6f959..fcea0c6 100644
--- a/content/content_jni_headers.target.darwin-x86_64.mk
+++ b/content/content_jni_headers.target.darwin-x86_64.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -415,6 +426,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -499,6 +511,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.linux-arm.mk b/content/content_jni_headers.target.linux-arm.mk
index c37449f..ea7435e 100644
--- a/content/content_jni_headers.target.linux-arm.mk
+++ b/content/content_jni_headers.target.linux-arm.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -414,6 +425,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -498,6 +510,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.linux-arm64.mk b/content/content_jni_headers.target.linux-arm64.mk
index bf40706..bed7dba 100644
--- a/content/content_jni_headers.target.linux-arm64.mk
+++ b/content/content_jni_headers.target.linux-arm64.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -411,6 +422,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -491,6 +503,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.linux-mips.mk b/content/content_jni_headers.target.linux-mips.mk
index 857e7d5..c3735cf 100644
--- a/content/content_jni_headers.target.linux-mips.mk
+++ b/content/content_jni_headers.target.linux-mips.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -414,6 +425,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -498,6 +510,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.linux-x86.mk b/content/content_jni_headers.target.linux-x86.mk
index 4c400cd..3492a82 100644
--- a/content/content_jni_headers.target.linux-x86.mk
+++ b/content/content_jni_headers.target.linux-x86.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -415,6 +426,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -499,6 +511,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_jni_headers.target.linux-x86_64.mk b/content/content_jni_headers.target.linux-x86_64.mk
index af6f959..fcea0c6 100644
--- a/content/content_jni_headers.target.linux-x86_64.mk
+++ b/content/content_jni_headers.target.linux-x86_64.mk
@@ -18,7 +18,7 @@
 
 
 ### Generated for rule "content_content_gyp_content_jni_headers_target_generate_jni_headers":
-# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
+# "{'inputs': ['../base/android/jni_generator/jni_generator.py', '../android_webview/build/jarjar-rules.txt'], 'process_outputs_as_sources': '1', 'extension': 'java', 'outputs': ['$(gyp_shared_intermediate_dir)/content/jni/%(INPUT_ROOT)s_jni.h'], 'rule_name': 'generate_jni_headers', 'rule_sources': ['public/android/java/src/org/chromium/content/app/ChildProcessService.java', 'public/android/java/src/org/chromium/content/app/ContentMain.java', 'public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java', 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java', 'public/android/java/src/org/chromium/content/browser/BrowserStartupController.java', 'public/android/java/src/org/chromium/content/browser/ChildProcessLauncher.java', 'public/android/java/src/org/chromium/content/browser/ContentSettings.java', 'public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java', 'public/android/java/src/org/chromium/content/browser/ContentVideoView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewCore.java', 'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java', 'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java', 'public/android/java/src/org/chromium/content/browser/DeviceSensors.java', 'public/android/java/src/org/chromium/content/browser/DownloadController.java', 'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java', 'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java', 'public/android/java/src/org/chromium/content/browser/InterstitialPageDelegateAndroid.java', 'public/android/java/src/org/chromium/content/browser/LoadUrlParams.java', 'public/android/java/src/org/chromium/content/browser/LocationProviderAdapter.java', 'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java', 'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java', 'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java', 'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java', 'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java', 'public/android/java/src/org/chromium/content/browser/TimeZoneMonitor.java', 'public/android/java/src/org/chromium/content/browser/TouchEventSynthesizer.java', 'public/android/java/src/org/chromium/content/browser/TracingControllerAndroid.java', 'public/android/java/src/org/chromium/content/browser/VibrationProvider.java', 'public/android/java/src/org/chromium/content/browser/WebContentsObserverAndroid.java', 'public/android/java/src/org/chromium/content/browser/framehost/NavigationControllerImpl.java', 'public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java'], 'action': ['../base/android/jni_generator/jni_generator.py', '--input_file', '$(RULE_SOURCES)', '--output_dir', '$(gyp_shared_intermediate_dir)/content/jni', '--includes', 'base/android/jni_generator/jni_generator_helper.h', '--optimize_generation', '0', '--jarjar', '../android_webview/build/jarjar-rules.txt', '--ptr_type', 'long'], 'message': 'Generating JNI bindings from $(RULE_SOURCES)'}":
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ChildProcessService_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -82,6 +82,15 @@
 	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentSettings.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
 
 
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_local_path := $(LOCAL_PATH)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: gyp_shared_intermediate_dir := $(abspath $(gyp_shared_intermediate_dir))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: export PATH := $(subst $(ANDROID_BUILD_PATHS),,$(PATH))
+$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h: $(LOCAL_PATH)/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES)
+	mkdir -p $(gyp_shared_intermediate_dir)/content/jni; cd $(gyp_local_path)/content; ../base/android/jni_generator/jni_generator.py --input_file public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java --output_dir "$(gyp_shared_intermediate_dir)/content/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long
+
+
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_local_path := $(LOCAL_PATH)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_var_prefix := $(GYP_VAR_PREFIX)
 $(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir))
@@ -298,6 +307,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -333,6 +343,7 @@
 	$(gyp_shared_intermediate_dir)/content/jni/BrowserStartupController_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ChildProcessLauncher_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentSettings_jni.h \
+	$(gyp_shared_intermediate_dir)/content/jni/ContentReadbackHandler_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentVideoView_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewCore_jni.h \
 	$(gyp_shared_intermediate_dir)/content/jni/ContentViewRenderView_jni.h \
@@ -415,6 +426,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -499,6 +511,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/content_renderer.target.darwin-arm.mk b/content/content_renderer.target.darwin-arm.mk
index e39cc03..9cb7f38 100644
--- a/content/content_renderer.target.darwin-arm.mk
+++ b/content/content_renderer.target.darwin-arm.mk
@@ -319,6 +319,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.darwin-arm64.mk b/content/content_renderer.target.darwin-arm64.mk
index f569491..ddc28ca 100644
--- a/content/content_renderer.target.darwin-arm64.mk
+++ b/content/content_renderer.target.darwin-arm64.mk
@@ -316,6 +316,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -485,6 +486,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.darwin-mips.mk b/content/content_renderer.target.darwin-mips.mk
index 6570800..fa1b204 100644
--- a/content/content_renderer.target.darwin-mips.mk
+++ b/content/content_renderer.target.darwin-mips.mk
@@ -319,6 +319,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.darwin-x86.mk b/content/content_renderer.target.darwin-x86.mk
index c79504b..3069126 100644
--- a/content/content_renderer.target.darwin-x86.mk
+++ b/content/content_renderer.target.darwin-x86.mk
@@ -320,6 +320,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.darwin-x86_64.mk b/content/content_renderer.target.darwin-x86_64.mk
index 2038b97..147b146 100644
--- a/content/content_renderer.target.darwin-x86_64.mk
+++ b/content/content_renderer.target.darwin-x86_64.mk
@@ -320,6 +320,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -493,6 +494,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.linux-arm.mk b/content/content_renderer.target.linux-arm.mk
index e39cc03..9cb7f38 100644
--- a/content/content_renderer.target.linux-arm.mk
+++ b/content/content_renderer.target.linux-arm.mk
@@ -319,6 +319,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.linux-arm64.mk b/content/content_renderer.target.linux-arm64.mk
index f569491..ddc28ca 100644
--- a/content/content_renderer.target.linux-arm64.mk
+++ b/content/content_renderer.target.linux-arm64.mk
@@ -316,6 +316,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -485,6 +486,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.linux-mips.mk b/content/content_renderer.target.linux-mips.mk
index 6570800..fa1b204 100644
--- a/content/content_renderer.target.linux-mips.mk
+++ b/content/content_renderer.target.linux-mips.mk
@@ -319,6 +319,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.linux-x86.mk b/content/content_renderer.target.linux-x86.mk
index c79504b..3069126 100644
--- a/content/content_renderer.target.linux-x86.mk
+++ b/content/content_renderer.target.linux-x86.mk
@@ -320,6 +320,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -492,6 +493,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_renderer.target.linux-x86_64.mk b/content/content_renderer.target.linux-x86_64.mk
index 2038b97..147b146 100644
--- a/content/content_renderer.target.linux-x86_64.mk
+++ b/content/content_renderer.target.linux-x86_64.mk
@@ -320,6 +320,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
@@ -493,6 +494,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DLIBPEERCONNECTION_LIB=1' \
 	'-DMEDIA_DISABLE_LIBVPX' \
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index ccf43f0..b7fe252 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -892,6 +892,11 @@
             'browser/geolocation/wifi_data_provider_linux_unittest.cc',
           ],
         }],
+        ['OS!="win" and OS!="mac"', {
+          'sources!': [
+            'common/plugin_list_unittest.cc',
+          ],
+        }],
       ],
     },
   ],
diff --git a/content/content_utility.target.darwin-arm.mk b/content/content_utility.target.darwin-arm.mk
index 4e731e8..42167cb 100644
--- a/content/content_utility.target.darwin-arm.mk
+++ b/content/content_utility.target.darwin-arm.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.darwin-arm64.mk b/content/content_utility.target.darwin-arm64.mk
index 2f44e2e..b4634e3 100644
--- a/content/content_utility.target.darwin-arm64.mk
+++ b/content/content_utility.target.darwin-arm64.mk
@@ -81,6 +81,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -172,6 +173,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.darwin-mips.mk b/content/content_utility.target.darwin-mips.mk
index 044dc54..b50a09b 100644
--- a/content/content_utility.target.darwin-mips.mk
+++ b/content/content_utility.target.darwin-mips.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.darwin-x86.mk b/content/content_utility.target.darwin-x86.mk
index ff69d87..3a01802 100644
--- a/content/content_utility.target.darwin-x86.mk
+++ b/content/content_utility.target.darwin-x86.mk
@@ -85,6 +85,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -180,6 +181,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.darwin-x86_64.mk b/content/content_utility.target.darwin-x86_64.mk
index 5cabe8d..b7e3686 100644
--- a/content/content_utility.target.darwin-x86_64.mk
+++ b/content/content_utility.target.darwin-x86_64.mk
@@ -85,6 +85,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -180,6 +181,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.linux-arm.mk b/content/content_utility.target.linux-arm.mk
index 4e731e8..42167cb 100644
--- a/content/content_utility.target.linux-arm.mk
+++ b/content/content_utility.target.linux-arm.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.linux-arm64.mk b/content/content_utility.target.linux-arm64.mk
index 2f44e2e..b4634e3 100644
--- a/content/content_utility.target.linux-arm64.mk
+++ b/content/content_utility.target.linux-arm64.mk
@@ -81,6 +81,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -172,6 +173,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.linux-mips.mk b/content/content_utility.target.linux-mips.mk
index 044dc54..b50a09b 100644
--- a/content/content_utility.target.linux-mips.mk
+++ b/content/content_utility.target.linux-mips.mk
@@ -84,6 +84,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -179,6 +180,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.linux-x86.mk b/content/content_utility.target.linux-x86.mk
index ff69d87..3a01802 100644
--- a/content/content_utility.target.linux-x86.mk
+++ b/content/content_utility.target.linux-x86.mk
@@ -85,6 +85,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -180,6 +181,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/content_utility.target.linux-x86_64.mk b/content/content_utility.target.linux-x86_64.mk
index 5cabe8d..b7e3686 100644
--- a/content/content_utility.target.linux-x86_64.mk
+++ b/content/content_utility.target.linux-x86_64.mk
@@ -85,6 +85,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
@@ -180,6 +181,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DMOJO_USE_SYSTEM_IMPL' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
diff --git a/content/gesture_event_type_java.target.darwin-arm.mk b/content/gesture_event_type_java.target.darwin-arm.mk
index b581a7e..8b30ef5 100644
--- a/content/gesture_event_type_java.target.darwin-arm.mk
+++ b/content/gesture_event_type_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.darwin-arm64.mk b/content/gesture_event_type_java.target.darwin-arm64.mk
index 2c2735e..0e6f257 100644
--- a/content/gesture_event_type_java.target.darwin-arm64.mk
+++ b/content/gesture_event_type_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.darwin-mips.mk b/content/gesture_event_type_java.target.darwin-mips.mk
index 71b5c82..ce55293 100644
--- a/content/gesture_event_type_java.target.darwin-mips.mk
+++ b/content/gesture_event_type_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.darwin-x86.mk b/content/gesture_event_type_java.target.darwin-x86.mk
index 384b329..d41bc05 100644
--- a/content/gesture_event_type_java.target.darwin-x86.mk
+++ b/content/gesture_event_type_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.darwin-x86_64.mk b/content/gesture_event_type_java.target.darwin-x86_64.mk
index 566c63a..78c2a47 100644
--- a/content/gesture_event_type_java.target.darwin-x86_64.mk
+++ b/content/gesture_event_type_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.linux-arm.mk b/content/gesture_event_type_java.target.linux-arm.mk
index b581a7e..8b30ef5 100644
--- a/content/gesture_event_type_java.target.linux-arm.mk
+++ b/content/gesture_event_type_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.linux-arm64.mk b/content/gesture_event_type_java.target.linux-arm64.mk
index 2c2735e..0e6f257 100644
--- a/content/gesture_event_type_java.target.linux-arm64.mk
+++ b/content/gesture_event_type_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.linux-mips.mk b/content/gesture_event_type_java.target.linux-mips.mk
index 71b5c82..ce55293 100644
--- a/content/gesture_event_type_java.target.linux-mips.mk
+++ b/content/gesture_event_type_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.linux-x86.mk b/content/gesture_event_type_java.target.linux-x86.mk
index 384b329..d41bc05 100644
--- a/content/gesture_event_type_java.target.linux-x86.mk
+++ b/content/gesture_event_type_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/gesture_event_type_java.target.linux-x86_64.mk b/content/gesture_event_type_java.target.linux-x86_64.mk
index 566c63a..78c2a47 100644
--- a/content/gesture_event_type_java.target.linux-x86_64.mk
+++ b/content/gesture_event_type_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.darwin-arm.mk b/content/java_set_jni_headers.target.darwin-arm.mk
index 72bd9b9..bdbd309 100644
--- a/content/java_set_jni_headers.target.darwin-arm.mk
+++ b/content/java_set_jni_headers.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.darwin-arm64.mk b/content/java_set_jni_headers.target.darwin-arm64.mk
index 9fb9092..2c4cf92 100644
--- a/content/java_set_jni_headers.target.darwin-arm64.mk
+++ b/content/java_set_jni_headers.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.darwin-mips.mk b/content/java_set_jni_headers.target.darwin-mips.mk
index fd8bdd2..a77e925 100644
--- a/content/java_set_jni_headers.target.darwin-mips.mk
+++ b/content/java_set_jni_headers.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.darwin-x86.mk b/content/java_set_jni_headers.target.darwin-x86.mk
index 705d954..b9da82e 100644
--- a/content/java_set_jni_headers.target.darwin-x86.mk
+++ b/content/java_set_jni_headers.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.darwin-x86_64.mk b/content/java_set_jni_headers.target.darwin-x86_64.mk
index 01ed935..74cb8b2 100644
--- a/content/java_set_jni_headers.target.darwin-x86_64.mk
+++ b/content/java_set_jni_headers.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.linux-arm.mk b/content/java_set_jni_headers.target.linux-arm.mk
index 72bd9b9..bdbd309 100644
--- a/content/java_set_jni_headers.target.linux-arm.mk
+++ b/content/java_set_jni_headers.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.linux-arm64.mk b/content/java_set_jni_headers.target.linux-arm64.mk
index 9fb9092..2c4cf92 100644
--- a/content/java_set_jni_headers.target.linux-arm64.mk
+++ b/content/java_set_jni_headers.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.linux-mips.mk b/content/java_set_jni_headers.target.linux-mips.mk
index fd8bdd2..a77e925 100644
--- a/content/java_set_jni_headers.target.linux-mips.mk
+++ b/content/java_set_jni_headers.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.linux-x86.mk b/content/java_set_jni_headers.target.linux-x86.mk
index 705d954..b9da82e 100644
--- a/content/java_set_jni_headers.target.linux-x86.mk
+++ b/content/java_set_jni_headers.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/java_set_jni_headers.target.linux-x86_64.mk b/content/java_set_jni_headers.target.linux-x86_64.mk
index 01ed935..74cb8b2 100644
--- a/content/java_set_jni_headers.target.linux-x86_64.mk
+++ b/content/java_set_jni_headers.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.darwin-arm.mk b/content/motionevent_jni_headers.target.darwin-arm.mk
index c81f198..be48953 100644
--- a/content/motionevent_jni_headers.target.darwin-arm.mk
+++ b/content/motionevent_jni_headers.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.darwin-arm64.mk b/content/motionevent_jni_headers.target.darwin-arm64.mk
index 0059f2b..1c1b09f 100644
--- a/content/motionevent_jni_headers.target.darwin-arm64.mk
+++ b/content/motionevent_jni_headers.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.darwin-mips.mk b/content/motionevent_jni_headers.target.darwin-mips.mk
index 7590a89..e262cea 100644
--- a/content/motionevent_jni_headers.target.darwin-mips.mk
+++ b/content/motionevent_jni_headers.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.darwin-x86.mk b/content/motionevent_jni_headers.target.darwin-x86.mk
index 05bd214..3bcc5ec 100644
--- a/content/motionevent_jni_headers.target.darwin-x86.mk
+++ b/content/motionevent_jni_headers.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.darwin-x86_64.mk b/content/motionevent_jni_headers.target.darwin-x86_64.mk
index 5612f29..adcd2a4 100644
--- a/content/motionevent_jni_headers.target.darwin-x86_64.mk
+++ b/content/motionevent_jni_headers.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.linux-arm.mk b/content/motionevent_jni_headers.target.linux-arm.mk
index c81f198..be48953 100644
--- a/content/motionevent_jni_headers.target.linux-arm.mk
+++ b/content/motionevent_jni_headers.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.linux-arm64.mk b/content/motionevent_jni_headers.target.linux-arm64.mk
index 0059f2b..1c1b09f 100644
--- a/content/motionevent_jni_headers.target.linux-arm64.mk
+++ b/content/motionevent_jni_headers.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.linux-mips.mk b/content/motionevent_jni_headers.target.linux-mips.mk
index 7590a89..e262cea 100644
--- a/content/motionevent_jni_headers.target.linux-mips.mk
+++ b/content/motionevent_jni_headers.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.linux-x86.mk b/content/motionevent_jni_headers.target.linux-x86.mk
index 05bd214..3bcc5ec 100644
--- a/content/motionevent_jni_headers.target.linux-x86.mk
+++ b/content/motionevent_jni_headers.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/motionevent_jni_headers.target.linux-x86_64.mk b/content/motionevent_jni_headers.target.linux-x86_64.mk
index 5612f29..adcd2a4 100644
--- a/content/motionevent_jni_headers.target.linux-x86_64.mk
+++ b/content/motionevent_jni_headers.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.darwin-arm.mk b/content/page_transition_types_java.target.darwin-arm.mk
index 71a35ee..9792300 100644
--- a/content/page_transition_types_java.target.darwin-arm.mk
+++ b/content/page_transition_types_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.darwin-arm64.mk b/content/page_transition_types_java.target.darwin-arm64.mk
index 6a1d741..a6ab84b 100644
--- a/content/page_transition_types_java.target.darwin-arm64.mk
+++ b/content/page_transition_types_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.darwin-mips.mk b/content/page_transition_types_java.target.darwin-mips.mk
index 17090de..ff33ad6 100644
--- a/content/page_transition_types_java.target.darwin-mips.mk
+++ b/content/page_transition_types_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.darwin-x86.mk b/content/page_transition_types_java.target.darwin-x86.mk
index f754f8a..d49e350 100644
--- a/content/page_transition_types_java.target.darwin-x86.mk
+++ b/content/page_transition_types_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.darwin-x86_64.mk b/content/page_transition_types_java.target.darwin-x86_64.mk
index 199a32e..d846045 100644
--- a/content/page_transition_types_java.target.darwin-x86_64.mk
+++ b/content/page_transition_types_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.linux-arm.mk b/content/page_transition_types_java.target.linux-arm.mk
index 71a35ee..9792300 100644
--- a/content/page_transition_types_java.target.linux-arm.mk
+++ b/content/page_transition_types_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.linux-arm64.mk b/content/page_transition_types_java.target.linux-arm64.mk
index 6a1d741..a6ab84b 100644
--- a/content/page_transition_types_java.target.linux-arm64.mk
+++ b/content/page_transition_types_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.linux-mips.mk b/content/page_transition_types_java.target.linux-mips.mk
index 17090de..ff33ad6 100644
--- a/content/page_transition_types_java.target.linux-mips.mk
+++ b/content/page_transition_types_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.linux-x86.mk b/content/page_transition_types_java.target.linux-x86.mk
index f754f8a..d49e350 100644
--- a/content/page_transition_types_java.target.linux-x86.mk
+++ b/content/page_transition_types_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/page_transition_types_java.target.linux-x86_64.mk b/content/page_transition_types_java.target.linux-x86_64.mk
index 199a32e..d846045 100644
--- a/content/page_transition_types_java.target.linux-x86_64.mk
+++ b/content/page_transition_types_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.darwin-arm.mk b/content/popup_item_type_java.target.darwin-arm.mk
index 860c193..8d1cee1 100644
--- a/content/popup_item_type_java.target.darwin-arm.mk
+++ b/content/popup_item_type_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.darwin-arm64.mk b/content/popup_item_type_java.target.darwin-arm64.mk
index 98d7ec7..eb15ab4 100644
--- a/content/popup_item_type_java.target.darwin-arm64.mk
+++ b/content/popup_item_type_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.darwin-mips.mk b/content/popup_item_type_java.target.darwin-mips.mk
index f901d1a..335d820 100644
--- a/content/popup_item_type_java.target.darwin-mips.mk
+++ b/content/popup_item_type_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.darwin-x86.mk b/content/popup_item_type_java.target.darwin-x86.mk
index a8556f5..ca591a5 100644
--- a/content/popup_item_type_java.target.darwin-x86.mk
+++ b/content/popup_item_type_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.darwin-x86_64.mk b/content/popup_item_type_java.target.darwin-x86_64.mk
index 17d1cfb..8f56918 100644
--- a/content/popup_item_type_java.target.darwin-x86_64.mk
+++ b/content/popup_item_type_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.linux-arm.mk b/content/popup_item_type_java.target.linux-arm.mk
index 860c193..8d1cee1 100644
--- a/content/popup_item_type_java.target.linux-arm.mk
+++ b/content/popup_item_type_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.linux-arm64.mk b/content/popup_item_type_java.target.linux-arm64.mk
index 98d7ec7..eb15ab4 100644
--- a/content/popup_item_type_java.target.linux-arm64.mk
+++ b/content/popup_item_type_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.linux-mips.mk b/content/popup_item_type_java.target.linux-mips.mk
index f901d1a..335d820 100644
--- a/content/popup_item_type_java.target.linux-mips.mk
+++ b/content/popup_item_type_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.linux-x86.mk b/content/popup_item_type_java.target.linux-x86.mk
index a8556f5..ca591a5 100644
--- a/content/popup_item_type_java.target.linux-x86.mk
+++ b/content/popup_item_type_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/popup_item_type_java.target.linux-x86_64.mk b/content/popup_item_type_java.target.linux-x86_64.mk
index 17d1cfb..8f56918 100644
--- a/content/popup_item_type_java.target.linux-x86_64.mk
+++ b/content/popup_item_type_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java b/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java
new file mode 100644
index 0000000..f3d4442
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentReadbackHandler.java
@@ -0,0 +1,108 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.util.SparseArray;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+import org.chromium.base.ThreadUtils;
+
+/**
+ * A class for reading back content.
+ */
+@JNINamespace("content")
+public abstract class ContentReadbackHandler {
+    /**
+     * A callback interface for content readback into a bitmap.
+     */
+    public static interface GetContentBitmapCallback {
+        /**
+         * Called when the content readback finishes.
+         * @param success    Indicates whether the readback succeeded or not.
+         * @param bitmap     The {@link Bitmap} of the content.
+         */
+        public void onFinishGetContentBitmap(boolean success, Bitmap bitmap);
+    }
+
+    private int mNextReadbackId = 1;
+    private SparseArray<GetContentBitmapCallback> mGetContentBitmapRequests;
+
+    private long mNativeContentReadbackHandler;
+
+    /**
+     * Creates a {@link ContentReadbackHandler}.
+     */
+    public ContentReadbackHandler() {
+        mGetContentBitmapRequests = new SparseArray<GetContentBitmapCallback>();
+    }
+
+    /**
+     * Initialize the native object.
+     */
+    public void initNativeContentReadbackHandler() {
+        mNativeContentReadbackHandler = nativeInit();
+    }
+
+    /**
+     * Should be called when the ContentReadackHandler is not needed anymore.
+     */
+    public void destroy() {
+        nativeDestroy(mNativeContentReadbackHandler);
+        mNativeContentReadbackHandler = 0;
+    }
+
+
+    @CalledByNative
+    private void notifyGetContentBitmapFinished(int readbackId, boolean success, Bitmap bitmap) {
+        GetContentBitmapCallback callback = mGetContentBitmapRequests.get(readbackId);
+        if (callback != null) {
+            mGetContentBitmapRequests.delete(readbackId);
+            callback.onFinishGetContentBitmap(success, bitmap);
+        } else {
+            // readback Id is unregistered.
+            assert false : "Readback finished for unregistered Id: " + readbackId;
+        }
+    }
+
+    /**
+     * Asynchronously, generate and grab a bitmap representing what is currently on the screen
+     * for {@code view}.
+     *
+     * @param scale The scale that should be applied to the content.
+     * @param srcRect  A subrect of the original content to capture. If this is empty, it will grab
+     *                 the whole surface.
+     * @param view  The {@link ContentViewCore} to grab the bitmap from.
+     * @param callback The callback to be executed after readback completes.
+     */
+    public void getContentBitmapAsync(float scale, Rect srcRect, ContentViewCore view,
+            GetContentBitmapCallback callback) {
+        if (!readyForReadback()) {
+            callback.onFinishGetContentBitmap(false, null);
+            return;
+        }
+        ThreadUtils.assertOnUiThread();
+
+        int readbackId = mNextReadbackId++;
+        mGetContentBitmapRequests.put(readbackId, callback);
+        nativeGetContentBitmap(mNativeContentReadbackHandler, readbackId, scale,
+                Bitmap.Config.ARGB_8888, srcRect.top, srcRect.left, srcRect.width(),
+                srcRect.height(), view);
+    }
+
+    /**
+     * Implemented by the owner of this class to signal whether readback is possible or not.
+     * @return Whether readback is possible or not.
+     */
+    protected abstract boolean readyForReadback();
+
+    private native long nativeInit();
+    private native void nativeDestroy(long nativeContentReadbackHandler);
+    private native void nativeGetContentBitmap(long nativeContentReadbackHandler, int readback_id,
+            float scale, Bitmap.Config config, float x, float y, float width, float height,
+            Object contentViewCore);
+}
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
index 6759697..11c2379 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java
@@ -43,6 +43,8 @@
 
     protected ContentViewCore mContentViewCore;
 
+    private ContentReadbackHandler mContentReadbackHandler;
+
     private final Runnable mRenderRunnable = new Runnable() {
         @Override
         public void run() {
@@ -102,6 +104,14 @@
                 new FrameLayout.LayoutParams(
                         FrameLayout.LayoutParams.MATCH_PARENT,
                         FrameLayout.LayoutParams.MATCH_PARENT));
+
+        mContentReadbackHandler = new ContentReadbackHandler() {
+            @Override
+            protected boolean readyForReadback() {
+                return mNativeContentViewRenderView != 0 && mContentViewCore != null;
+            }
+        };
+        mContentReadbackHandler.initNativeContentReadbackHandler();
     }
 
     @Override
@@ -118,6 +128,13 @@
     }
 
     /**
+     * @return The content readback handler.
+     */
+    public ContentReadbackHandler getContentReadbackHandler() {
+        return mContentReadbackHandler;
+    }
+
+    /**
      * Sets the background color of the surface view.  This method is necessary because the
      * background color of ContentViewRenderView itself is covered by the background of
      * SurfaceView.
@@ -134,6 +151,8 @@
      * native resource can be freed.
      */
     public void destroy() {
+        mContentReadbackHandler.destroy();
+        mContentReadbackHandler = null;
         mRootWindow.setVSyncClient(null);
         mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
         nativeDestroy(mNativeContentViewRenderView);
@@ -167,18 +186,7 @@
      * @return The created SurfaceView object.
      */
     protected SurfaceView createSurfaceView(Context context) {
-        return new SurfaceView(context) {
-            @Override
-            public void onDraw(Canvas canvas) {
-                // We only need to draw to software canvases, which are used for taking screenshots.
-                if (canvas.isHardwareAccelerated()) return;
-                Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
-                        Bitmap.Config.ARGB_8888);
-                if (nativeCompositeToBitmap(mNativeContentViewRenderView, bitmap)) {
-                    canvas.drawBitmap(bitmap, 0, 0, null);
-                }
-            }
-        };
+        return new SurfaceView(context);
     }
 
     /**
@@ -269,7 +277,6 @@
     private native void nativeSurfaceChanged(long nativeContentViewRenderView,
             int format, int width, int height, Surface surface);
     private native boolean nativeComposite(long nativeContentViewRenderView);
-    private native boolean nativeCompositeToBitmap(long nativeContentViewRenderView, Bitmap bitmap);
     private native void nativeSetOverlayVideoMode(long nativeContentViewRenderView,
             boolean enabled);
 }
diff --git a/content/public/browser/context_factory.h b/content/public/browser/context_factory.h
new file mode 100644
index 0000000..07f2462
--- /dev/null
+++ b/content/public/browser/context_factory.h
@@ -0,0 +1,22 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_CONTEXT_FACTORY_H_
+#define CONTENT_PUBLIC_BROWSER_CONTEXT_FACTORY_H_
+
+#include "content/common/content_export.h"
+
+namespace ui {
+class ContextFactory;
+}
+
+namespace content {
+
+// Returns the singleton ContextFactory used by content. The return value is
+// owned by content.
+CONTENT_EXPORT ui::ContextFactory* GetContextFactory();
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_CONTEXT_FACTORY_H_
diff --git a/content/renderer/media/websourcebuffer_impl.cc b/content/renderer/media/websourcebuffer_impl.cc
index 93a996b..1b8e4fa 100644
--- a/content/renderer/media/websourcebuffer_impl.cc
+++ b/content/renderer/media/websourcebuffer_impl.cc
@@ -108,6 +108,11 @@
     return false;
 
   timestamp_offset_ = DoubleToTimeDelta(offset);
+
+  // http://www.w3.org/TR/media-source/#widl-SourceBuffer-timestampOffset
+  // Step 6: If the mode attribute equals "sequence", then set the group start
+  // timestamp to new timestamp offset.
+  demuxer_->SetGroupStartTimestampIfInSequenceMode(id_, timestamp_offset_);
   return true;
 }
 
diff --git a/content/renderer/web_ui_setup_impl.cc b/content/renderer/web_ui_setup_impl.cc
index e4c065f..7cb7cda 100644
--- a/content/renderer/web_ui_setup_impl.cc
+++ b/content/renderer/web_ui_setup_impl.cc
@@ -11,15 +11,11 @@
 
 // static
 void WebUISetupImpl::Bind(mojo::ScopedMessagePipeHandle handle) {
-  // This instance will be destroyed when the pipe is closed. See OnError.
-  new WebUISetupImpl(handle.Pass());
+  mojo::BindToPipe(new WebUISetupImpl(), handle.Pass());
 }
 
-WebUISetupImpl::WebUISetupImpl(mojo::ScopedMessagePipeHandle handle)
-    : client_(ScopedWebUISetupClientHandle::From(handle.Pass()), this) {
-}
-
-WebUISetupImpl::~WebUISetupImpl() {
+void WebUISetupImpl::OnConnectionError() {
+  delete this;
 }
 
 void WebUISetupImpl::SetWebUIHandle(
@@ -34,8 +30,4 @@
   web_ui_mojo->SetBrowserHandle(web_ui_handle.Pass());
 }
 
-void WebUISetupImpl::OnError() {
-  delete this;
-}
-
 }  // namespace content
diff --git a/content/renderer/web_ui_setup_impl.h b/content/renderer/web_ui_setup_impl.h
index 1bfc6ca..6523454 100644
--- a/content/renderer/web_ui_setup_impl.h
+++ b/content/renderer/web_ui_setup_impl.h
@@ -7,30 +7,23 @@
 
 #include "base/basictypes.h"
 #include "content/common/web_ui_setup.mojom.h"
-#include "mojo/public/cpp/bindings/error_handler.h"
-#include "mojo/public/cpp/bindings/remote_ptr.h"
 
 namespace content {
 
-class WebUISetupImpl : public WebUISetup,
-                       public mojo::ErrorHandler {
+class WebUISetupImpl : public mojo::InterfaceImpl<WebUISetup> {
  public:
   static void Bind(mojo::ScopedMessagePipeHandle handle);
 
  private:
-  explicit WebUISetupImpl(mojo::ScopedMessagePipeHandle handle);
-  virtual ~WebUISetupImpl();
+  WebUISetupImpl() {}
+
+  virtual void OnConnectionError() OVERRIDE;
 
   // WebUISetup methods:
   virtual void SetWebUIHandle(
       int32_t view_routing_id,
       mojo::ScopedMessagePipeHandle web_ui_handle) OVERRIDE;
 
-  // mojo::ErrorHandler methods:
-  virtual void OnError() OVERRIDE;
-
-  mojo::RemotePtr<WebUISetupClient> client_;
-
   DISALLOW_COPY_AND_ASSIGN(WebUISetupImpl);
 };
 
diff --git a/content/result_codes_java.target.darwin-arm.mk b/content/result_codes_java.target.darwin-arm.mk
index 8e52139..0947c77 100644
--- a/content/result_codes_java.target.darwin-arm.mk
+++ b/content/result_codes_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.darwin-arm64.mk b/content/result_codes_java.target.darwin-arm64.mk
index a57ad6e..d125a11 100644
--- a/content/result_codes_java.target.darwin-arm64.mk
+++ b/content/result_codes_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.darwin-mips.mk b/content/result_codes_java.target.darwin-mips.mk
index 773c4cd..4413f63 100644
--- a/content/result_codes_java.target.darwin-mips.mk
+++ b/content/result_codes_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.darwin-x86.mk b/content/result_codes_java.target.darwin-x86.mk
index ed345b9..c14ac1b 100644
--- a/content/result_codes_java.target.darwin-x86.mk
+++ b/content/result_codes_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.darwin-x86_64.mk b/content/result_codes_java.target.darwin-x86_64.mk
index c37fc9c..987436a 100644
--- a/content/result_codes_java.target.darwin-x86_64.mk
+++ b/content/result_codes_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.linux-arm.mk b/content/result_codes_java.target.linux-arm.mk
index 8e52139..0947c77 100644
--- a/content/result_codes_java.target.linux-arm.mk
+++ b/content/result_codes_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.linux-arm64.mk b/content/result_codes_java.target.linux-arm64.mk
index a57ad6e..d125a11 100644
--- a/content/result_codes_java.target.linux-arm64.mk
+++ b/content/result_codes_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.linux-mips.mk b/content/result_codes_java.target.linux-mips.mk
index 773c4cd..4413f63 100644
--- a/content/result_codes_java.target.linux-mips.mk
+++ b/content/result_codes_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.linux-x86.mk b/content/result_codes_java.target.linux-x86.mk
index ed345b9..c14ac1b 100644
--- a/content/result_codes_java.target.linux-x86.mk
+++ b/content/result_codes_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/result_codes_java.target.linux-x86_64.mk b/content/result_codes_java.target.linux-x86_64.mk
index c37fc9c..987436a 100644
--- a/content/result_codes_java.target.linux-x86_64.mk
+++ b/content/result_codes_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.darwin-arm.mk b/content/screen_orientation_values_java.target.darwin-arm.mk
index fc61918..955c6c5 100644
--- a/content/screen_orientation_values_java.target.darwin-arm.mk
+++ b/content/screen_orientation_values_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.darwin-arm64.mk b/content/screen_orientation_values_java.target.darwin-arm64.mk
index 5b24642..4decb62 100644
--- a/content/screen_orientation_values_java.target.darwin-arm64.mk
+++ b/content/screen_orientation_values_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.darwin-mips.mk b/content/screen_orientation_values_java.target.darwin-mips.mk
index a37a815..6af4d9e 100644
--- a/content/screen_orientation_values_java.target.darwin-mips.mk
+++ b/content/screen_orientation_values_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.darwin-x86.mk b/content/screen_orientation_values_java.target.darwin-x86.mk
index 673b0ef..bb8f665 100644
--- a/content/screen_orientation_values_java.target.darwin-x86.mk
+++ b/content/screen_orientation_values_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.darwin-x86_64.mk b/content/screen_orientation_values_java.target.darwin-x86_64.mk
index 377f27b..4338e37 100644
--- a/content/screen_orientation_values_java.target.darwin-x86_64.mk
+++ b/content/screen_orientation_values_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.linux-arm.mk b/content/screen_orientation_values_java.target.linux-arm.mk
index fc61918..955c6c5 100644
--- a/content/screen_orientation_values_java.target.linux-arm.mk
+++ b/content/screen_orientation_values_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.linux-arm64.mk b/content/screen_orientation_values_java.target.linux-arm64.mk
index 5b24642..4decb62 100644
--- a/content/screen_orientation_values_java.target.linux-arm64.mk
+++ b/content/screen_orientation_values_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.linux-mips.mk b/content/screen_orientation_values_java.target.linux-mips.mk
index a37a815..6af4d9e 100644
--- a/content/screen_orientation_values_java.target.linux-mips.mk
+++ b/content/screen_orientation_values_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.linux-x86.mk b/content/screen_orientation_values_java.target.linux-x86.mk
index 673b0ef..bb8f665 100644
--- a/content/screen_orientation_values_java.target.linux-x86.mk
+++ b/content/screen_orientation_values_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/screen_orientation_values_java.target.linux-x86_64.mk b/content/screen_orientation_values_java.target.linux-x86_64.mk
index 377f27b..4338e37 100644
--- a/content/screen_orientation_values_java.target.linux-x86_64.mk
+++ b/content/screen_orientation_values_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/shell/renderer/test_runner/WebTestProxy.cpp b/content/shell/renderer/test_runner/WebTestProxy.cpp
index 4295806..1a85a23 100644
--- a/content/shell/renderer/test_runner/WebTestProxy.cpp
+++ b/content/shell/renderer/test_runner/WebTestProxy.cpp
@@ -488,8 +488,9 @@
                bitmap.info().fHeight);
   SkCanvas canvas(bitmap);
   DrawSelectionRect(&canvas);
-  DCHECK(!m_compositeAndReadbackCallback.is_null());
-  base::ResetAndReturn(&m_compositeAndReadbackCallback).Run(bitmap);
+  DCHECK(!m_compositeAndReadbackCallbacks.empty());
+  m_compositeAndReadbackCallbacks.front().Run(bitmap);
+  m_compositeAndReadbackCallbacks.pop_front();
 }
 
 void WebTestProxyBase::CapturePixelsAsync(
@@ -498,8 +499,7 @@
 
   DCHECK(webWidget()->isAcceleratedCompositingActive());
   DCHECK(!callback.is_null());
-  DCHECK(m_compositeAndReadbackCallback.is_null());
-  m_compositeAndReadbackCallback = callback;
+  m_compositeAndReadbackCallbacks.push_back(callback);
   webWidget()->compositeAndReadbackAsync(this);
 }
 
@@ -596,26 +596,43 @@
     return m_canvas.get();
 }
 
-void WebTestProxyBase::display(base::Closure callback)
-{
-    const blink::WebSize& size = webWidget()->size();
-    WebRect rect(0, 0, size.width, size.height);
-    m_paintRect = rect;
-    paintInvalidatedRegion();
+void WebTestProxyBase::DisplayForSoftwareMode(const base::Closure& callback) {
+  const blink::WebSize& size = webWidget()->size();
+  WebRect rect(0, 0, size.width, size.height);
+  m_paintRect = rect;
+  paintInvalidatedRegion();
 
-    if (!callback.is_null())
-        callback.Run();
+  if (!callback.is_null())
+    callback.Run();
 }
 
-void WebTestProxyBase::displayAsyncThen(base::Closure callback)
-{
-  // TODO(enne): When compositing, this should invoke a real rAF, paint,
-  // and commit.  For now, just make sure that displayAsync is actually
-  // async so that callers can't depend on synchronous behavior.
-  m_delegate->postTask(new ClosureTask(
-      this,
-      base::Bind(
-          &WebTestProxyBase::display, base::Unretained(this), callback)));
+void WebTestProxyBase::DidDisplayAsync(const base::Closure& callback,
+                                       const SkBitmap& bitmap) {
+  // Verify we actually composited.
+  CHECK_NE(0, bitmap.info().fWidth);
+  CHECK_NE(0, bitmap.info().fHeight);
+  if (!callback.is_null())
+    callback.Run();
+}
+
+void WebTestProxyBase::displayAsyncThen(base::Closure callback) {
+  TRACE_EVENT0("shell", "WebTestProxyBase::displayAsyncThen");
+
+  // TODO(danakj): Remove when we have kForceCompositingMode everywhere.
+  if (!webWidget()->isAcceleratedCompositingActive()) {
+    TRACE_EVENT0("shell",
+                 "WebTestProxyBase::displayAsyncThen "
+                 "isAcceleratedCompositingActive false");
+    m_delegate->postTask(
+        new ClosureTask(this,
+                        base::Bind(&WebTestProxyBase::DisplayForSoftwareMode,
+                                   base::Unretained(this),
+                                   callback)));
+    return;
+  }
+
+  CapturePixelsAsync(base::Bind(
+      &WebTestProxyBase::DidDisplayAsync, base::Unretained(this), callback));
 }
 
 void WebTestProxyBase::discardBackingStore()
diff --git a/content/shell/renderer/test_runner/WebTestProxy.h b/content/shell/renderer/test_runner/WebTestProxy.h
index 7ecb38a..adff595 100644
--- a/content/shell/renderer/test_runner/WebTestProxy.h
+++ b/content/shell/renderer/test_runner/WebTestProxy.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTESTPROXY_H_
 #define CONTENT_SHELL_RENDERER_TEST_RUNNER_WEBTESTPROXY_H_
 
+#include <deque>
 #include <map>
 #include <string>
 
@@ -109,7 +110,6 @@
     void didCloseChooser();
     bool isChooserShown();
 
-    void display(base::Closure callback);
     void displayAsyncThen(base::Closure callback);
 
     void discardBackingStore();
@@ -195,6 +195,8 @@
     void invalidateAll();
     void animateNow();
     void DrawSelectionRect(SkCanvas* canvas);
+    void DisplayForSoftwareMode(const base::Closure& callback);
+    void DidDisplayAsync(const base::Closure& callback, const SkBitmap& bitmap);
 
     blink::WebWidget* webWidget();
 
@@ -214,7 +216,8 @@
     bool m_animateScheduled;
     std::map<unsigned, std::string> m_resourceIdentifierMap;
     std::map<unsigned, blink::WebURLRequest> m_requestMap;
-    base::Callback<void(const SkBitmap&)> m_compositeAndReadbackCallback;
+    std::deque<base::Callback<void(const SkBitmap&)> >
+        m_compositeAndReadbackCallbacks;
 
     bool m_logConsoleOutput;
     int m_chooserCount;
diff --git a/content/speech_recognition_error_java.target.darwin-arm.mk b/content/speech_recognition_error_java.target.darwin-arm.mk
index 27c7402..4f0bbaf 100644
--- a/content/speech_recognition_error_java.target.darwin-arm.mk
+++ b/content/speech_recognition_error_java.target.darwin-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.darwin-arm64.mk b/content/speech_recognition_error_java.target.darwin-arm64.mk
index 5a40b49..de843f2 100644
--- a/content/speech_recognition_error_java.target.darwin-arm64.mk
+++ b/content/speech_recognition_error_java.target.darwin-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.darwin-mips.mk b/content/speech_recognition_error_java.target.darwin-mips.mk
index c65f047..afe9b6b 100644
--- a/content/speech_recognition_error_java.target.darwin-mips.mk
+++ b/content/speech_recognition_error_java.target.darwin-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.darwin-x86.mk b/content/speech_recognition_error_java.target.darwin-x86.mk
index 4b15130..1b8207c 100644
--- a/content/speech_recognition_error_java.target.darwin-x86.mk
+++ b/content/speech_recognition_error_java.target.darwin-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.darwin-x86_64.mk b/content/speech_recognition_error_java.target.darwin-x86_64.mk
index b21a358..b0a1299 100644
--- a/content/speech_recognition_error_java.target.darwin-x86_64.mk
+++ b/content/speech_recognition_error_java.target.darwin-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.linux-arm.mk b/content/speech_recognition_error_java.target.linux-arm.mk
index 27c7402..4f0bbaf 100644
--- a/content/speech_recognition_error_java.target.linux-arm.mk
+++ b/content/speech_recognition_error_java.target.linux-arm.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.linux-arm64.mk b/content/speech_recognition_error_java.target.linux-arm64.mk
index 5a40b49..de843f2 100644
--- a/content/speech_recognition_error_java.target.linux-arm64.mk
+++ b/content/speech_recognition_error_java.target.linux-arm64.mk
@@ -89,6 +89,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -169,6 +170,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.linux-mips.mk b/content/speech_recognition_error_java.target.linux-mips.mk
index c65f047..afe9b6b 100644
--- a/content/speech_recognition_error_java.target.linux-mips.mk
+++ b/content/speech_recognition_error_java.target.linux-mips.mk
@@ -92,6 +92,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -176,6 +177,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.linux-x86.mk b/content/speech_recognition_error_java.target.linux-x86.mk
index 4b15130..1b8207c 100644
--- a/content/speech_recognition_error_java.target.linux-x86.mk
+++ b/content/speech_recognition_error_java.target.linux-x86.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/speech_recognition_error_java.target.linux-x86_64.mk b/content/speech_recognition_error_java.target.linux-x86_64.mk
index b21a358..b0a1299 100644
--- a/content/speech_recognition_error_java.target.linux-x86_64.mk
+++ b/content/speech_recognition_error_java.target.linux-x86_64.mk
@@ -93,6 +93,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
@@ -177,6 +178,7 @@
 	'-DCLD_VERSION=1' \
 	'-DENABLE_PRINTING=1' \
 	'-DENABLE_MANAGED_USERS=1' \
+	'-DVIDEO_HOLE=1' \
 	'-DUSE_OPENSSL=1' \
 	'-DUSE_OPENSSL_CERTS=1' \
 	'-D__STDC_CONSTANT_MACROS' \
diff --git a/content/test/data/web_ui_test_mojo_bindings.mojom b/content/test/data/web_ui_test_mojo_bindings.mojom
index 67d5983..9cac34e 100644
--- a/content/test/data/web_ui_test_mojo_bindings.mojom
+++ b/content/test/data/web_ui_test_mojo_bindings.mojom
@@ -1,11 +1,14 @@
-module mojo {
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
 
-[Peer=RendererTarget]
+module content {
+
 interface BrowserTarget {
   PingResponse();
 };
 
-[Peer=BrowserTarget]
+[Client=BrowserTarget]
 interface RendererTarget {
   Ping();
 };