Index: webkit/glue/media/simple_data_source.cc |
diff --git a/webkit/glue/media/simple_data_source.cc b/webkit/glue/media/simple_data_source.cc |
deleted file mode 100644 |
index 09736a53230578b3c8eb4b7722868729dc7008f3..0000000000000000000000000000000000000000 |
--- a/webkit/glue/media/simple_data_source.cc |
+++ /dev/null |
@@ -1,361 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "webkit/glue/media/simple_data_source.h" |
- |
-#include "base/bind.h" |
-#include "base/message_loop.h" |
-#include "base/process_util.h" |
-#include "media/base/filter_host.h" |
-#include "media/base/media_log.h" |
-#include "net/base/data_url.h" |
-#include "net/base/load_flags.h" |
-#include "net/http/http_request_headers.h" |
-#include "net/url_request/url_request_status.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebKitPlatformSupport.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderOptions.h" |
-#include "webkit/glue/media/web_data_source_factory.h" |
-#include "webkit/glue/webkit_glue.h" |
- |
-using WebKit::WebString; |
-using WebKit::WebURLLoaderOptions; |
- |
-namespace webkit_glue { |
- |
-static const char kDataScheme[] = "data"; |
- |
-static WebDataSource* NewSimpleDataSource(MessageLoop* render_loop, |
- WebKit::WebFrame* frame, |
- media::MediaLog* media_log) { |
- return new SimpleDataSource(render_loop, frame); |
-} |
- |
-// static |
-media::DataSourceFactory* SimpleDataSource::CreateFactory( |
- MessageLoop* render_loop, |
- WebKit::WebFrame* frame, |
- media::MediaLog* media_log, |
- const WebDataSourceBuildObserverHack& build_observer) { |
- return new WebDataSourceFactory(render_loop, frame, media_log, |
- &NewSimpleDataSource, build_observer); |
-} |
- |
-SimpleDataSource::SimpleDataSource( |
- MessageLoop* render_loop, |
- WebKit::WebFrame* frame) |
- : render_loop_(render_loop), |
- frame_(frame), |
- size_(-1), |
- single_origin_(true), |
- state_(UNINITIALIZED), |
- keep_test_loader_(false) { |
- DCHECK(render_loop); |
-} |
- |
-SimpleDataSource::~SimpleDataSource() { |
- base::AutoLock auto_lock(lock_); |
- DCHECK(state_ == UNINITIALIZED || state_ == STOPPED); |
-} |
- |
-void SimpleDataSource::set_host(media::FilterHost* host) { |
- DataSource::set_host(host); |
- |
- base::AutoLock auto_lock(lock_); |
- if (state_ == INITIALIZED) { |
- UpdateHostState(); |
- } |
-} |
- |
-void SimpleDataSource::Stop(const base::Closure& callback) { |
- base::AutoLock auto_lock(lock_); |
- state_ = STOPPED; |
- if (!callback.is_null()) |
- callback.Run(); |
- |
- // Post a task to the render thread to cancel loading the resource. |
- render_loop_->PostTask(FROM_HERE, |
- base::Bind(&SimpleDataSource::CancelTask, this)); |
-} |
- |
-void SimpleDataSource::Initialize( |
- const std::string& url, |
- const media::PipelineStatusCB& callback) { |
- // Reference to prevent destruction while inside the |initialize_cb_| |
- // call. This is a temporary fix to prevent crashes caused by holding the |
- // lock and running the destructor. |
- scoped_refptr<SimpleDataSource> destruction_guard(this); |
- { |
- base::AutoLock auto_lock(lock_); |
- DCHECK_EQ(state_, UNINITIALIZED); |
- DCHECK(!callback.is_null()); |
- state_ = INITIALIZING; |
- initialize_cb_ = callback; |
- |
- // Validate the URL. |
- url_ = GURL(url); |
- if (!url_.is_valid() || !IsProtocolSupportedForMedia(url_)) { |
- DoneInitialization_Locked(false); |
- return; |
- } |
- |
- // Post a task to the render thread to start loading the resource. |
- render_loop_->PostTask(FROM_HERE, |
- base::Bind(&SimpleDataSource::StartTask, this)); |
- } |
-} |
- |
-void SimpleDataSource::CancelInitialize() { |
- base::AutoLock auto_lock(lock_); |
- DCHECK(!initialize_cb_.is_null()); |
- state_ = STOPPED; |
- initialize_cb_.Reset(); |
- |
- // Post a task to the render thread to cancel loading the resource. |
- render_loop_->PostTask(FROM_HERE, |
- base::Bind(&SimpleDataSource::CancelTask, this)); |
-} |
- |
-void SimpleDataSource::Read(int64 position, |
- size_t size, |
- uint8* data, |
- const DataSource::ReadCallback& read_callback) { |
- DCHECK_GE(size_, 0); |
- if (position >= size_) { |
- read_callback.Run(0); |
- } else { |
- size_t copied = std::min(size, static_cast<size_t>(size_ - position)); |
- memcpy(data, data_.c_str() + position, copied); |
- read_callback.Run(copied); |
- } |
-} |
- |
-bool SimpleDataSource::GetSize(int64* size_out) { |
- *size_out = size_; |
- return true; |
-} |
- |
-bool SimpleDataSource::IsStreaming() { |
- return false; |
-} |
- |
-void SimpleDataSource::SetPreload(media::Preload preload) { |
-} |
- |
-void SimpleDataSource::SetBitrate(int bitrate) { |
-} |
- |
-void SimpleDataSource::SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader) { |
- url_loader_.reset(mock_loader); |
- keep_test_loader_ = true; |
-} |
- |
-void SimpleDataSource::willSendRequest( |
- WebKit::WebURLLoader* loader, |
- WebKit::WebURLRequest& newRequest, |
- const WebKit::WebURLResponse& redirectResponse) { |
- DCHECK(MessageLoop::current() == render_loop_); |
- base::AutoLock auto_lock(lock_); |
- |
- // Only allow |single_origin_| if we haven't seen a different origin yet. |
- if (single_origin_) |
- single_origin_ = url_.GetOrigin() == GURL(newRequest.url()).GetOrigin(); |
- |
- url_ = newRequest.url(); |
-} |
- |
-void SimpleDataSource::didSendData( |
- WebKit::WebURLLoader* loader, |
- unsigned long long bytesSent, |
- unsigned long long totalBytesToBeSent) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void SimpleDataSource::didReceiveResponse( |
- WebKit::WebURLLoader* loader, |
- const WebKit::WebURLResponse& response) { |
- DCHECK(MessageLoop::current() == render_loop_); |
- size_ = response.expectedContentLength(); |
-} |
- |
-void SimpleDataSource::didDownloadData( |
- WebKit::WebURLLoader* loader, |
- int dataLength) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void SimpleDataSource::didReceiveData( |
- WebKit::WebURLLoader* loader, |
- const char* data, |
- int data_length, |
- int encoded_data_length) { |
- DCHECK(MessageLoop::current() == render_loop_); |
- data_.append(data, data_length); |
-} |
- |
-void SimpleDataSource::didReceiveCachedMetadata( |
- WebKit::WebURLLoader* loader, |
- const char* data, |
- int dataLength) { |
- NOTIMPLEMENTED(); |
-} |
- |
-void SimpleDataSource::didFinishLoading( |
- WebKit::WebURLLoader* loader, |
- double finishTime) { |
- DCHECK(MessageLoop::current() == render_loop_); |
- // Reference to prevent destruction while inside the |initialize_cb_| |
- // call. This is a temporary fix to prevent crashes caused by holding the |
- // lock and running the destructor. |
- scoped_refptr<SimpleDataSource> destruction_guard(this); |
- { |
- base::AutoLock auto_lock(lock_); |
- // It's possible this gets called after Stop(), in which case |host_| is no |
- // longer valid. |
- if (state_ == STOPPED) |
- return; |
- |
- // Otherwise we should be initializing and have created a WebURLLoader. |
- DCHECK_EQ(state_, INITIALIZING); |
- |
- // If we don't get a content length or the request has failed, report it |
- // as a network error. |
- if (size_ == -1) |
- size_ = data_.length(); |
- DCHECK(static_cast<size_t>(size_) == data_.length()); |
- |
- DoneInitialization_Locked(true); |
- } |
-} |
- |
-void SimpleDataSource::didFail( |
- WebKit::WebURLLoader* loader, |
- const WebKit::WebURLError& error) { |
- DCHECK(MessageLoop::current() == render_loop_); |
- // Reference to prevent destruction while inside the |initialize_cb_| |
- // call. This is a temporary fix to prevent crashes caused by holding the |
- // lock and running the destructor. |
- scoped_refptr<SimpleDataSource> destruction_guard(this); |
- { |
- base::AutoLock auto_lock(lock_); |
- // It's possible this gets called after Stop(), in which case |host_| is no |
- // longer valid. |
- if (state_ == STOPPED) |
- return; |
- |
- // Otherwise we should be initializing and have created a WebURLLoader. |
- DCHECK_EQ(state_, INITIALIZING); |
- |
- // If we don't get a content length or the request has failed, report it |
- // as a network error. |
- if (size_ == -1) |
- size_ = data_.length(); |
- DCHECK(static_cast<size_t>(size_) == data_.length()); |
- |
- DoneInitialization_Locked(false); |
- } |
-} |
- |
-bool SimpleDataSource::HasSingleOrigin() { |
- DCHECK(MessageLoop::current() == render_loop_); |
- return single_origin_; |
-} |
- |
-void SimpleDataSource::Abort() { |
- DCHECK(MessageLoop::current() == render_loop_); |
- frame_ = NULL; |
-} |
- |
-void SimpleDataSource::StartTask() { |
- DCHECK(MessageLoop::current() == render_loop_); |
- // Reference to prevent destruction while inside the |initialize_cb_| |
- // call. This is a temporary fix to prevent crashes caused by holding the |
- // lock and running the destructor. |
- scoped_refptr<SimpleDataSource> destruction_guard(this); |
- { |
- base::AutoLock auto_lock(lock_); |
- |
- // We may have stopped. |
- if (state_ == STOPPED) |
- return; |
- |
- CHECK(frame_); |
- |
- DCHECK_EQ(state_, INITIALIZING); |
- |
- if (url_.SchemeIs(kDataScheme)) { |
- // If this using data protocol, we just need to decode it. |
- std::string mime_type, charset; |
- bool success = net::DataURL::Parse(url_, &mime_type, &charset, &data_); |
- |
- // Don't care about the mime-type just proceed if decoding was successful. |
- size_ = data_.length(); |
- DoneInitialization_Locked(success); |
- } else { |
- // Prepare the request. |
- WebKit::WebURLRequest request(url_); |
- request.setTargetType(WebKit::WebURLRequest::TargetIsMedia); |
- |
- frame_->setReferrerForRequest(request, WebKit::WebURL()); |
- |
- // Disable compression, compression for audio/video doesn't make sense... |
- request.setHTTPHeaderField( |
- WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding), |
- WebString::fromUTF8("identity;q=1, *;q=0")); |
- |
- // This flag is for unittests as we don't want to reset |url_loader| |
- if (!keep_test_loader_) { |
- WebURLLoaderOptions options; |
- options.allowCredentials = true; |
- options.crossOriginRequestPolicy = |
- WebURLLoaderOptions::CrossOriginRequestPolicyAllow; |
- url_loader_.reset(frame_->createAssociatedURLLoader(options)); |
- } |
- |
- // Start the resource loading. |
- url_loader_->loadAsynchronously(request, this); |
- } |
- } |
-} |
- |
-void SimpleDataSource::CancelTask() { |
- DCHECK(MessageLoop::current() == render_loop_); |
- base::AutoLock auto_lock(lock_); |
- DCHECK_EQ(state_, STOPPED); |
- |
- // Cancel any pending requests. |
- if (url_loader_.get()) { |
- url_loader_->cancel(); |
- url_loader_.reset(); |
- } |
-} |
- |
-void SimpleDataSource::DoneInitialization_Locked(bool success) { |
- lock_.AssertAcquired(); |
- media::PipelineStatus status = media::PIPELINE_ERROR_NETWORK; |
- if (success) { |
- state_ = INITIALIZED; |
- |
- UpdateHostState(); |
- status = media::PIPELINE_OK; |
- } else { |
- state_ = UNINITIALIZED; |
- url_loader_.reset(); |
- } |
- |
- initialize_cb_.Run(status); |
- initialize_cb_.Reset(); |
-} |
- |
-void SimpleDataSource::UpdateHostState() { |
- if (host()) { |
- host()->SetTotalBytes(size_); |
- host()->SetBufferedBytes(size_); |
- // If scheme is file or data, say we are loaded. |
- host()->SetLoaded(url_.SchemeIsFile() || url_.SchemeIs(kDataScheme)); |
- } |
-} |
- |
-} // namespace webkit_glue |