Pass Chrome user agent string to Android media player

Android Media player, by default, uses its own user agent string in the format
of "stagefright/1.2 (Linux; Android x.x)" when sending out requests.
This CL changes it to that of Chrome for Android when the media player instance is hosted by
Chrome for Android (or ChromiumWebView) to make the UA used across the browser
and its media source consistent.

R=qinmin@chromium.org
BUG=332344

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@244130 0039d316-1c4b-4281-b951-d872f2087c98
parent 22336b95
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h" #include "content/public/browser/web_contents_delegate.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "media/base/android/media_drm_bridge.h" #include "media/base/android/media_drm_bridge.h"
#include "media/base/android/media_player_bridge.h" #include "media/base/android/media_player_bridge.h"
...@@ -76,8 +77,14 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( ...@@ -76,8 +77,14 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
BrowserDemuxerAndroid* demuxer) { BrowserDemuxerAndroid* demuxer) {
switch (type) { switch (type) {
case MEDIA_PLAYER_TYPE_URL: { case MEDIA_PLAYER_TYPE_URL: {
const std::string user_agent = GetUserAgent(url);
MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge(
player_id, url, first_party_for_cookies, hide_url_log, manager); player_id,
url,
first_party_for_cookies,
user_agent,
hide_url_log,
manager);
BrowserMediaPlayerManager* browser_media_player_manager = BrowserMediaPlayerManager* browser_media_player_manager =
static_cast<BrowserMediaPlayerManager*>(manager); static_cast<BrowserMediaPlayerManager*>(manager);
ContentViewCoreImpl* content_view_core_impl = ContentViewCoreImpl* content_view_core_impl =
......
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "url/gurl.h" #include "url/gurl.h"
using base::android::ConvertUTF8ToJavaString;
using base::android::ScopedJavaLocalRef;
namespace content { namespace content {
static void ReturnResultOnUIThread( static void ReturnResultOnUIThread(
...@@ -35,17 +38,21 @@ static void ReturnResultOnUIThread( ...@@ -35,17 +38,21 @@ static void ReturnResultOnUIThread(
// thread to run the callback function. // thread to run the callback function.
static void GetMediaMetadata( static void GetMediaMetadata(
const std::string& url, const std::string& cookies, const std::string& url, const std::string& cookies,
const std::string& user_agent,
const media::MediaResourceGetter::ExtractMediaMetadataCB& callback) { const media::MediaResourceGetter::ExtractMediaMetadataCB& callback) {
JNIEnv* env = base::android::AttachCurrentThread(); JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaLocalRef<jstring> j_url_string = ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url);
base::android::ConvertUTF8ToJavaString(env, url); ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString(env, cookies);
base::android::ScopedJavaLocalRef<jstring> j_cookies =
base::android::ConvertUTF8ToJavaString(env, cookies);
jobject j_context = base::android::GetApplicationContext(); jobject j_context = base::android::GetApplicationContext();
base::android::ScopedJavaLocalRef<jobject> j_metadata = ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString(
Java_MediaResourceGetter_extractMediaMetadata( env, user_agent);
env, j_context, j_url_string.obj(), j_cookies.obj()); ScopedJavaLocalRef<jobject> j_metadata =
Java_MediaResourceGetter_extractMediaMetadata(env,
j_context,
j_url_string.obj(),
j_cookies.obj(),
j_user_agent.obj());
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::Bind(callback, base::TimeDelta::FromMilliseconds( base::Bind(callback, base::TimeDelta::FromMilliseconds(
...@@ -261,11 +268,12 @@ void MediaResourceGetterImpl::GetPlatformPathCallback( ...@@ -261,11 +268,12 @@ void MediaResourceGetterImpl::GetPlatformPathCallback(
void MediaResourceGetterImpl::ExtractMediaMetadata( void MediaResourceGetterImpl::ExtractMediaMetadata(
const std::string& url, const std::string& cookies, const std::string& url, const std::string& cookies,
const ExtractMediaMetadataCB& callback) { const std::string& user_agent, const ExtractMediaMetadataCB& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool(); base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
pool->PostWorkerTask( pool->PostWorkerTask(
FROM_HERE, base::Bind(&GetMediaMetadata, url, cookies, callback)); FROM_HERE,
base::Bind(&GetMediaMetadata, url, cookies, user_agent, callback));
} }
// static // static
......
...@@ -49,6 +49,7 @@ class MediaResourceGetterImpl : public media::MediaResourceGetter { ...@@ -49,6 +49,7 @@ class MediaResourceGetterImpl : public media::MediaResourceGetter {
const GetPlatformPathCB& callback) OVERRIDE; const GetPlatformPathCB& callback) OVERRIDE;
virtual void ExtractMediaMetadata( virtual void ExtractMediaMetadata(
const std::string& url, const std::string& cookies, const std::string& url, const std::string& cookies,
const std::string& user_agent,
const ExtractMediaMetadataCB& callback) OVERRIDE; const ExtractMediaMetadataCB& callback) OVERRIDE;
static bool RegisterMediaResourceGetter(JNIEnv* env); static bool RegisterMediaResourceGetter(JNIEnv* env);
......
...@@ -55,7 +55,8 @@ class MediaResourceGetter { ...@@ -55,7 +55,8 @@ class MediaResourceGetter {
} }
@CalledByNative @CalledByNative
private static MediaMetadata extractMediaMetadata(Context context, String url, String cookies) { private static MediaMetadata extractMediaMetadata(Context context, String url, String cookies,
String userAgent) {
int durationInMilliseconds = 0; int durationInMilliseconds = 0;
int width = 0; int width = 0;
int height = 0; int height = 0;
...@@ -109,6 +110,9 @@ class MediaResourceGetter { ...@@ -109,6 +110,9 @@ class MediaResourceGetter {
if (!TextUtils.isEmpty(cookies)) { if (!TextUtils.isEmpty(cookies)) {
headersMap.put("Cookie", cookies); headersMap.put("Cookie", cookies);
} }
if (!TextUtils.isEmpty(userAgent)) {
headersMap.put("User-Agent", userAgent);
}
retriever.setDataSource(url, headersMap); retriever.setDataSource(url, headersMap);
} }
String duration = retriever.extractMetadata( String duration = retriever.extractMetadata(
......
...@@ -137,11 +137,12 @@ public class MediaPlayerBridge { ...@@ -137,11 +137,12 @@ public class MediaPlayerBridge {
@CalledByNative @CalledByNative
protected boolean setDataSource( protected boolean setDataSource(
Context context, String url, String cookies, boolean hideUrlLog) { Context context, String url, String cookies, String userAgent, boolean hideUrlLog) {
Uri uri = Uri.parse(url); Uri uri = Uri.parse(url);
HashMap<String, String> headersMap = new HashMap<String, String>(); HashMap<String, String> headersMap = new HashMap<String, String>();
if (hideUrlLog) headersMap.put("x-hide-urls-from-log", "true"); if (hideUrlLog) headersMap.put("x-hide-urls-from-log", "true");
if (!TextUtils.isEmpty(cookies)) headersMap.put("Cookie", cookies); if (!TextUtils.isEmpty(cookies)) headersMap.put("Cookie", cookies);
if (!TextUtils.isEmpty(userAgent)) headersMap.put("User-Agent", userAgent);
try { try {
getLocalPlayer().setDataSource(context, uri, headersMap); getLocalPlayer().setDataSource(context, uri, headersMap);
return true; return true;
......
...@@ -26,14 +26,15 @@ MediaPlayerBridge::MediaPlayerBridge( ...@@ -26,14 +26,15 @@ MediaPlayerBridge::MediaPlayerBridge(
int player_id, int player_id,
const GURL& url, const GURL& url,
const GURL& first_party_for_cookies, const GURL& first_party_for_cookies,
const std::string& user_agent,
bool hide_url_log, bool hide_url_log,
MediaPlayerManager* manager) MediaPlayerManager* manager)
: MediaPlayerAndroid(player_id, : MediaPlayerAndroid(player_id, manager),
manager),
prepared_(false), prepared_(false),
pending_play_(false), pending_play_(false),
url_(url), url_(url),
first_party_for_cookies_(first_party_for_cookies), first_party_for_cookies_(first_party_for_cookies),
user_agent_(user_agent),
hide_url_log_(hide_url_log), hide_url_log_(hide_url_log),
width_(0), width_(0),
height_(0), height_(0),
...@@ -147,6 +148,8 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) { ...@@ -147,6 +148,8 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) {
ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url); ScopedJavaLocalRef<jstring> j_url_string = ConvertUTF8ToJavaString(env, url);
ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString( ScopedJavaLocalRef<jstring> j_cookies = ConvertUTF8ToJavaString(
env, cookies_); env, cookies_);
ScopedJavaLocalRef<jstring> j_user_agent = ConvertUTF8ToJavaString(
env, user_agent_);
jobject j_context = base::android::GetApplicationContext(); jobject j_context = base::android::GetApplicationContext();
DCHECK(j_context); DCHECK(j_context);
...@@ -162,7 +165,7 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) { ...@@ -162,7 +165,7 @@ void MediaPlayerBridge::SetDataSource(const std::string& url) {
if (!Java_MediaPlayerBridge_setDataSource( if (!Java_MediaPlayerBridge_setDataSource(
env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(), env, j_media_player_bridge_.obj(), j_context, j_url_string.obj(),
j_cookies.obj(), hide_url_log_)) { j_cookies.obj(), j_user_agent.obj(), hide_url_log_)) {
OnMediaError(MEDIA_ERROR_FORMAT); OnMediaError(MEDIA_ERROR_FORMAT);
return; return;
} }
...@@ -191,7 +194,8 @@ void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) { ...@@ -191,7 +194,8 @@ void MediaPlayerBridge::OnCookiesRetrieved(const std::string& cookies) {
void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) { void MediaPlayerBridge::ExtractMediaMetadata(const std::string& url) {
manager()->GetMediaResourceGetter()->ExtractMediaMetadata( manager()->GetMediaResourceGetter()->ExtractMediaMetadata(
url, cookies_, base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted, url, cookies_, user_agent_,
base::Bind(&MediaPlayerBridge::OnMediaMetadataExtracted,
weak_this_.GetWeakPtr())); weak_this_.GetWeakPtr()));
} }
......
...@@ -45,6 +45,7 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid { ...@@ -45,6 +45,7 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid {
MediaPlayerBridge(int player_id, MediaPlayerBridge(int player_id,
const GURL& url, const GURL& url,
const GURL& first_party_for_cookies, const GURL& first_party_for_cookies,
const std::string& user_agent,
bool hide_url_log, bool hide_url_log,
MediaPlayerManager* manager); MediaPlayerManager* manager);
virtual ~MediaPlayerBridge(); virtual ~MediaPlayerBridge();
...@@ -140,6 +141,9 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid { ...@@ -140,6 +141,9 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid {
// First party url for cookies. // First party url for cookies.
GURL first_party_for_cookies_; GURL first_party_for_cookies_;
// User agent string to be used for media player.
const std::string user_agent_;
// Hide url log from media player. // Hide url log from media player.
bool hide_url_log_; bool hide_url_log_;
......
...@@ -40,6 +40,7 @@ class MEDIA_EXPORT MediaResourceGetter { ...@@ -40,6 +40,7 @@ class MEDIA_EXPORT MediaResourceGetter {
virtual void ExtractMediaMetadata( virtual void ExtractMediaMetadata(
const std::string& url, const std::string& url,
const std::string& cookies, const std::string& cookies,
const std::string& user_agent,
const ExtractMediaMetadataCB& callback) = 0; const ExtractMediaMetadataCB& callback) = 0;
}; };
......
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