summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steve Block <steveblock@google.com> 2011-09-28 12:20:12 +0100
committer Steve Block <steveblock@google.com> 2011-09-28 14:39:41 +0100
commit85aa944888089852cf144c18f8fb6869e1a39d32 (patch)
tree9343c958fee858766a7be813c2fe9bf182af42b5
parentcbb62bb81807ff83a0887b90111218d81a3f57df (diff)
Fix HTML5Audio to call WebView.isPrivateBrowsingEnabled() on the UI thread
Bug: 5384494 Change-Id: I2587cf0e898f67becb9dbc2067fb1b0a6a37e124
-rw-r--r--core/java/android/webkit/HTML5Audio.java46
-rw-r--r--core/java/android/webkit/WebViewCore.java5
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;
}