Chromium Code Reviews| Index: media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
| diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
| index f54bde42d1eef2a12d284504f93f4aefbf0ac2df..2cdd4d7254a08da150bb25747753e6b55f69a1fd 100644 |
| --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
| +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java |
| @@ -83,6 +83,9 @@ public class MediaDrmBridge { |
| // associated meta data, e.g. mime types, key types. |
| private MediaDrmSessionManager mSessionManager; |
| + // The persistent storage to record origin provisioning informations. |
| + private MediaDrmStorageBridge mStorage; |
| + |
| // The queue of all pending createSession() data. |
| private ArrayDeque<PendingCreateSessionData> mPendingCreateSessionDataQueue; |
| @@ -196,15 +199,17 @@ public class MediaDrmBridge { |
| } |
| @TargetApi(Build.VERSION_CODES.M) |
| - private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge) |
| - throws android.media.UnsupportedSchemeException { |
| + private MediaDrmBridge(UUID schemeUUID, long nativeMediaDrmBridge, |
| + long nativeMediaDrmStorageBridge) throws android.media.UnsupportedSchemeException { |
| mSchemeUUID = schemeUUID; |
| mMediaDrm = new MediaDrm(schemeUUID); |
| mNativeMediaDrmBridge = nativeMediaDrmBridge; |
| assert isNativeMediaDrmBridgeValid(); |
| - mSessionManager = new MediaDrmSessionManager(); |
| + mStorage = new MediaDrmStorageBridge(nativeMediaDrmStorageBridge); |
| + mSessionManager = new MediaDrmSessionManager(mStorage); |
| + |
| mPendingCreateSessionDataQueue = new ArrayDeque<PendingCreateSessionData>(); |
| mResetDeviceCredentialsPending = false; |
| mProvisioningPending = false; |
| @@ -330,10 +335,11 @@ public class MediaDrmBridge { |
| * @param securityOrigin Security origin. Empty value means no need for origin isolated storage. |
| * @param securityLevel Security level. If empty, the default one should be used. |
| * @param nativeMediaDrmBridge Native object of this class. |
| + * @param nativeMediaDrmStorageBridge Native object of persistent storage. |
| */ |
| @CalledByNative |
| private static MediaDrmBridge create(byte[] schemeUUID, String securityOrigin, |
| - String securityLevel, long nativeMediaDrmBridge) { |
| + String securityLevel, long nativeMediaDrmBridge, long nativeMediaDrmStorageBridge) { |
| UUID cryptoScheme = getUUIDFromBytes(schemeUUID); |
| if (cryptoScheme == null || !MediaDrm.isCryptoSchemeSupported(cryptoScheme)) { |
| return null; |
| @@ -341,7 +347,8 @@ public class MediaDrmBridge { |
| MediaDrmBridge mediaDrmBridge = null; |
| try { |
| - mediaDrmBridge = new MediaDrmBridge(cryptoScheme, nativeMediaDrmBridge); |
| + mediaDrmBridge = new MediaDrmBridge( |
| + cryptoScheme, nativeMediaDrmBridge, nativeMediaDrmStorageBridge); |
| Log.d(TAG, "MediaDrmBridge successfully created."); |
| } catch (android.media.UnsupportedSchemeException e) { |
| Log.e(TAG, "Unsupported DRM scheme", e); |
| @@ -513,7 +520,7 @@ public class MediaDrmBridge { |
| closeSessionNoException(sessionId); |
| onSessionClosed(sessionId); |
| } |
| - mSessionManager = new MediaDrmSessionManager(); |
| + mSessionManager = new MediaDrmSessionManager(mStorage); |
| // Close mMediaCryptoSession if it's open or notify MediaCrypto |
| // creation failure if it's never successfully opened. |
| @@ -917,7 +924,32 @@ public class MediaDrmBridge { |
| return; |
| } |
| - processPendingCreateSessionData(); |
| + if (!useOriginIsolatedStorage()) { |
| + processPendingCreateSessionData(); |
| + return; |
| + } |
| + |
| + mStorage.onProvisioned(new Callback<Boolean>() { |
| + @Override |
| + public void onResult(Boolean initSuccess) { |
| + if (!initSuccess) { |
| + Log.e(TAG, "Failed to initialize storage for origin"); |
| + release(); |
| + return; |
| + } |
| + |
| + processPendingCreateSessionData(); |
| + } |
| + }); |
| + } |
| + |
| + private boolean useOriginIsolatedStorage() { |
| + assert mMediaDrm != null; |
| + |
| + boolean isMOrHigher = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; |
| + boolean isOriginSet = !isWidevine() || !mMediaDrm.getPropertyString(ORIGIN).isEmpty(); |
|
xhwang
2017/03/31 03:47:57
Is it ever possible that getPropertyString(ORIGIN)
yucliu1
2017/03/31 05:38:17
We should check origin only for M or higher device
xhwang
2017/03/31 06:25:50
At least for now, per-origin provisioning is a req
yucliu1
2017/03/31 18:42:30
Good point! And I think we want to disable the fea
|
| + |
| + return isMOrHigher && isOriginSet; |
| } |
| /** |