Cherry-pick: Block media loading when AwSettings.setBlockNetworkLoads is true.

Cherry-pick of Chromium
https://codereview.chromium.org/52463004/

BUG:11139117

Original description:
Prevent media from being loading from network when AwSettings.setBlockNetworkLoads is true.

Change-Id: I3c7b3d58ce9e01f5952d3c76749deb38ce3e5e1d
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 14b8014..47d8600 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -550,7 +550,7 @@
                 mZoomControls);
         nativeSetJavaPeers(mNativeAwContents, this, mWebContentsDelegate, mContentsClientBridge,
                 mIoThreadClient, mInterceptNavigationDelegate);
-        mContentsClient.installWebContentsObserver(mContentViewCore);
+        mContentsClient.installWebContentsObserver(mContentViewCore, mSettings);
         mSettings.setWebContents(nativeWebContents);
         nativeSetDipScale(mNativeAwContents, (float) mDIPScale);
         updateGlobalVisibleRect();
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
index e856586..a3070ba 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
@@ -20,6 +20,7 @@
 import android.webkit.ConsoleMessage;
 import android.webkit.GeolocationPermissions;
 import android.webkit.SslErrorHandler;
+import android.webkit.URLUtil;
 import android.webkit.ValueCallback;
 import android.webkit.WebChromeClient;
 
@@ -57,6 +58,8 @@
 
     private static final int INVALID_COLOR = 0;
 
+    private AwSettings mSettings;
+
     class AwWebContentsObserver extends WebContentsObserverAndroid {
         public AwWebContentsObserver(ContentViewCore contentViewCore) {
             super(contentViewCore);
@@ -133,13 +136,20 @@
         final public ContentVideoViewClient getContentVideoViewClient() {
             return new AwContentVideoViewClient();
         }
+
+        @Override
+        public boolean shouldBlockMediaRequest(String url) {
+            return mSettings != null ?
+                    mSettings.getBlockNetworkLoads() && URLUtil.isNetworkUrl(url) : true;
+        }
     }
 
-    final void installWebContentsObserver(ContentViewCore contentViewCore) {
+    final void installWebContentsObserver(ContentViewCore contentViewCore, AwSettings settings) {
         if (mWebContentsObserver != null) {
             mWebContentsObserver.detachFromWebContents();
         }
         mWebContentsObserver = new AwWebContentsObserver(contentViewCore);
+        mSettings = settings;
     }
 
     private class AwContentVideoViewClient implements ContentVideoViewClient {
diff --git a/content/browser/android/browser_media_player_manager.cc b/content/browser/android/browser_media_player_manager.cc
index dbf0c8f..57c8f6d 100644
--- a/content/browser/android/browser_media_player_manager.cc
+++ b/content/browser/android/browser_media_player_manager.cc
@@ -383,9 +383,13 @@
   RemovePlayer(player_id);
 
   RenderProcessHost* host = render_view_host()->GetProcess();
+  ContentViewCoreImpl* content_view_core_impl =
+      static_cast<ContentViewCoreImpl*>(
+          ContentViewCore::FromWebContents(web_contents_));
   AddPlayer(media::MediaPlayerAndroid::Create(
       player_id, url, source_type, first_party_for_cookies,
-      host->GetBrowserContext()->IsOffTheRecord(), this));
+      host->GetBrowserContext()->IsOffTheRecord(), this,
+      !content_view_core_impl->ShouldBlockMediaRequest(url)));
 }
 
 void BrowserMediaPlayerManager::OnStart(int player_id) {
diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc
index 31ab2d2..b45c305 100644
--- a/content/browser/android/content_view_core_impl.cc
+++ b/content/browser/android/content_view_core_impl.cc
@@ -635,6 +635,17 @@
   return Java_ContentViewCore_getContext(env, obj.obj());
 }
 
+bool ContentViewCoreImpl::ShouldBlockMediaRequest(const GURL& url) {
+  JNIEnv* env = AttachCurrentThread();
+
+  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return true;
+  ScopedJavaLocalRef<jstring> j_url = ConvertUTF8ToJavaString(env, url.spec());
+  return Java_ContentViewCore_shouldBlockMediaRequest(env, obj.obj(),
+                                                      j_url.obj());
+}
+
 gfx::Size ContentViewCoreImpl::GetPhysicalBackingSize() const {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> j_obj = java_ref_.get(env);
diff --git a/content/browser/android/content_view_core_impl.h b/content/browser/android/content_view_core_impl.h
index a20365b..463e3a7 100644
--- a/content/browser/android/content_view_core_impl.h
+++ b/content/browser/android/content_view_core_impl.h
@@ -285,6 +285,9 @@
   // typically be an Activity context for an on screen view.
   base::android::ScopedJavaLocalRef<jobject> GetContext();
 
+  // Returns True if the given media should be blocked to load.
+  bool ShouldBlockMediaRequest(const GURL& url);
+
   // --------------------------------------------------------------------------
   // Methods called from native code
   // --------------------------------------------------------------------------
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewClient.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewClient.java
index c118350..8af9a2e 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewClient.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewClient.java
@@ -173,4 +173,13 @@
     public ContentVideoViewClient getContentVideoViewClient() {
         return null;
     }
+
+    /**
+     * Called when BrowserMediaPlayerManager wants to load a media resource.
+     * @param url the URL of media resource to load.
+     * @return true to prevent the resource from being loaded.
+     */
+    public boolean shouldBlockMediaRequest(String url) {
+        return false;
+    }
 }
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index 2cfd201..dbab8ac 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -2999,6 +2999,11 @@
         return mContentViewClient.getContentVideoViewClient();
     }
 
+    @CalledByNative
+    private boolean shouldBlockMediaRequest(String url) {
+        return mContentViewClient.shouldBlockMediaRequest(url);
+    }
+
     private native void nativeOnJavaContentViewCoreDestroyed(int nativeContentViewCoreImpl);
 
     private native void nativeLoadUrl(
diff --git a/media/base/android/media_player_android.h b/media/base/android/media_player_android.h
index f1c9c37..ae2eed2 100644
--- a/media/base/android/media_player_android.h
+++ b/media/base/android/media_player_android.h
@@ -47,12 +47,15 @@
   // before decoding the media stream. This allows |manager_| to track
   // unused resources and free them when needed. On the other hand, it needs
   // to call ReleaseMediaResources() when it is done with decoding.
+  // |load_media_resource| indcates whether the media resource should be
+  // initialized after the player created.
   static MediaPlayerAndroid* Create(int player_id,
                                     const GURL& url,
                                     SourceType source_type,
                                     const GURL& first_party_for_cookies,
                                     bool hide_url_log,
-                                    MediaPlayerManager* manager);
+                                    MediaPlayerManager* manager,
+                                    bool load_media_resource);
 
   // Passing an external java surface object to the player.
   virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) = 0;
diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc
index 342ceaa..63d120f 100644
--- a/media/base/android/media_player_bridge.cc
+++ b/media/base/android/media_player_bridge.cc
@@ -37,7 +37,8 @@
     SourceType source_type,
     const GURL& first_party_for_cookies,
     bool hide_url_log,
-    MediaPlayerManager* manager) {
+    MediaPlayerManager* manager,
+    bool load_media_resource) {
   if (source_type == SOURCE_TYPE_URL) {
     MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge(
         player_id,
@@ -45,7 +46,8 @@
         first_party_for_cookies,
         hide_url_log,
         manager);
-    media_player_bridge->Initialize();
+    if (load_media_resource)
+      media_player_bridge->Initialize();
     return media_player_bridge;
   } else {
     return new MediaSourcePlayer(