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

Side by Side Diff: webkit/renderer/media/android/webmediaplayer_android.cc

Issue 16327002: android: Implement single origin and CORS check for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address nits. Created 7 years, 6 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 "webkit/renderer/media/android/webmediaplayer_android.h" 5 #include "webkit/renderer/media/android/webmediaplayer_android.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 pending_seek_(0), 71 pending_seek_(0),
72 seeking_(false), 72 seeking_(false),
73 did_loading_progress_(false), 73 did_loading_progress_(false),
74 manager_(manager), 74 manager_(manager),
75 network_state_(WebMediaPlayer::NetworkStateEmpty), 75 network_state_(WebMediaPlayer::NetworkStateEmpty),
76 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 76 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
77 is_playing_(false), 77 is_playing_(false),
78 needs_establish_peer_(true), 78 needs_establish_peer_(true),
79 stream_texture_proxy_initialized_(false), 79 stream_texture_proxy_initialized_(false),
80 has_size_info_(false), 80 has_size_info_(false),
81 has_media_metadata_(false),
82 has_media_info_(false),
81 stream_texture_factory_(factory), 83 stream_texture_factory_(factory),
82 needs_external_surface_(false), 84 needs_external_surface_(false),
83 video_frame_provider_client_(NULL), 85 video_frame_provider_client_(NULL),
84 source_type_(MediaPlayerAndroid::SOURCE_TYPE_URL), 86 source_type_(MediaPlayerAndroid::SOURCE_TYPE_URL),
85 proxy_(proxy), 87 proxy_(proxy),
86 current_time_(0), 88 current_time_(0),
87 media_log_(media_log), 89 media_log_(media_log),
88 media_stream_client_(NULL) { 90 media_stream_client_(NULL) {
89 DCHECK(proxy_); 91 DCHECK(proxy_);
90 92
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 #endif 153 #endif
152 } 154 }
153 155
154 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) { 156 void WebMediaPlayerAndroid::load(const WebURL& url, CORSMode cors_mode) {
155 load(url, NULL, cors_mode); 157 load(url, NULL, cors_mode);
156 } 158 }
157 159
158 void WebMediaPlayerAndroid::load(const WebURL& url, 160 void WebMediaPlayerAndroid::load(const WebURL& url,
159 WebMediaSource* media_source, 161 WebMediaSource* media_source,
160 CORSMode cors_mode) { 162 CORSMode cors_mode) {
161 if (cors_mode != CORSModeUnspecified)
162 NOTIMPLEMENTED() << "No CORS support";
163
164 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_URL; 163 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_URL;
164 has_media_metadata_ = false;
165 has_media_info_ = false;
165 166
166 if (media_source) 167 if (media_source)
167 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_MSE; 168 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_MSE;
168 #if defined(GOOGLE_TV) 169 #if defined(GOOGLE_TV)
169 if (media_stream_client_) { 170 if (media_stream_client_) {
170 DCHECK(!media_source); 171 DCHECK(!media_source);
171 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_STREAM; 172 source_type_ = MediaPlayerAndroid::SOURCE_TYPE_STREAM;
172 } 173 }
173 #endif 174 #endif
174 175
175 if (source_type_ != MediaPlayerAndroid::SOURCE_TYPE_URL) { 176 if (source_type_ != MediaPlayerAndroid::SOURCE_TYPE_URL) {
177 has_media_info_ = true;
176 media_source_delegate_.reset( 178 media_source_delegate_.reset(
177 new MediaSourceDelegate(proxy_, player_id_, media_log_)); 179 new MediaSourceDelegate(proxy_, player_id_, media_log_));
178 // |media_source_delegate_| is owned, so Unretained() is safe here. 180 // |media_source_delegate_| is owned, so Unretained() is safe here.
179 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_MSE) { 181 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_MSE) {
180 media_source_delegate_->InitializeMediaSource( 182 media_source_delegate_->InitializeMediaSource(
181 media_source, 183 media_source,
182 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)), 184 base::Bind(&WebMediaPlayerAndroid::OnNeedKey, base::Unretained(this)),
183 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, 185 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState,
184 base::Unretained(this)), 186 base::Unretained(this)),
185 BIND_TO_RENDER_LOOP(&WebMediaPlayerAndroid::OnDurationChange)); 187 BIND_TO_RENDER_LOOP(&WebMediaPlayerAndroid::OnDurationChange));
186 } 188 }
187 #if defined(GOOGLE_TV) 189 #if defined(GOOGLE_TV)
188 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_STREAM) { 190 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_STREAM) {
189 media_source_delegate_->InitializeMediaStream( 191 media_source_delegate_->InitializeMediaStream(
190 demuxer_, 192 demuxer_,
191 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState, 193 base::Bind(&WebMediaPlayerAndroid::UpdateNetworkState,
192 base::Unretained(this))); 194 base::Unretained(this)));
193 audio_renderer_ = media_stream_client_->GetAudioRenderer(url); 195 audio_renderer_ = media_stream_client_->GetAudioRenderer(url);
194 if (audio_renderer_) 196 if (audio_renderer_)
195 audio_renderer_->Start(); 197 audio_renderer_->Start();
196 } 198 }
197 #endif 199 #endif
200 } else {
201 info_loader_.reset(
202 new MediaInfoLoader(
203 url,
204 cors_mode,
205 base::Bind(&WebMediaPlayerAndroid::DidLoadMediaInfo,
206 base::Unretained(this))));
207 info_loader_->Start(frame_);
198 } 208 }
199 209
200 InitializeMediaPlayer(url); 210 InitializeMediaPlayer(url);
201 } 211 }
202 212
203 void WebMediaPlayerAndroid::InitializeMediaPlayer(const WebURL& url) { 213 void WebMediaPlayerAndroid::InitializeMediaPlayer(const WebURL& url) {
204 url_ = url; 214 url_ = url;
205 GURL first_party_url = frame_->document().firstPartyForCookies(); 215 GURL first_party_url = frame_->document().firstPartyForCookies();
206 proxy_->Initialize(player_id_, url, source_type_, first_party_url); 216 proxy_->Initialize(player_id_, url, source_type_, first_party_url);
207 if (manager_->IsInFullscreen(frame_)) 217 if (manager_->IsInFullscreen(frame_))
208 proxy_->EnterFullscreen(player_id_); 218 proxy_->EnterFullscreen(player_id_);
209 219
210 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading); 220 UpdateNetworkState(WebMediaPlayer::NetworkStateLoading);
211 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing); 221 UpdateReadyState(WebMediaPlayer::ReadyStateHaveNothing);
212 } 222 }
213 223
224 void WebMediaPlayerAndroid::DidLoadMediaInfo(
225 MediaInfoLoader::Status status) {
226 DCHECK(!media_source_delegate_);
227 if (status == MediaInfoLoader::kFailed) {
228 info_loader_.reset();
229 UpdateNetworkState(WebMediaPlayer::NetworkStateNetworkError);
230 return;
231 }
232
233 has_media_info_ = true;
234 if (has_media_metadata_ &&
235 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) {
236 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
237 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
238 }
239 }
240
214 void WebMediaPlayerAndroid::play() { 241 void WebMediaPlayerAndroid::play() {
215 #if defined(GOOGLE_TV) 242 #if defined(GOOGLE_TV)
216 if (hasVideo() && needs_external_surface_) { 243 if (hasVideo() && needs_external_surface_) {
217 DCHECK(!needs_establish_peer_); 244 DCHECK(!needs_establish_peer_);
218 proxy_->RequestExternalSurface(player_id_, last_computed_rect_); 245 proxy_->RequestExternalSurface(player_id_, last_computed_rect_);
219 } 246 }
220 if (audio_renderer_ && paused()) 247 if (audio_renderer_ && paused())
221 audio_renderer_->Play(); 248 audio_renderer_->Play();
222 #endif 249 #endif
223 if (hasVideo() && needs_establish_peer_) 250 if (hasVideo() && needs_establish_peer_)
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_, 412 web_graphics_context->copyTextureCHROMIUM(GL_TEXTURE_2D, texture_id_,
386 texture, level, internal_format, 413 texture, level, internal_format,
387 type); 414 type);
388 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false); 415 web_graphics_context->pixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, false);
389 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, 416 web_graphics_context->pixelStorei(GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM,
390 false); 417 false);
391 return true; 418 return true;
392 } 419 }
393 420
394 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const { 421 bool WebMediaPlayerAndroid::hasSingleSecurityOrigin() const {
395 // TODO(qinmin): fix this for urls that are not file. 422 if (info_loader_)
396 // https://code.google.com/p/chromium/issues/detail?id=234710 423 return info_loader_->HasSingleOrigin();
397 if (url_.SchemeIsFile()) 424 // The info loader may have failed.
398 return true; 425 if (source_type_ == MediaPlayerAndroid::SOURCE_TYPE_URL)
426 return false;
427 return true;
428 }
429
430 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const {
431 if (info_loader_)
432 return info_loader_->DidPassCORSAccessCheck();
399 return false; 433 return false;
400 } 434 }
401 435
402 bool WebMediaPlayerAndroid::didPassCORSAccessCheck() const {
403 return false;
404 }
405
406 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const { 436 double WebMediaPlayerAndroid::mediaTimeForTimeValue(double timeValue) const {
407 return ConvertSecondsToTimestamp(timeValue).InSecondsF(); 437 return ConvertSecondsToTimestamp(timeValue).InSecondsF();
408 } 438 }
409 439
410 unsigned WebMediaPlayerAndroid::decodedFrameCount() const { 440 unsigned WebMediaPlayerAndroid::decodedFrameCount() const {
411 if (media_source_delegate_) 441 if (media_source_delegate_)
412 return media_source_delegate_->DecodedFrameCount(); 442 return media_source_delegate_->DecodedFrameCount();
413 NOTIMPLEMENTED(); 443 NOTIMPLEMENTED();
414 return 0; 444 return 0;
415 } 445 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 // already triggers a durationchanged event. If this is a different 484 // already triggers a durationchanged event. If this is a different
455 // transition, remember to signal durationchanged. 485 // transition, remember to signal durationchanged.
456 // Do not ever signal durationchanged on metadata change in MSE case 486 // Do not ever signal durationchanged on metadata change in MSE case
457 // because OnDurationChange() handles this. 487 // because OnDurationChange() handles this.
458 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing && 488 if (ready_state_ > WebMediaPlayer::ReadyStateHaveNothing &&
459 source_type_ != MediaPlayerAndroid::SOURCE_TYPE_MSE) { 489 source_type_ != MediaPlayerAndroid::SOURCE_TYPE_MSE) {
460 need_to_signal_duration_changed = true; 490 need_to_signal_duration_changed = true;
461 } 491 }
462 } 492 }
463 493
464 if (ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) { 494 has_media_metadata_ = true;
495 if (has_media_info_ &&
496 ready_state_ != WebMediaPlayer::ReadyStateHaveEnoughData) {
465 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 497 UpdateReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
466 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 498 UpdateReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
467 } 499 }
468 500
469 // TODO(wolenetz): Should we just abort early and set network state to an 501 // TODO(wolenetz): Should we just abort early and set network state to an
470 // error if success == false? See http://crbug.com/248399 502 // error if success == false? See http://crbug.com/248399
471 if (success) 503 if (success)
472 OnVideoSizeChanged(width, height); 504 OnVideoSizeChanged(width, height);
473 505
474 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) { 506 if (hasVideo() && !video_weblayer_ && client_->needsWebLayerForVideo()) {
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 1114
1083 void WebMediaPlayerAndroid::exitFullscreen() { 1115 void WebMediaPlayerAndroid::exitFullscreen() {
1084 proxy_->ExitFullscreen(player_id_); 1116 proxy_->ExitFullscreen(player_id_);
1085 } 1117 }
1086 1118
1087 bool WebMediaPlayerAndroid::canEnterFullscreen() const { 1119 bool WebMediaPlayerAndroid::canEnterFullscreen() const {
1088 return manager_->CanEnterFullscreen(frame_); 1120 return manager_->CanEnterFullscreen(frame_);
1089 } 1121 }
1090 1122
1091 } // namespace webkit_media 1123 } // namespace webkit_media
OLDNEW
« no previous file with comments | « webkit/renderer/media/android/webmediaplayer_android.h ('k') | webkit/renderer/media/media_info_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698