Commit 90e2bff3 authored by xhwang's avatar xhwang Committed by Commit bot

media: Do not call into native MediaDrmBridge after it's destroyed.

BUG=467971
TEST=Manually tested.

Review URL: https://codereview.chromium.org/1014093002

Cr-Commit-Position: refs/heads/master@{#321468}
parent a2207b55
...@@ -65,6 +65,7 @@ public class MediaDrmBridge { ...@@ -65,6 +65,7 @@ public class MediaDrmBridge {
private static final String ENABLE = "enable"; private static final String ENABLE = "enable";
private static final int INVALID_SESSION_ID = 0; private static final int INVALID_SESSION_ID = 0;
private static final char[] HEX_CHAR_LOOKUP = "0123456789ABCDEF".toCharArray(); private static final char[] HEX_CHAR_LOOKUP = "0123456789ABCDEF".toCharArray();
private static final long INVALID_NATIVE_MEDIA_DRM_BRIDGE = 0;
// KeyStatus for CDM key information. MUST keep this value in sync with // KeyStatus for CDM key information. MUST keep this value in sync with
// CdmKeyInformation::KeyStatus. // CdmKeyInformation::KeyStatus.
...@@ -156,11 +157,18 @@ public class MediaDrmBridge { ...@@ -156,11 +157,18 @@ public class MediaDrmBridge {
return hexString.toString(); return hexString.toString();
} }
private boolean isNativeMediaDrmBridgeValid() {
return mNativeMediaDrmBridge != INVALID_NATIVE_MEDIA_DRM_BRIDGE;
}
private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge) private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge)
throws android.media.UnsupportedSchemeException { throws android.media.UnsupportedSchemeException {
mSchemeUUID = schemeUUID; mSchemeUUID = schemeUUID;
mMediaDrm = new MediaDrm(schemeUUID); mMediaDrm = new MediaDrm(schemeUUID);
mNativeMediaDrmBridge = nativeMediaDrmBridge; mNativeMediaDrmBridge = nativeMediaDrmBridge;
assert isNativeMediaDrmBridgeValid();
mHandler = new Handler(); mHandler = new Handler();
mSessionIds = new HashMap<ByteBuffer, String>(); mSessionIds = new HashMap<ByteBuffer, String>();
mPendingCreateSessionDataQueue = new ArrayDeque<PendingCreateSessionData>(); mPendingCreateSessionDataQueue = new ArrayDeque<PendingCreateSessionData>();
...@@ -206,7 +214,7 @@ public class MediaDrmBridge { ...@@ -206,7 +214,7 @@ public class MediaDrmBridge {
mMediaCrypto = new MediaCrypto(mSchemeUUID, mMediaCryptoSession); mMediaCrypto = new MediaCrypto(mSchemeUUID, mMediaCryptoSession);
Log.d(TAG, "MediaCrypto successfully created!"); Log.d(TAG, "MediaCrypto successfully created!");
// Notify the native code that MediaCrypto is ready. // Notify the native code that MediaCrypto is ready.
nativeOnMediaCryptoReady(mNativeMediaDrmBridge); onMediaCryptoReady();
return true; return true;
} else { } else {
Log.e(TAG, "Cannot create MediaCrypto for unsupported scheme."); Log.e(TAG, "Cannot create MediaCrypto for unsupported scheme.");
...@@ -349,12 +357,20 @@ public class MediaDrmBridge { ...@@ -349,12 +357,20 @@ public class MediaDrmBridge {
} }
/** /**
* Release the MediaDrmBridge object. * Destroy the MediaDrmBridge object.
*/ */
@CalledByNative @CalledByNative
private void destroy() {
mNativeMediaDrmBridge = INVALID_NATIVE_MEDIA_DRM_BRIDGE;
release();
}
/**
* Release all allocated resources and finish all pending operations.
*/
private void release() { private void release() {
// Do not reset mHandler and mNativeMediaDrmBridge so that we can still // Do not reset mHandler so that we can still post tasks back to native code.
// post KeyError back to native code. // Note that mNativeMediaDrmBridge may have already been reset (see destroy()).
for (PendingCreateSessionData data : mPendingCreateSessionDataQueue) { for (PendingCreateSessionData data : mPendingCreateSessionDataQueue) {
onPromiseRejected(data.promiseId(), "Create session aborted."); onPromiseRejected(data.promiseId(), "Create session aborted.");
...@@ -646,7 +662,7 @@ public class MediaDrmBridge { ...@@ -646,7 +662,7 @@ public class MediaDrmBridge {
boolean success = provideProvisionResponse(response); boolean success = provideProvisionResponse(response);
if (mResetDeviceCredentialsPending) { if (mResetDeviceCredentialsPending) {
nativeOnResetDeviceCredentialsCompleted(mNativeMediaDrmBridge, success); onResetDeviceCredentialsCompleted(success);
mResetDeviceCredentialsPending = false; mResetDeviceCredentialsPending = false;
} }
...@@ -679,11 +695,24 @@ public class MediaDrmBridge { ...@@ -679,11 +695,24 @@ public class MediaDrmBridge {
// Helper functions to post native calls to prevent reentrancy. // Helper functions to post native calls to prevent reentrancy.
private void onMediaCryptoReady() {
mHandler.post(new Runnable(){
@Override
public void run() {
if (isNativeMediaDrmBridgeValid()) {
nativeOnMediaCryptoReady(mNativeMediaDrmBridge);
}
}
});
}
private void onPromiseResolved(final long promiseId) { private void onPromiseResolved(final long promiseId) {
mHandler.post(new Runnable(){ mHandler.post(new Runnable(){
@Override @Override
public void run() { public void run() {
nativeOnPromiseResolved(mNativeMediaDrmBridge, promiseId); if (isNativeMediaDrmBridgeValid()) {
nativeOnPromiseResolved(mNativeMediaDrmBridge, promiseId);
}
} }
}); });
} }
...@@ -692,7 +721,9 @@ public class MediaDrmBridge { ...@@ -692,7 +721,9 @@ public class MediaDrmBridge {
mHandler.post(new Runnable(){ mHandler.post(new Runnable(){
@Override @Override
public void run() { public void run() {
nativeOnPromiseResolvedWithSession(mNativeMediaDrmBridge, promiseId, sessionId); if (isNativeMediaDrmBridgeValid()) {
nativeOnPromiseResolvedWithSession(mNativeMediaDrmBridge, promiseId, sessionId);
}
} }
}); });
} }
...@@ -702,7 +733,9 @@ public class MediaDrmBridge { ...@@ -702,7 +733,9 @@ public class MediaDrmBridge {
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnPromiseRejected(mNativeMediaDrmBridge, promiseId, errorMessage); if (isNativeMediaDrmBridgeValid()) {
nativeOnPromiseRejected(mNativeMediaDrmBridge, promiseId, errorMessage);
}
} }
}); });
} }
...@@ -711,8 +744,10 @@ public class MediaDrmBridge { ...@@ -711,8 +744,10 @@ public class MediaDrmBridge {
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnSessionMessage(mNativeMediaDrmBridge, sessionId, request.getData(), if (isNativeMediaDrmBridgeValid()) {
request.getDefaultUrl()); nativeOnSessionMessage(mNativeMediaDrmBridge, sessionId, request.getData(),
request.getDefaultUrl());
}
} }
}); });
} }
...@@ -721,7 +756,9 @@ public class MediaDrmBridge { ...@@ -721,7 +756,9 @@ public class MediaDrmBridge {
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnSessionClosed(mNativeMediaDrmBridge, sessionId); if (isNativeMediaDrmBridgeValid()) {
nativeOnSessionClosed(mNativeMediaDrmBridge, sessionId);
}
} }
}); });
} }
...@@ -731,8 +768,10 @@ public class MediaDrmBridge { ...@@ -731,8 +768,10 @@ public class MediaDrmBridge {
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnSessionKeysChange( if (isNativeMediaDrmBridgeValid()) {
mNativeMediaDrmBridge, sessionId, hasAdditionalUsableKey, keyStatus); nativeOnSessionKeysChange(
mNativeMediaDrmBridge, sessionId, hasAdditionalUsableKey, keyStatus);
}
} }
}); });
} }
...@@ -742,7 +781,20 @@ public class MediaDrmBridge { ...@@ -742,7 +781,20 @@ public class MediaDrmBridge {
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
nativeOnLegacySessionError(mNativeMediaDrmBridge, sessionId, errorMessage); if (isNativeMediaDrmBridgeValid()) {
nativeOnLegacySessionError(mNativeMediaDrmBridge, sessionId, errorMessage);
}
}
});
}
private void onResetDeviceCredentialsCompleted(final boolean success) {
mHandler.post(new Runnable() {
@Override
public void run() {
if (isNativeMediaDrmBridgeValid()) {
nativeOnResetDeviceCredentialsCompleted(mNativeMediaDrmBridge, success);
}
} }
}); });
} }
......
...@@ -352,7 +352,7 @@ MediaDrmBridge::~MediaDrmBridge() { ...@@ -352,7 +352,7 @@ MediaDrmBridge::~MediaDrmBridge() {
JNIEnv* env = AttachCurrentThread(); JNIEnv* env = AttachCurrentThread();
player_tracker_.NotifyCdmUnset(); player_tracker_.NotifyCdmUnset();
if (!j_media_drm_.is_null()) if (!j_media_drm_.is_null())
Java_MediaDrmBridge_release(env, j_media_drm_.obj()); Java_MediaDrmBridge_destroy(env, j_media_drm_.obj());
} }
// static // static
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment