1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "WebMediaPlayerClientImpl.h" 7 8 #if ENABLE(VIDEO) 9 10 #include "CString.h" 11 #include "Frame.h" 12 #include "GraphicsContext.h" 13 #include "HTMLMediaElement.h" 14 #include "IntSize.h" 15 #include "KURL.h" 16 #include "MediaPlayer.h" 17 #include "NotImplemented.h" 18 #include "TimeRanges.h" 19 20 #include "WebCanvas.h" 21 #include "WebCString.h" 22 #include "WebFrameClient.h" 23 #include "WebFrameImpl.h" 24 #include "WebKit.h" 25 #include "WebKitClient.h" 26 #include "WebMediaPlayer.h" 27 #include "WebMimeRegistry.h" 28 #include "WebRect.h" 29 #include "WebSize.h" 30 #include "WebString.h" 31 #include "WebURL.h" 32 33 // WebCommon.h defines WEBKIT_USING_SKIA so this has to be included last. 34 #if WEBKIT_USING_SKIA 35 #include "PlatformContextSkia.h" 36 #endif 37 38 #include <wtf/Assertions.h> 39 40 using namespace WebCore; 41 42 namespace WebKit { 43 44 static WebMediaPlayer* createWebMediaPlayer( 45 WebMediaPlayerClient* client, Frame* frame) 46 { 47 WebFrameImpl* webFrame = WebFrameImpl::fromFrame(frame); 48 if (!webFrame->client()) 49 return 0; 50 return webFrame->client()->createMediaPlayer(webFrame, client); 51 } 52 53 bool WebMediaPlayerClientImpl::m_isEnabled = false; 54 55 bool WebMediaPlayerClientImpl::isEnabled() 56 { 57 return m_isEnabled; 58 } 59 60 void WebMediaPlayerClientImpl::setIsEnabled(bool isEnabled) 61 { 62 m_isEnabled = isEnabled; 63 } 64 65 void WebMediaPlayerClientImpl::registerSelf(MediaEngineRegistrar registrar) 66 { 67 if (m_isEnabled) { 68 registrar(WebMediaPlayerClientImpl::create, 69 WebMediaPlayerClientImpl::getSupportedTypes, 70 WebMediaPlayerClientImpl::supportsType); 71 } 72 } 73 74 // WebMediaPlayerClient -------------------------------------------------------- 75 76 void WebMediaPlayerClientImpl::networkStateChanged() 77 { 78 ASSERT(m_mediaPlayer); 79 m_mediaPlayer->networkStateChanged(); 80 } 81 82 void WebMediaPlayerClientImpl::readyStateChanged() 83 { 84 ASSERT(m_mediaPlayer); 85 m_mediaPlayer->readyStateChanged(); 86 } 87 88 void WebMediaPlayerClientImpl::volumeChanged(float newVolume) 89 { 90 ASSERT(m_mediaPlayer); 91 m_mediaPlayer->volumeChanged(newVolume); 92 } 93 94 void WebMediaPlayerClientImpl::muteChanged(bool newMute) 95 { 96 ASSERT(m_mediaPlayer); 97 m_mediaPlayer->muteChanged(newMute); 98 } 99 100 void WebMediaPlayerClientImpl::timeChanged() 101 { 102 ASSERT(m_mediaPlayer); 103 m_mediaPlayer->timeChanged(); 104 } 105 106 void WebMediaPlayerClientImpl::repaint() 107 { 108 ASSERT(m_mediaPlayer); 109 m_mediaPlayer->repaint(); 110 } 111 112 void WebMediaPlayerClientImpl::durationChanged() 113 { 114 ASSERT(m_mediaPlayer); 115 m_mediaPlayer->durationChanged(); 116 } 117 118 void WebMediaPlayerClientImpl::rateChanged() 119 { 120 ASSERT(m_mediaPlayer); 121 m_mediaPlayer->rateChanged(); 122 } 123 124 void WebMediaPlayerClientImpl::sizeChanged() 125 { 126 ASSERT(m_mediaPlayer); 127 m_mediaPlayer->sizeChanged(); 128 } 129 130 void WebMediaPlayerClientImpl::sawUnsupportedTracks() 131 { 132 ASSERT(m_mediaPlayer); 133 m_mediaPlayer->mediaPlayerClient()->mediaPlayerSawUnsupportedTracks(m_mediaPlayer); 134 } 135 136 // MediaPlayerPrivateInterface ------------------------------------------------- 137 138 void WebMediaPlayerClientImpl::load(const String& url) 139 { 140 Frame* frame = static_cast<HTMLMediaElement*>( 141 m_mediaPlayer->mediaPlayerClient())->document()->frame(); 142 m_webMediaPlayer.set(createWebMediaPlayer(this, frame)); 143 if (m_webMediaPlayer.get()) 144 m_webMediaPlayer->load(KURL(ParsedURLString, url)); 145 } 146 147 void WebMediaPlayerClientImpl::cancelLoad() 148 { 149 if (m_webMediaPlayer.get()) 150 m_webMediaPlayer->cancelLoad(); 151 } 152 153 void WebMediaPlayerClientImpl::play() 154 { 155 if (m_webMediaPlayer.get()) 156 m_webMediaPlayer->play(); 157 } 158 159 void WebMediaPlayerClientImpl::pause() 160 { 161 if (m_webMediaPlayer.get()) 162 m_webMediaPlayer->pause(); 163 } 164 165 IntSize WebMediaPlayerClientImpl::naturalSize() const 166 { 167 if (m_webMediaPlayer.get()) 168 return m_webMediaPlayer->naturalSize(); 169 return IntSize(); 170 } 171 172 bool WebMediaPlayerClientImpl::hasVideo() const 173 { 174 if (m_webMediaPlayer.get()) 175 return m_webMediaPlayer->hasVideo(); 176 return false; 177 } 178 179 bool WebMediaPlayerClientImpl::hasAudio() const 180 { 181 if (m_webMediaPlayer.get()) 182 return m_webMediaPlayer->hasAudio(); 183 return false; 184 } 185 186 void WebMediaPlayerClientImpl::setVisible(bool visible) 187 { 188 if (m_webMediaPlayer.get()) 189 m_webMediaPlayer->setVisible(visible); 190 } 191 192 float WebMediaPlayerClientImpl::duration() const 193 { 194 if (m_webMediaPlayer.get()) 195 return m_webMediaPlayer->duration(); 196 return 0.0f; 197 } 198 199 float WebMediaPlayerClientImpl::currentTime() const 200 { 201 if (m_webMediaPlayer.get()) 202 return m_webMediaPlayer->currentTime(); 203 return 0.0f; 204 } 205 206 void WebMediaPlayerClientImpl::seek(float time) 207 { 208 if (m_webMediaPlayer.get()) 209 m_webMediaPlayer->seek(time); 210 } 211 212 bool WebMediaPlayerClientImpl::seeking() const 213 { 214 if (m_webMediaPlayer.get()) 215 return m_webMediaPlayer->seeking(); 216 return false; 217 } 218 219 void WebMediaPlayerClientImpl::setEndTime(float time) 220 { 221 if (m_webMediaPlayer.get()) 222 m_webMediaPlayer->setEndTime(time); 223 } 224 225 void WebMediaPlayerClientImpl::setRate(float rate) 226 { 227 if (m_webMediaPlayer.get()) 228 m_webMediaPlayer->setRate(rate); 229 } 230 231 bool WebMediaPlayerClientImpl::paused() const 232 { 233 if (m_webMediaPlayer.get()) 234 return m_webMediaPlayer->paused(); 235 return false; 236 } 237 238 bool WebMediaPlayerClientImpl::supportsFullscreen() const 239 { 240 if (m_webMediaPlayer.get()) 241 return m_webMediaPlayer->supportsFullscreen(); 242 return false; 243 } 244 245 bool WebMediaPlayerClientImpl::supportsSave() const 246 { 247 if (m_webMediaPlayer.get()) 248 return m_webMediaPlayer->supportsSave(); 249 return false; 250 } 251 252 void WebMediaPlayerClientImpl::setVolume(float volume) 253 { 254 if (m_webMediaPlayer.get()) 255 m_webMediaPlayer->setVolume(volume); 256 } 257 258 MediaPlayer::NetworkState WebMediaPlayerClientImpl::networkState() const 259 { 260 if (m_webMediaPlayer.get()) 261 return static_cast<MediaPlayer::NetworkState>(m_webMediaPlayer->networkState()); 262 return MediaPlayer::Empty; 263 } 264 265 MediaPlayer::ReadyState WebMediaPlayerClientImpl::readyState() const 266 { 267 if (m_webMediaPlayer.get()) 268 return static_cast<MediaPlayer::ReadyState>(m_webMediaPlayer->readyState()); 269 return MediaPlayer::HaveNothing; 270 } 271 272 float WebMediaPlayerClientImpl::maxTimeSeekable() const 273 { 274 if (m_webMediaPlayer.get()) 275 return m_webMediaPlayer->maxTimeSeekable(); 276 return 0.0f; 277 } 278 279 PassRefPtr<TimeRanges> WebMediaPlayerClientImpl::buffered() const 280 { 281 if (m_webMediaPlayer.get()) { 282 const WebTimeRanges& webRanges = m_webMediaPlayer->buffered(); 283 284 // FIXME: Save the time ranges in a member variable and update it when needed. 285 RefPtr<TimeRanges> ranges = TimeRanges::create(); 286 for (size_t i = 0; i < webRanges.size(); ++i) 287 ranges->add(webRanges[i].start, webRanges[i].end); 288 return ranges.release(); 289 } 290 return TimeRanges::create(); 291 } 292 293 int WebMediaPlayerClientImpl::dataRate() const 294 { 295 if (m_webMediaPlayer.get()) 296 return m_webMediaPlayer->dataRate(); 297 return 0; 298 } 299 300 bool WebMediaPlayerClientImpl::totalBytesKnown() const 301 { 302 if (m_webMediaPlayer.get()) 303 return m_webMediaPlayer->totalBytesKnown(); 304 return false; 305 } 306 307 unsigned WebMediaPlayerClientImpl::totalBytes() const 308 { 309 if (m_webMediaPlayer.get()) 310 return static_cast<unsigned>(m_webMediaPlayer->totalBytes()); 311 return 0; 312 } 313 314 unsigned WebMediaPlayerClientImpl::bytesLoaded() const 315 { 316 if (m_webMediaPlayer.get()) 317 return static_cast<unsigned>(m_webMediaPlayer->bytesLoaded()); 318 return 0; 319 } 320 321 void WebMediaPlayerClientImpl::setSize(const IntSize& size) 322 { 323 if (m_webMediaPlayer.get()) 324 m_webMediaPlayer->setSize(WebSize(size.width(), size.height())); 325 } 326 327 void WebMediaPlayerClientImpl::paint(GraphicsContext* context, const IntRect& rect) 328 { 329 // Normally GraphicsContext operations do nothing when painting is disabled. 330 // Since we're accessing platformContext() directly we have to manually 331 // check. 332 if (m_webMediaPlayer.get() && !context->paintingDisabled()) { 333 #if WEBKIT_USING_SKIA 334 m_webMediaPlayer->paint(context->platformContext()->canvas(), rect); 335 #elif WEBKIT_USING_CG 336 m_webMediaPlayer->paint(context->platformContext(), rect); 337 #else 338 notImplemented(); 339 #endif 340 } 341 } 342 343 void WebMediaPlayerClientImpl::setAutobuffer(bool autoBuffer) 344 { 345 if (m_webMediaPlayer.get()) 346 m_webMediaPlayer->setAutoBuffer(autoBuffer); 347 } 348 349 bool WebMediaPlayerClientImpl::hasSingleSecurityOrigin() const 350 { 351 if (m_webMediaPlayer.get()) 352 return m_webMediaPlayer->hasSingleSecurityOrigin(); 353 return false; 354 } 355 356 MediaPlayer::MovieLoadType WebMediaPlayerClientImpl::movieLoadType() const 357 { 358 if (m_webMediaPlayer.get()) 359 return static_cast<MediaPlayer::MovieLoadType>( 360 m_webMediaPlayer->movieLoadType()); 361 return MediaPlayer::Unknown; 362 } 363 364 MediaPlayerPrivateInterface* WebMediaPlayerClientImpl::create(MediaPlayer* player) 365 { 366 WebMediaPlayerClientImpl* client = new WebMediaPlayerClientImpl(); 367 client->m_mediaPlayer = player; 368 return client; 369 } 370 371 void WebMediaPlayerClientImpl::getSupportedTypes(HashSet<String>& supportedTypes) 372 { 373 // FIXME: integrate this list with WebMediaPlayerClientImpl::supportsType. 374 notImplemented(); 375 } 376 377 MediaPlayer::SupportsType WebMediaPlayerClientImpl::supportsType(const String& type, 378 const String& codecs) 379 { 380 WebMimeRegistry::SupportsType supportsType = 381 webKitClient()->mimeRegistry()->supportsMediaMIMEType(type, codecs); 382 383 switch (supportsType) { 384 default: 385 ASSERT_NOT_REACHED(); 386 case WebMimeRegistry::IsNotSupported: 387 return MediaPlayer::IsNotSupported; 388 case WebMimeRegistry::IsSupported: 389 return MediaPlayer::IsSupported; 390 case WebMimeRegistry::MayBeSupported: 391 return MediaPlayer::MayBeSupported; 392 } 393 return MediaPlayer::IsNotSupported; 394 } 395 396 WebMediaPlayerClientImpl::WebMediaPlayerClientImpl() 397 : m_mediaPlayer(0) 398 { 399 } 400 401 } // namespace WebKit 402 403 #endif // ENABLE(VIDEO) 404