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); |