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