| Index: chrome/browser/net/view_http_cache_job_factory.cc
|
| ===================================================================
|
| --- chrome/browser/net/view_http_cache_job_factory.cc (revision 48306)
|
| +++ chrome/browser/net/view_http_cache_job_factory.cc (working copy)
|
| @@ -4,7 +4,9 @@
|
|
|
| #include "chrome/browser/net/view_http_cache_job_factory.h"
|
|
|
| +#include "base/message_loop.h"
|
| #include "chrome/common/url_constants.h"
|
| +#include "net/base/net_errors.h"
|
| #include "net/url_request/url_request.h"
|
| #include "net/url_request/url_request_context.h"
|
| #include "net/url_request/url_request_simple_job.h"
|
| @@ -13,49 +15,93 @@
|
| namespace {
|
|
|
| // A job subclass that dumps an HTTP cache entry.
|
| -class ViewHttpCacheJob : public URLRequestSimpleJob {
|
| +class ViewHttpCacheJob : public URLRequestJob {
|
| public:
|
| explicit ViewHttpCacheJob(URLRequest* request)
|
| - : URLRequestSimpleJob(request) {}
|
| + : URLRequestJob(request), data_offset_(0),
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(
|
| + callback_(this, &ViewHttpCacheJob::OnIOComplete)) {}
|
|
|
| - // URLRequestSimpleJob methods:
|
| - virtual bool GetData(std::string* mime_type,
|
| - std::string* charset,
|
| - std::string* data) const;
|
| + virtual void Start();
|
| + virtual bool GetMimeType(std::string* mime_type) const;
|
| + virtual bool GetCharset(std::string* charset);
|
| + virtual bool ReadRawData(net::IOBuffer* buf, int buf_size, int *bytes_read);
|
|
|
| private:
|
| ~ViewHttpCacheJob() {}
|
| +
|
| + // Called when ViewCacheHelper completes the operation.
|
| + void OnIOComplete(int result);
|
| +
|
| + std::string data_;
|
| + int data_offset_;
|
| + net::ViewCacheHelper cache_helper_;
|
| + net::CompletionCallbackImpl<ViewHttpCacheJob> callback_;
|
| };
|
|
|
| -bool ViewHttpCacheJob::GetData(std::string* mime_type,
|
| - std::string* charset,
|
| - std::string* data) const {
|
| +void ViewHttpCacheJob::Start() {
|
| + if (!request_)
|
| + return;
|
| +
|
| + std::string cache_key =
|
| + request_->url().spec().substr(strlen(chrome::kNetworkViewCacheURL));
|
| +
|
| + int rv;
|
| + if (cache_key.empty()) {
|
| + rv = cache_helper_.GetContentsHTML(request_->context(),
|
| + chrome::kNetworkViewCacheURL, &data_,
|
| + &callback_);
|
| + } else {
|
| + rv = cache_helper_.GetEntryInfoHTML(cache_key, request_->context(),
|
| + &data_, &callback_);
|
| + }
|
| +
|
| + if (rv != net::ERR_IO_PENDING) {
|
| + // Start reading asynchronously so that all error reporting and data
|
| + // callbacks happen as they would for network requests.
|
| + MessageLoop::current()->PostTask(FROM_HERE, NewRunnableMethod(
|
| + this, &ViewHttpCacheJob::OnIOComplete, rv));
|
| + }
|
| +}
|
| +
|
| +bool ViewHttpCacheJob::GetMimeType(std::string* mime_type) const {
|
| mime_type->assign("text/html");
|
| + return true;
|
| +}
|
| +
|
| +bool ViewHttpCacheJob::GetCharset(std::string* charset) {
|
| charset->assign("UTF-8");
|
| + return true;
|
| +}
|
|
|
| - data->clear();
|
| +bool ViewHttpCacheJob::ReadRawData(net::IOBuffer* buf, int buf_size,
|
| + int* bytes_read) {
|
| + DCHECK(bytes_read);
|
| + int remaining = static_cast<int>(data_.size()) - data_offset_;
|
| + if (buf_size > remaining)
|
| + buf_size = remaining;
|
| + memcpy(buf->data(), data_.data() + data_offset_, buf_size);
|
| + data_offset_ += buf_size;
|
| + *bytes_read = buf_size;
|
| + return true;
|
| +}
|
|
|
| - std::string cache_key;
|
| - cache_key =
|
| - request_->url().spec().substr(strlen(chrome::kNetworkViewCacheURL));
|
| - ViewCacheHelper::GetEntryInfoHTML(cache_key,
|
| - request_->context(),
|
| - chrome::kNetworkViewCacheURL,
|
| - data);
|
| +void ViewHttpCacheJob::OnIOComplete(int result) {
|
| + DCHECK_EQ(net::OK, result);
|
|
|
| - return true;
|
| + // Notify that the headers are complete.
|
| + NotifyHeadersComplete();
|
| }
|
|
|
| -} // namespace
|
| +} // namespace.
|
|
|
| -// static
|
| +// Static.
|
| bool ViewHttpCacheJobFactory::IsSupportedURL(const GURL& url) {
|
| - return StartsWithASCII(url.spec(),
|
| - chrome::kNetworkViewCacheURL,
|
| + return StartsWithASCII(url.spec(), chrome::kNetworkViewCacheURL,
|
| true /*case_sensitive*/);
|
| }
|
|
|
| -// static
|
| +// Static.
|
| URLRequestJob* ViewHttpCacheJobFactory::CreateJobForRequest(
|
| URLRequest* request) {
|
| return new ViewHttpCacheJob(request);
|
|
|