From 85aa944888089852cf144c18f8fb6869e1a39d32 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Wed, 28 Sep 2011 12:20:12 +0100 Subject: Fix HTML5Audio to call WebView.isPrivateBrowsingEnabled() on the UI thread Bug: 5384494 Change-Id: I2587cf0e898f67becb9dbc2067fb1b0a6a37e124 --- core/java/android/webkit/HTML5Audio.java | 46 ++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'core/java/android/webkit/HTML5Audio.java') 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; /** - *

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 headers = new HashMap(); if (cookieValue != null) { headers.put(COOKIE, cookieValue); } - if (mIsPrivate) { + if (mIsPrivateBrowsingEnabledGetter.get()) { headers.put(HIDE_URL_LOGS, "true"); } -- cgit v1.2.3