Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(469)

Side by Side Diff: content/browser/media/android/media_resource_getter_impl.cc

Issue 405663002: Support basic authentication for html5 media (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: updating crbug Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/media/android/media_resource_getter_impl.h" 5 #include "content/browser/media/android/media_resource_getter_impl.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 8 #include "base/android/jni_string.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/path_service.h" 10 #include "base/path_service.h"
11 #include "base/threading/sequenced_worker_pool.h" 11 #include "base/threading/sequenced_worker_pool.h"
12 #include "content/browser/child_process_security_policy_impl.h" 12 #include "content/browser/child_process_security_policy_impl.h"
13 #include "content/browser/fileapi/browser_file_system_helper.h" 13 #include "content/browser/fileapi/browser_file_system_helper.h"
14 #include "content/browser/fileapi/chrome_blob_storage_context.h" 14 #include "content/browser/fileapi/chrome_blob_storage_context.h"
15 #include "content/public/browser/browser_context.h" 15 #include "content/public/browser/browser_context.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/content_browser_client.h" 17 #include "content/public/browser/content_browser_client.h"
18 #include "content/public/common/content_client.h" 18 #include "content/public/common/content_client.h"
19 #include "content/public/common/url_constants.h" 19 #include "content/public/common/url_constants.h"
20 #include "jni/MediaResourceGetter_jni.h" 20 #include "jni/MediaResourceGetter_jni.h"
21 #include "net/base/auth.h"
21 #include "net/cookies/cookie_monster.h" 22 #include "net/cookies/cookie_monster.h"
22 #include "net/cookies/cookie_store.h" 23 #include "net/cookies/cookie_store.h"
24 #include "net/http/http_auth.h"
25 #include "net/http/http_transaction_factory.h"
23 #include "net/url_request/url_request_context.h" 26 #include "net/url_request/url_request_context.h"
24 #include "net/url_request/url_request_context_getter.h" 27 #include "net/url_request/url_request_context_getter.h"
25 #include "url/gurl.h" 28 #include "url/gurl.h"
26 #include "webkit/browser/blob/blob_data_handle.h" 29 #include "webkit/browser/blob/blob_data_handle.h"
27 #include "webkit/browser/blob/blob_storage_context.h" 30 #include "webkit/browser/blob/blob_storage_context.h"
28 31
29 using base::android::ConvertUTF8ToJavaString; 32 using base::android::ConvertUTF8ToJavaString;
30 using base::android::ScopedJavaLocalRef; 33 using base::android::ScopedJavaLocalRef;
31 34
32 namespace content { 35 namespace content {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 BrowserThread::PostTask( 100 BrowserThread::PostTask(
98 BrowserThread::UI, FROM_HERE, 101 BrowserThread::UI, FROM_HERE,
99 base::Bind(callback, base::TimeDelta::FromMilliseconds( 102 base::Bind(callback, base::TimeDelta::FromMilliseconds(
100 Java_MediaMetadata_getDurationInMilliseconds( 103 Java_MediaMetadata_getDurationInMilliseconds(
101 env, j_metadata.obj())), 104 env, j_metadata.obj())),
102 Java_MediaMetadata_getWidth(env, j_metadata.obj()), 105 Java_MediaMetadata_getWidth(env, j_metadata.obj()),
103 Java_MediaMetadata_getHeight(env, j_metadata.obj()), 106 Java_MediaMetadata_getHeight(env, j_metadata.obj()),
104 Java_MediaMetadata_isSuccess(env, j_metadata.obj()))); 107 Java_MediaMetadata_isSuccess(env, j_metadata.obj())));
105 } 108 }
106 109
107 // The task object that retrieves cookie on the IO thread. 110 // The task object that retrieves media resources on the IO thread.
108 // TODO(qinmin): refactor this class to make the code reusable by others as 111 // TODO(qinmin): refactor this class to make the code reusable by others as
109 // there are lots of duplicated functionalities elsewhere. 112 // there are lots of duplicated functionalities elsewhere.
110 class CookieGetterTask 113 // http://crbug.com/395762.
111 : public base::RefCountedThreadSafe<CookieGetterTask> { 114 class MediaResourceGetterTask
115 : public base::RefCountedThreadSafe<MediaResourceGetterTask> {
112 public: 116 public:
113 CookieGetterTask(BrowserContext* browser_context, 117 MediaResourceGetterTask(BrowserContext* browser_context,
114 int render_process_id, int render_frame_id); 118 int render_process_id, int render_frame_id);
115 119
116 // Called by CookieGetterImpl to start getting cookies for a URL. 120 // Called by MediaResourceGetterImpl to start getting auth credentials.
121 net::AuthCredentials RequestAuthCredentials(const GURL& url) const;
122
123 // Called by MediaResourceGetterImpl to start getting cookies for a URL.
117 void RequestCookies( 124 void RequestCookies(
118 const GURL& url, const GURL& first_party_for_cookies, 125 const GURL& url, const GURL& first_party_for_cookies,
119 const media::MediaResourceGetter::GetCookieCB& callback); 126 const media::MediaResourceGetter::GetCookieCB& callback);
120 127
121 private: 128 private:
122 friend class base::RefCountedThreadSafe<CookieGetterTask>; 129 friend class base::RefCountedThreadSafe<MediaResourceGetterTask>;
123 virtual ~CookieGetterTask(); 130 virtual ~MediaResourceGetterTask();
124 131
125 void CheckPolicyForCookies( 132 void CheckPolicyForCookies(
126 const GURL& url, const GURL& first_party_for_cookies, 133 const GURL& url, const GURL& first_party_for_cookies,
127 const media::MediaResourceGetter::GetCookieCB& callback, 134 const media::MediaResourceGetter::GetCookieCB& callback,
128 const net::CookieList& cookie_list); 135 const net::CookieList& cookie_list);
129 136
130 // Context getter used to get the CookieStore. 137 // Context getter used to get the CookieStore and auth cache.
131 net::URLRequestContextGetter* context_getter_; 138 net::URLRequestContextGetter* context_getter_;
132 139
133 // Resource context for checking cookie policies. 140 // Resource context for checking cookie policies.
134 ResourceContext* resource_context_; 141 ResourceContext* resource_context_;
135 142
136 // Render process id, used to check whether the process can access cookies. 143 // Render process id, used to check whether the process can access cookies.
137 int render_process_id_; 144 int render_process_id_;
138 145
139 // Render frame id, used to check tab specific cookie policy. 146 // Render frame id, used to check tab specific cookie policy.
140 int render_frame_id_; 147 int render_frame_id_;
141 148
142 DISALLOW_COPY_AND_ASSIGN(CookieGetterTask); 149 DISALLOW_COPY_AND_ASSIGN(MediaResourceGetterTask);
143 }; 150 };
144 151
145 CookieGetterTask::CookieGetterTask( 152 MediaResourceGetterTask::MediaResourceGetterTask(
146 BrowserContext* browser_context, int render_process_id, int render_frame_id) 153 BrowserContext* browser_context, int render_process_id, int render_frame_id)
147 : context_getter_(browser_context->GetRequestContext()), 154 : context_getter_(browser_context->GetRequestContext()),
148 resource_context_(browser_context->GetResourceContext()), 155 resource_context_(browser_context->GetResourceContext()),
149 render_process_id_(render_process_id), 156 render_process_id_(render_process_id),
150 render_frame_id_(render_frame_id) { 157 render_frame_id_(render_frame_id) {
151 } 158 }
152 159
153 CookieGetterTask::~CookieGetterTask() {} 160 MediaResourceGetterTask::~MediaResourceGetterTask() {}
154 161
155 void CookieGetterTask::RequestCookies( 162 net::AuthCredentials MediaResourceGetterTask::RequestAuthCredentials(
163 const GURL& url) const {
164 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
165 net::HttpTransactionFactory* factory =
166 context_getter_->GetURLRequestContext()->http_transaction_factory();
167 if (!factory)
168 return net::AuthCredentials();
169
170 net::HttpAuthCache* auth_cache =
171 factory->GetSession()->http_auth_cache();
172 if (!auth_cache)
173 return net::AuthCredentials();
174
175 net::HttpAuthCache::Entry* entry =
176 auth_cache->LookupByPath(url.GetOrigin(), url.path());
177
178 // TODO(qinmin): handle other auth schemes. See http://crbug.com/395219.
179 if (entry && entry->scheme() == net::HttpAuth::AUTH_SCHEME_BASIC)
180 return entry->credentials();
181 else
182 return net::AuthCredentials();
183 }
184
185 void MediaResourceGetterTask::RequestCookies(
156 const GURL& url, const GURL& first_party_for_cookies, 186 const GURL& url, const GURL& first_party_for_cookies,
157 const media::MediaResourceGetter::GetCookieCB& callback) { 187 const media::MediaResourceGetter::GetCookieCB& callback) {
158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
159 ChildProcessSecurityPolicyImpl* policy = 189 ChildProcessSecurityPolicyImpl* policy =
160 ChildProcessSecurityPolicyImpl::GetInstance(); 190 ChildProcessSecurityPolicyImpl::GetInstance();
161 if (!policy->CanAccessCookiesForOrigin(render_process_id_, url)) { 191 if (!policy->CanAccessCookiesForOrigin(render_process_id_, url)) {
162 callback.Run(std::string()); 192 callback.Run(std::string());
163 return; 193 return;
164 } 194 }
165 195
166 net::CookieStore* cookie_store = 196 net::CookieStore* cookie_store =
167 context_getter_->GetURLRequestContext()->cookie_store(); 197 context_getter_->GetURLRequestContext()->cookie_store();
168 if (!cookie_store) { 198 if (!cookie_store) {
169 callback.Run(std::string()); 199 callback.Run(std::string());
170 return; 200 return;
171 } 201 }
172 202
173 net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster(); 203 net::CookieMonster* cookie_monster = cookie_store->GetCookieMonster();
174 if (cookie_monster) { 204 if (cookie_monster) {
175 cookie_monster->GetAllCookiesForURLAsync(url, base::Bind( 205 cookie_monster->GetAllCookiesForURLAsync(url, base::Bind(
176 &CookieGetterTask::CheckPolicyForCookies, this, 206 &MediaResourceGetterTask::CheckPolicyForCookies, this,
177 url, first_party_for_cookies, callback)); 207 url, first_party_for_cookies, callback));
178 } else { 208 } else {
179 callback.Run(std::string()); 209 callback.Run(std::string());
180 } 210 }
181 } 211 }
182 212
183 void CookieGetterTask::CheckPolicyForCookies( 213 void MediaResourceGetterTask::CheckPolicyForCookies(
184 const GURL& url, const GURL& first_party_for_cookies, 214 const GURL& url, const GURL& first_party_for_cookies,
185 const media::MediaResourceGetter::GetCookieCB& callback, 215 const media::MediaResourceGetter::GetCookieCB& callback,
186 const net::CookieList& cookie_list) { 216 const net::CookieList& cookie_list) {
187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
188 if (GetContentClient()->browser()->AllowGetCookie( 218 if (GetContentClient()->browser()->AllowGetCookie(
189 url, first_party_for_cookies, cookie_list, 219 url, first_party_for_cookies, cookie_list,
190 resource_context_, render_process_id_, render_frame_id_)) { 220 resource_context_, render_process_id_, render_frame_id_)) {
191 net::CookieStore* cookie_store = 221 net::CookieStore* cookie_store =
192 context_getter_->GetURLRequestContext()->cookie_store(); 222 context_getter_->GetURLRequestContext()->cookie_store();
193 net::CookieOptions options; 223 net::CookieOptions options;
(...skipping 10 matching lines...) Expand all
204 int render_process_id, 234 int render_process_id,
205 int render_frame_id) 235 int render_frame_id)
206 : browser_context_(browser_context), 236 : browser_context_(browser_context),
207 file_system_context_(file_system_context), 237 file_system_context_(file_system_context),
208 render_process_id_(render_process_id), 238 render_process_id_(render_process_id),
209 render_frame_id_(render_frame_id), 239 render_frame_id_(render_frame_id),
210 weak_factory_(this) {} 240 weak_factory_(this) {}
211 241
212 MediaResourceGetterImpl::~MediaResourceGetterImpl() {} 242 MediaResourceGetterImpl::~MediaResourceGetterImpl() {}
213 243
244 void MediaResourceGetterImpl::GetAuthCredentials(
245 const GURL& url, const GetAuthCredentialsCB& callback) {
246 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
247 scoped_refptr<MediaResourceGetterTask> task = new MediaResourceGetterTask(
248 browser_context_, 0, 0);
249
250 BrowserThread::PostTaskAndReplyWithResult(
251 BrowserThread::IO,
252 FROM_HERE,
253 base::Bind(&MediaResourceGetterTask::RequestAuthCredentials, task, url),
254 base::Bind(&MediaResourceGetterImpl::GetAuthCredentialsCallback,
255 weak_factory_.GetWeakPtr(), callback));
256 }
257
214 void MediaResourceGetterImpl::GetCookies( 258 void MediaResourceGetterImpl::GetCookies(
215 const GURL& url, const GURL& first_party_for_cookies, 259 const GURL& url, const GURL& first_party_for_cookies,
216 const GetCookieCB& callback) { 260 const GetCookieCB& callback) {
217 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 261 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
218 scoped_refptr<CookieGetterTask> task = new CookieGetterTask( 262 scoped_refptr<MediaResourceGetterTask> task = new MediaResourceGetterTask(
219 browser_context_, render_process_id_, render_frame_id_); 263 browser_context_, render_process_id_, render_frame_id_);
220 264
221 GetCookieCB cb = base::Bind(&MediaResourceGetterImpl::GetCookiesCallback, 265 GetCookieCB cb = base::Bind(&MediaResourceGetterImpl::GetCookiesCallback,
222 weak_factory_.GetWeakPtr(), 266 weak_factory_.GetWeakPtr(),
223 callback); 267 callback);
224 BrowserThread::PostTask( 268 BrowserThread::PostTask(
225 BrowserThread::IO, 269 BrowserThread::IO,
226 FROM_HERE, 270 FROM_HERE,
227 base::Bind(&CookieGetterTask::RequestCookies, 271 base::Bind(&MediaResourceGetterTask::RequestCookies,
228 task, url, first_party_for_cookies, 272 task, url, first_party_for_cookies,
229 base::Bind(&ReturnResultOnUIThread, cb))); 273 base::Bind(&ReturnResultOnUIThread, cb)));
230 } 274 }
231 275
276 void MediaResourceGetterImpl::GetAuthCredentialsCallback(
277 const GetAuthCredentialsCB& callback,
278 const net::AuthCredentials& credentials) {
279 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
280 callback.Run(credentials.username(), credentials.password());
281 }
282
232 void MediaResourceGetterImpl::GetCookiesCallback( 283 void MediaResourceGetterImpl::GetCookiesCallback(
233 const GetCookieCB& callback, const std::string& cookies) { 284 const GetCookieCB& callback, const std::string& cookies) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 285 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
235 callback.Run(cookies); 286 callback.Run(cookies);
236 } 287 }
237 288
238 void MediaResourceGetterImpl::GetPlatformPathFromURL( 289 void MediaResourceGetterImpl::GetPlatformPathFromURL(
239 const GURL& url, const GetPlatformPathCB& callback) { 290 const GURL& url, const GetPlatformPathCB& callback) {
240 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
241 DCHECK(url.SchemeIsFileSystem() || url.SchemeIs(url::kBlobScheme)); 292 DCHECK(url.SchemeIsFileSystem() || url.SchemeIs(url::kBlobScheme));
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 FROM_HERE, 327 FROM_HERE,
277 base::Bind(&GetMediaMetadata, url, cookies, user_agent, callback)); 328 base::Bind(&GetMediaMetadata, url, cookies, user_agent, callback));
278 } 329 }
279 330
280 // static 331 // static
281 bool MediaResourceGetterImpl::RegisterMediaResourceGetter(JNIEnv* env) { 332 bool MediaResourceGetterImpl::RegisterMediaResourceGetter(JNIEnv* env) {
282 return RegisterNativesImpl(env); 333 return RegisterNativesImpl(env);
283 } 334 }
284 335
285 } // namespace content 336 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/media/android/media_resource_getter_impl.h ('k') | content/renderer/media/android/webmediaplayer_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698