diff options
| author | 2011-09-28 12:20:12 +0100 | |
|---|---|---|
| committer | 2011-09-28 14:39:41 +0100 | |
| commit | 85aa944888089852cf144c18f8fb6869e1a39d32 (patch) | |
| tree | 9343c958fee858766a7be813c2fe9bf182af42b5 | |
| parent | cbb62bb81807ff83a0887b90111218d81a3f57df (diff) | |
Fix HTML5Audio to call WebView.isPrivateBrowsingEnabled() on the UI thread
Bug: 5384494
Change-Id: I2587cf0e898f67becb9dbc2067fb1b0a6a37e124
| -rw-r--r-- | core/java/android/webkit/HTML5Audio.java | 46 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 5 |
2 files changed, 44 insertions, 7 deletions
diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java index 1e958549809d..3600d09732e9 100644 --- a/core/java/android/webkit/HTML5Audio.java +++ b/core/java/android/webkit/HTML5Audio.java @@ -23,6 +23,7 @@ import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnSeekCompleteListener; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.util.Log; @@ -33,7 +34,11 @@ import java.util.Timer; import java.util.TimerTask; /** - * <p>HTML5 support class for Audio. + * HTML5 support class for Audio. + * + * This class runs almost entirely on the WebCore thread. The exception is when + * accessing the WebView object to determine whether private browsing is + * enabled. */ class HTML5Audio extends Handler implements MediaPlayer.OnBufferingUpdateListener, @@ -49,7 +54,7 @@ class HTML5Audio extends Handler // The C++ MediaPlayerPrivateAndroid object. private int mNativePointer; // The private status of the view that created this player - private boolean mIsPrivate; + private IsPrivateBrowsingEnabledGetter mIsPrivateBrowsingEnabledGetter; private static int IDLE = 0; private static int INITIALIZED = 1; @@ -82,6 +87,35 @@ class HTML5Audio extends Handler } } + // Helper class to determine whether private browsing is enabled in the + // given WebView. Queries the WebView on the UI thread. Calls to get() + // block until the data is available. + private class IsPrivateBrowsingEnabledGetter { + private boolean mIsReady; + private boolean mIsPrivateBrowsingEnabled; + IsPrivateBrowsingEnabledGetter(Looper uiThreadLooper, final WebView webView) { + new Handler(uiThreadLooper).post(new Runnable() { + @Override + public void run() { + synchronized(IsPrivateBrowsingEnabledGetter.this) { + mIsPrivateBrowsingEnabled = webView.isPrivateBrowsingEnabled(); + mIsReady = true; + IsPrivateBrowsingEnabledGetter.this.notify(); + } + } + }); + } + synchronized boolean get() { + while (!mIsReady) { + try { + wait(); + } catch (InterruptedException e) { + } + } + return mIsPrivateBrowsingEnabled; + } + }; + @Override public void handleMessage(Message msg) { switch (msg.what) { @@ -149,7 +183,8 @@ class HTML5Audio extends Handler // Save the native ptr mNativePointer = nativePtr; resetMediaPlayer(); - mIsPrivate = webViewCore.getWebView().isPrivateBrowsingEnabled(); + mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter( + webViewCore.getContext().getMainLooper(), webViewCore.getWebView()); } private void resetMediaPlayer() { @@ -177,13 +212,14 @@ class HTML5Audio extends Handler if (mState != IDLE) { resetMediaPlayer(); } - String cookieValue = CookieManager.getInstance().getCookie(url, mIsPrivate); + String cookieValue = CookieManager.getInstance().getCookie( + url, mIsPrivateBrowsingEnabledGetter.get()); Map<String, String> headers = new HashMap<String, String>(); if (cookieValue != null) { headers.put(COOKIE, cookieValue); } - if (mIsPrivate) { + if (mIsPrivateBrowsingEnabledGetter.get()) { headers.put(HIDE_URL_LOGS, "true"); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 470e843f5868..f5122767926a 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -2225,6 +2225,8 @@ public final class WebViewCore { mRepaintScheduled = false; } + // Gets the WebView corresponding to this WebViewCore. Note that the + // WebView object must only be used on the UI thread. /* package */ WebView getWebView() { return mWebView; } @@ -2626,8 +2628,7 @@ public final class WebViewCore { } } - // called by JNI - private Context getContext() { + Context getContext() { return mContext; } |