Chromium Code Reviews| 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); |