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(