| 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 a3ae496db86455a07c886dfe45e3b366ece85493..57a72e4590314d95be34eb4b215493d6a70eaf8d 100644
|
| --- a/components/dom_distiller/content/dom_distiller_viewer_source.cc
|
| +++ b/components/dom_distiller/content/dom_distiller_viewer_source.cc
|
| @@ -46,6 +46,9 @@ class DomDistillerViewerSource::RequestViewerHandle
|
| DistilledPagePrefs* distilled_page_prefs);
|
| ~RequestViewerHandle() override;
|
|
|
| + // Flag this request as an error and send the error page template.
|
| + void flagAsErrorPage();
|
| +
|
| // ViewRequestDelegate implementation:
|
| void OnArticleReady(const DistilledArticleProto* article_proto) override;
|
|
|
| @@ -104,6 +107,9 @@ class DomDistillerViewerSource::RequestViewerHandle
|
| // Temporary store of pending JavaScript if the page isn't ready to receive
|
| // data from distillation.
|
| std::string buffer_;
|
| +
|
| + // Flag to tell this observer that the web contents are in an error state.
|
| + bool is_error_page_;
|
| };
|
|
|
| DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle(
|
| @@ -117,7 +123,8 @@ DomDistillerViewerSource::RequestViewerHandle::RequestViewerHandle(
|
| callback_(callback),
|
| page_count_(0),
|
| distilled_page_prefs_(distilled_page_prefs),
|
| - waiting_for_page_ready_(true) {
|
| + waiting_for_page_ready_(true),
|
| + is_error_page_(false) {
|
| content::WebContentsObserver::Observe(web_contents);
|
| distilled_page_prefs_->AddObserver(this);
|
| }
|
| @@ -126,6 +133,14 @@ DomDistillerViewerSource::RequestViewerHandle::~RequestViewerHandle() {
|
| distilled_page_prefs_->RemoveObserver(this);
|
| }
|
|
|
| +void DomDistillerViewerSource::RequestViewerHandle::flagAsErrorPage() {
|
| + is_error_page_ = true;
|
| + std::string error_page_html = viewer::GetErrorPageHtml(
|
| + distilled_page_prefs_->GetTheme(),
|
| + distilled_page_prefs_->GetFontFamily());
|
| + callback_.Run(base::RefCountedString::TakeString(&error_page_html));
|
| +}
|
| +
|
| void DomDistillerViewerSource::RequestViewerHandle::SendJavaScript(
|
| const std::string& buffer) {
|
| if (waiting_for_page_ready_) {
|
| @@ -150,7 +165,6 @@ void DomDistillerViewerSource::RequestViewerHandle::DidNavigateMainFrame(
|
| }
|
|
|
| Cancel();
|
| -
|
| }
|
|
|
| void DomDistillerViewerSource::RequestViewerHandle::RenderProcessGone(
|
| @@ -174,6 +188,13 @@ void DomDistillerViewerSource::RequestViewerHandle::Cancel() {
|
| void DomDistillerViewerSource::RequestViewerHandle::DidFinishLoad(
|
| content::RenderFrameHost* render_frame_host,
|
| const GURL& validated_url) {
|
| + if (is_error_page_) {
|
| + waiting_for_page_ready_ = false;
|
| + SendJavaScript(viewer::GetErrorPageJs());
|
| + Cancel(); // This will cause the object to clean itself up.
|
| + return;
|
| + }
|
| +
|
| if (render_frame_host->GetParent()) {
|
| return;
|
| }
|
| @@ -187,14 +208,16 @@ void DomDistillerViewerSource::RequestViewerHandle::DidFinishLoad(
|
|
|
| void DomDistillerViewerSource::RequestViewerHandle::OnArticleReady(
|
| const DistilledArticleProto* article_proto) {
|
| + // TODO(mdjones): Move this logic to super class so it can be used in both
|
| + // android and IOS. http://crbug.com/472797
|
| if (page_count_ == 0) {
|
| - // This is a single-page article.
|
| - std::string unsafe_page_html =
|
| - viewer::GetUnsafeArticleHtml(
|
| - article_proto,
|
| - distilled_page_prefs_->GetTheme(),
|
| - distilled_page_prefs_->GetFontFamily());
|
| + std::string unsafe_page_html = viewer::GetUnsafeArticleTemplateHtml(
|
| + &article_proto->pages(0),
|
| + distilled_page_prefs_->GetTheme(),
|
| + distilled_page_prefs_->GetFontFamily());
|
| callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
|
| + // Send first page to client.
|
| + SendJavaScript(viewer::GetUnsafeArticleContentJs(article_proto));
|
| } else if (page_count_ == article_proto->pages_size()) {
|
| // We may still be showing the "Loading" indicator.
|
| SendJavaScript(viewer::GetToggleLoadingIndicatorJs(true));
|
| @@ -221,15 +244,14 @@ void DomDistillerViewerSource::RequestViewerHandle::OnArticleUpdated(
|
| article_update.GetDistilledPage(page_count_);
|
| if (page_count_ == 0) {
|
| // This is the first page, so send Viewer page scaffolding too.
|
| - std::string unsafe_page_html = viewer::GetUnsafePartialArticleHtml(
|
| + std::string unsafe_page_html = viewer::GetUnsafeArticleTemplateHtml(
|
| &page,
|
| distilled_page_prefs_->GetTheme(),
|
| distilled_page_prefs_->GetFontFamily());
|
| callback_.Run(base::RefCountedString::TakeString(&unsafe_page_html));
|
| - } else {
|
| - SendJavaScript(
|
| - viewer::GetUnsafeIncrementalDistilledPageJs(&page, false));
|
| }
|
| + // Send the page content to the client.
|
| + SendJavaScript(viewer::GetUnsafeIncrementalDistilledPageJs(&page, false));
|
| }
|
| }
|
|
|
| @@ -310,14 +332,7 @@ void DomDistillerViewerSource::StartDataRequest(
|
| // 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 error_page_html = viewer::GetErrorPageHtml(
|
| - dom_distiller_service_->GetDistilledPagePrefs()->GetTheme(),
|
| - dom_distiller_service_->GetDistilledPagePrefs()->GetFontFamily());
|
| - callback.Run(base::RefCountedString::TakeString(&error_page_html));
|
| + request_viewer_handle->flagAsErrorPage();
|
| }
|
| };
|
|
|
|
|