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

Unified Diff: components/dom_distiller/content/dom_distiller_viewer_source.cc

Issue 134873008: Add support for displaying distilled articles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reverting change to scoped_ptr Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: components/dom_distiller/content/dom_distiller_viewer_source.cc
diff --git a/components/dom_distiller/content/dom_distiller_viewer_source.cc b/components/dom_distiller/content/dom_distiller_viewer_source.cc
index e614359ba8de2ce7895d2fa96b237ede8753dc70..c9fa6df11a46f2c5fb4a52da53193f0ffd88ae1f 100644
--- a/components/dom_distiller/content/dom_distiller_viewer_source.cc
+++ b/components/dom_distiller/content/dom_distiller_viewer_source.cc
@@ -5,18 +5,97 @@
#include "components/dom_distiller/content/dom_distiller_viewer_source.h"
#include <string>
+#include <vector>
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/strings/string_util.h"
+#include "components/dom_distiller/core/dom_distiller_service.h"
+#include "components/dom_distiller/core/proto/distilled_page.pb.h"
+#include "components/dom_distiller/core/task_tracker.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
+#include "grit/component_strings.h"
+#include "grit/dom_distiller_resources.h"
+#include "net/base/escape.h"
#include "net/url_request/url_request.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
#include "url/gurl.h"
+namespace {
+
+std::string ReplaceHtmlTemplateValues(std::string title, std::string content) {
+ base::StringPiece html_template =
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_DOM_DISTILLER_VIEWER_HTML);
+ std::vector<std::string> substitutions;
+ substitutions.push_back(title); // $1
+ substitutions.push_back(title); // $2
+ substitutions.push_back(content); // $3
+ return ReplaceStringPlaceholders(html_template, substitutions, NULL);
+}
+
+} // namespace
+
namespace dom_distiller {
-DomDistillerViewerSource::DomDistillerViewerSource(const std::string& scheme)
- : scheme_(scheme) {}
+// Handles receiving data asynchronously for a specific entry, and passing
+// it along to the data callback for the data source.
+class RequestViewerHandle : public ViewRequestDelegate {
+ public:
+ explicit RequestViewerHandle(
+ const content::URLDataSource::GotDataCallback& callback);
+ virtual ~RequestViewerHandle();
+
+ // ViewRequestDelegate implementation.
+ virtual void OnArticleReady(DistilledPageProto* proto) OVERRIDE;
+
+ void TakeViewerHandle(scoped_ptr<ViewerHandle> viewer_handle);
+
+ private:
+ // The handle to the view request towards the DomDistillerService. It
+ // needs to be kept around to ensure the distillation request finishes.
+ scoped_ptr<ViewerHandle> viewer_handle_;
+
+ // This holds the callback to where the data retrieved is sent back.
+ content::URLDataSource::GotDataCallback callback_;
+};
+
+RequestViewerHandle::RequestViewerHandle(
+ const content::URLDataSource::GotDataCallback& callback)
+ : callback_(callback) {}
+
+RequestViewerHandle::~RequestViewerHandle() {}
+
+void RequestViewerHandle::OnArticleReady(DistilledPageProto* proto) {
+ DCHECK(proto);
+ std::string title;
+ std::string unsafe_article_html;
+ if (proto->has_title() && proto->has_html()) {
+ title = net::EscapeForHTML(proto->title());
+ unsafe_article_html = proto->html();
+ } else {
+ title = l10n_util::GetStringUTF8(IDS_DOM_DISTILLER_VIEWER_NO_DATA_TITLE);
+ unsafe_article_html =
+ l10n_util::GetStringUTF8(IDS_DOM_DISTILLER_VIEWER_NO_DATA_CONTENT);
+ }
+ std::string unsafe_page_html =
+ ReplaceHtmlTemplateValues(title, unsafe_article_html);
+ callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
+ base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
+}
+
+void RequestViewerHandle::TakeViewerHandle(
+ scoped_ptr<ViewerHandle> viewer_handle) {
+ viewer_handle_ = viewer_handle.Pass();
+}
+
+DomDistillerViewerSource::DomDistillerViewerSource(
+ DomDistillerService* dom_distiller_service,
+ const std::string& scheme)
+ : scheme_(scheme), dom_distiller_service_(dom_distiller_service) {}
DomDistillerViewerSource::~DomDistillerViewerSource() {}
@@ -35,13 +114,34 @@ void DomDistillerViewerSource::StartDataRequest(
DCHECK(render_view_host);
CHECK_EQ(0, render_view_host->GetEnabledBindings());
- std::string page_template = "Aloha!";
- callback.Run(base::RefCountedString::TakeString(&page_template));
+ RequestViewerHandle* request_viewer_handle =
+ new RequestViewerHandle(callback);
+ std::string entry_id = StringToUpperASCII(path);
+ scoped_ptr<ViewerHandle> viewer_handle =
+ dom_distiller_service_->ViewEntry(request_viewer_handle, entry_id);
+ if (viewer_handle) {
+ // The service returned a |ViewerHandle| and guarantees it will call
+ // the |RequestViewerHandle|, so passing ownership to it, to ensure the
+ // request is not cancelled. The |RequestViewerHandle| will delete itself
+ // after receiving the callback.
+ request_viewer_handle->TakeViewerHandle(viewer_handle.Pass());
+ } else {
+ // The service did not return a |ViewerHandle|, which means the
+ // |RequestViewerHandle| will never be called, so clean up now.
+ delete request_viewer_handle;
+
+ std::string title = l10n_util::GetStringUTF8(
+ IDS_DOM_DISTILLER_VIEWER_FAILED_TO_FIND_ARTICLE_TITLE);
+ std::string content = l10n_util::GetStringUTF8(
+ IDS_DOM_DISTILLER_VIEWER_FAILED_TO_FIND_ARTICLE_CONTENT);
+ std::string html = ReplaceHtmlTemplateValues(title, content);
+ callback.Run(base::RefCountedString::TakeString(&html));
+ }
};
std::string DomDistillerViewerSource::GetMimeType(const std::string& path)
const {
- return "text/plain";
+ return "text/html";
}
bool DomDistillerViewerSource::ShouldServiceRequest(
@@ -49,4 +149,12 @@ bool DomDistillerViewerSource::ShouldServiceRequest(
return request->url().SchemeIs(scheme_.c_str());
}
+void DomDistillerViewerSource::WillServiceRequest(
+ const net::URLRequest* request,
+ std::string* path) const {
+ // Since the full request is not available to StartDataRequest, replace the
+ // path to contain the data needed.
+ *path = request->url().host();
+};
+
} // namespace dom_distiller

Powered by Google App Engine
This is Rietveld 408576698