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

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

Issue 260073009: [dom_distiller] Add support for incremental viewer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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 c3351c2cc5383870384c95f89af27b1d1cd3c977..0bcfef3c7fd55febdfabfec451971420b62a310d 100644
--- a/components/dom_distiller/content/dom_distiller_viewer_source.cc
+++ b/components/dom_distiller/content/dom_distiller_viewer_source.cc
@@ -26,6 +26,8 @@ class DomDistillerViewerSource::RequestViewerHandle
: public ViewRequestDelegate {
public:
explicit RequestViewerHandle(
+ int render_process_id,
+ int render_frame_id,
const content::URLDataSource::GotDataCallback& callback);
virtual ~RequestViewerHandle();
@@ -43,13 +45,25 @@ class DomDistillerViewerSource::RequestViewerHandle
// needs to be kept around to ensure the distillation request finishes.
scoped_ptr<ViewerHandle> viewer_handle_;
+ // Ids associated with the viewer's render process.
+ int render_process_id_;
+ int render_frame_id_;
+
// This holds the callback to where the data retrieved is sent back.
content::URLDataSource::GotDataCallback callback_;
+
+ // Number of pages that have been rendered by the viewer.
+ int page_count_;
};
DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle(
+ int render_process_id,
+ int render_frame_id,
const content::URLDataSource::GotDataCallback& callback)
- : callback_(callback) {
+ : render_process_id_(render_process_id),
+ render_frame_id_(render_frame_id),
+ callback_(callback),
+ page_count_(0) {
}
DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() {
@@ -57,14 +71,50 @@ DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() {
void DomDistillerViewerSource::RequestViewerHandle::OnArticleReady(
const DistilledArticleProto* article_proto) {
- std::string unsafe_page_html = viewer::GetUnsafeHtml(article_proto);
- callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
+ content::RenderFrameHost* render_frame_host =
+ content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
+ if (page_count_ == 0) {
+ std::string unsafe_page_html = viewer::GetUnsafeArticleHtml(article_proto);
nyquist 2014/04/29 23:58:37 Add a comment. Maybe something like: "This is a si
Yaron 2014/05/07 05:04:29 Done.
+ callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
+ } else if (page_count_ == article_proto->pages_size()) {
+ // We may still be showing the "Loading" indicator.
+ if (render_frame_host) {
+ render_frame_host->ExecuteJavaScript(
+ viewer::GetToggleLoadingIndicatorJs(true));
+ }
+ } else {
+ if (!render_frame_host) {
+ return;
+ }
+ for (;page_count_ < article_proto->pages_size();
nyquist 2014/04/29 23:58:37 Add a comment saying something like: "Got OnArticl
Yaron 2014/05/07 05:04:29 Done-ish.
+ page_count_++) {
+ const DistilledPageProto& page = article_proto->pages(page_count_);
+ render_frame_host->ExecuteJavaScript(
+ viewer::GetUnsafeIncrementalDistilledPageJs(
+ &page,
+ page_count_ == article_proto->pages_size()));
+ }
+ }
base::MessageLoop::current()->DeleteSoon(FROM_HERE, this);
}
void DomDistillerViewerSource::RequestViewerHandle::OnArticleUpdated(
ArticleDistillationUpdate article_update) {
- // TODO(nyquist): Add support for displaying pages incrementally.
+ content::RenderFrameHost* render_frame_host =
+ content::RenderFrameHost::FromID(render_process_id_, render_frame_id_);
+ for (;page_count_ < static_cast<int>(article_update.GetPagesSize());
+ page_count_++) {
+ const DistilledPageProto& page = article_update.GetDistilledPage(page_count_);
+ if (page_count_ == 0) {
+ std::string unsafe_page_html = viewer::GetUnsafePartialArticleHtml(&page);
+ callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
+ } else {
+ if (render_frame_host) {
+ render_frame_host->ExecuteJavaScript(
+ viewer::GetUnsafeIncrementalDistilledPageJs(&page, false));
+ }
+ }
+ }
}
void DomDistillerViewerSource::RequestViewerHandle::TakeViewerHandle(
@@ -102,10 +152,14 @@ void DomDistillerViewerSource::StartDataRequest(
std::string css = viewer::GetCss();
callback.Run(base::RefCountedString::TakeString(&css));
return;
+ } else if (kViewerJsPath == path) {
nyquist 2014/04/29 23:58:37 I think you also should add JS to the mime type ha
Yaron 2014/05/07 05:04:29 Done.
+ std::string js = viewer::GetJavaScript();
+ callback.Run(base::RefCountedString::TakeString(&js));
+ return;
}
RequestViewerHandle* request_viewer_handle =
- new RequestViewerHandle(callback);
+ new RequestViewerHandle(render_process_id, render_frame_id, callback);
scoped_ptr<ViewerHandle> viewer_handle = viewer::CreateViewRequest(
dom_distiller_service_, path, request_viewer_handle);

Powered by Google App Engine
This is Rietveld 408576698