// Copyright (c) 2006-2008 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 "config.h" #include "base/compiler_specific.h" #include "webkit/glue/feed_preview.h" MSVC_PUSH_WARNING_LEVEL(0); #include "ResourceRequest.h" #include "ResourceResponse.h" #include "ResourceHandle.h" MSVC_POP_WARNING(); #undef LOG #include "base/logging.h" #include "base/string_piece.h" #include "grit/webkit_resources.h" #include "googleurl/src/gurl.h" #include "webkit/glue/glue_util.h" #include "webkit/glue/webkit_glue.h" namespace WebCore { // Generate a preview for a feed. |url| is the (http://) URL of the feed, // and |data| are the bytes we received in response to the HTTP request. // Returns an HTML string. static std::string MakeFeedPreview(const std::string& url, const std::string& data) { // TODO(evanm): this is just a placeholder. // Maybe we should make this parse the feed data and display a preview? // Yuck. Seems like a lot of effort for a pretty minor feature. // The feed preview template has {{URL}} in place of where the URL should go. const std::string kUrlTemplate = "{{URL}}"; const std::string& feed_template = webkit_glue::GetDataResource(IDR_FEED_PREVIEW).as_string(); std::string::size_type template_offset = feed_template.find(kUrlTemplate); DCHECK(template_offset != std::string::npos); // TODO(evanm): URL-escape URL! return feed_template.substr(0, template_offset) + url + feed_template.substr(template_offset + kUrlTemplate.size()); } FeedClientProxy::FeedClientProxy(ResourceHandleClient* client) : client_(client), do_feed_preview_(false) { } void FeedClientProxy::didReceiveResponse(ResourceHandle* handle, const ResourceResponse& response) { if (response.httpStatusCode() == 200) { ResourceResponse new_response(response); // Our feed preview has mime type text/html. new_response.setMimeType("text/html"); do_feed_preview_ = true; client_->didReceiveResponse(handle, new_response); } else { client_->didReceiveResponse(handle, response); } } void FeedClientProxy::didReceiveData(ResourceHandle*, const char* data, int data_len, int length_received) { length_received_ = length_received; data_.append(data, data_len); } void FeedClientProxy::didFinishLoading(ResourceHandle* handle) { const std::string url = webkit_glue::KURLToGURL(handle->request().url()).spec(); const std::string& data = do_feed_preview_ ? MakeFeedPreview(url, data_) : data_; client_->didReceiveData(handle, data.data(), data.size(), length_received_); client_->didFinishLoading(handle); } void FeedClientProxy::didFail(ResourceHandle* handle, const ResourceError& error) { client_->didFail(handle, error); } } // namespace WebCore