Commit b9fee249 authored by mdjones's avatar mdjones Committed by Commit bot

Move common distiller code to superclass

This change moves any code related to JavaScript and HTML generation
in dom distiller to a superclass that all platforms can use.

BUG=472797

Review URL: https://codereview.chromium.org/1101993003

Cr-Commit-Position: refs/heads/master@{#327055}
parent b120440b
...@@ -82,6 +82,8 @@ ...@@ -82,6 +82,8 @@
'dom_distiller/core/dom_distiller_model.cc', 'dom_distiller/core/dom_distiller_model.cc',
'dom_distiller/core/dom_distiller_model.h', 'dom_distiller/core/dom_distiller_model.h',
'dom_distiller/core/dom_distiller_observer.h', 'dom_distiller/core/dom_distiller_observer.h',
'dom_distiller/core/dom_distiller_request_view_base.cc',
'dom_distiller/core/dom_distiller_request_view_base.h',
'dom_distiller/core/dom_distiller_service.cc', 'dom_distiller/core/dom_distiller_service.cc',
'dom_distiller/core/dom_distiller_service.h', 'dom_distiller/core/dom_distiller_service.h',
'dom_distiller/core/dom_distiller_service_android.cc', 'dom_distiller/core/dom_distiller_service_android.cc',
......
...@@ -32,6 +32,8 @@ source_set("core") { ...@@ -32,6 +32,8 @@ source_set("core") {
"dom_distiller_model.cc", "dom_distiller_model.cc",
"dom_distiller_model.h", "dom_distiller_model.h",
"dom_distiller_observer.h", "dom_distiller_observer.h",
"dom_distiller_request_view_base.cc",
"dom_distiller_request_view_base.h",
"dom_distiller_service.cc", "dom_distiller_service.cc",
"dom_distiller_service.h", "dom_distiller_service.h",
"dom_distiller_store.cc", "dom_distiller_store.cc",
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/dom_distiller/core/dom_distiller_request_view_base.h"
#include <sstream>
#include <string>
#include <vector>
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "components/dom_distiller/core/distilled_page_prefs.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/dom_distiller/core/task_tracker.h"
#include "components/dom_distiller/core/url_constants.h"
#include "components/dom_distiller/core/viewer.h"
#include "content/public/browser/navigation_details.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/url_data_source.h"
#include "net/base/url_util.h"
#include "net/url_request/url_request.h"
namespace dom_distiller {
DomDistillerRequestViewBase::DomDistillerRequestViewBase(
scoped_ptr<DistillerDataCallback> callback,
DistilledPagePrefs* distilled_page_prefs)
: callback_(callback.Pass()),
page_count_(0),
distilled_page_prefs_(distilled_page_prefs),
is_error_page_(false) {
}
DomDistillerRequestViewBase::~DomDistillerRequestViewBase() {
}
void DomDistillerRequestViewBase::FlagAsErrorPage() {
is_error_page_ = true;
std::string error_page_html =
viewer::GetErrorPageHtml(distilled_page_prefs_->GetTheme(),
distilled_page_prefs_->GetFontFamily());
callback_->RunCallback(error_page_html);
}
bool DomDistillerRequestViewBase::IsErrorPage() {
return is_error_page_;
}
void DomDistillerRequestViewBase::OnArticleReady(
const DistilledArticleProto* article_proto) {
if (page_count_ == 0) {
std::string unsafe_page_html = viewer::GetUnsafeArticleTemplateHtml(
&article_proto->pages(0), distilled_page_prefs_->GetTheme(),
distilled_page_prefs_->GetFontFamily());
callback_->RunCallback(unsafe_page_html);
// Send first page to client.
SendJavaScript(viewer::GetUnsafeArticleContentJs(article_proto));
// If any content was loaded, show the feedback form.
SendJavaScript(viewer::GetShowFeedbackFormJs());
} else if (page_count_ == article_proto->pages_size()) {
// We may still be showing the "Loading" indicator.
SendJavaScript(viewer::GetToggleLoadingIndicatorJs(true));
} else {
// It's possible that we didn't get some incremental updates from the
// distiller. Ensure all remaining pages are flushed to the viewer.
for (; page_count_ < article_proto->pages_size(); page_count_++) {
const DistilledPageProto& page = article_proto->pages(page_count_);
SendJavaScript(viewer::GetUnsafeIncrementalDistilledPageJs(
&page, page_count_ == article_proto->pages_size()));
}
}
// No need to hold on to the ViewerHandle now that distillation is complete.
viewer_handle_.reset();
}
void DomDistillerRequestViewBase::OnArticleUpdated(
ArticleDistillationUpdate article_update) {
for (; page_count_ < static_cast<int>(article_update.GetPagesSize());
page_count_++) {
const DistilledPageProto& page =
article_update.GetDistilledPage(page_count_);
// Send the page content to the client. This will execute after the page is
// ready.
SendJavaScript(viewer::GetUnsafeIncrementalDistilledPageJs(&page, false));
if (page_count_ == 0) {
// This is the first page, so send Viewer page scaffolding too.
std::string unsafe_page_html = viewer::GetUnsafeArticleTemplateHtml(
&page, distilled_page_prefs_->GetTheme(),
distilled_page_prefs_->GetFontFamily());
callback_->RunCallback(unsafe_page_html);
// If any content was loaded, show the feedback form.
SendJavaScript(viewer::GetShowFeedbackFormJs());
}
}
}
void DomDistillerRequestViewBase::OnChangeTheme(
DistilledPagePrefs::Theme new_theme) {
SendJavaScript(viewer::GetDistilledPageThemeJs(new_theme));
}
void DomDistillerRequestViewBase::OnChangeFontFamily(
DistilledPagePrefs::FontFamily new_font) {
SendJavaScript(viewer::GetDistilledPageFontFamilyJs(new_font));
}
void DomDistillerRequestViewBase::TakeViewerHandle(
scoped_ptr<ViewerHandle> viewer_handle) {
viewer_handle_ = viewer_handle.Pass();
}
} // namespace dom_distiller
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_REQUEST_VIEW_BASE_H_
#define COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_REQUEST_VIEW_BASE_H_
#include <sstream>
#include <string>
#include <vector>
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
#include "components/dom_distiller/core/distilled_page_prefs.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/dom_distiller/core/task_tracker.h"
#include "components/dom_distiller/core/viewer.h"
#include "content/public/browser/url_data_source.h"
#include "net/base/url_util.h"
namespace dom_distiller {
// This interface is used to abstract the data callback from the distiller. The
// callbacks for different platforms have different numbers of parameters
// (namely iOS and Android) which makes this necessary.
class DistillerDataCallback {
public:
virtual ~DistillerDataCallback(){};
virtual void RunCallback(std::string& data) = 0;
};
// Handles receiving data asynchronously for a specific entry, and passing
// it along to the data callback for the data source. Lifetime matches that of
// the current main frame's page in the Viewer instance.
class DomDistillerRequestViewBase
: public ViewRequestDelegate,
public DistilledPagePrefs::Observer {
public:
explicit DomDistillerRequestViewBase(
scoped_ptr<DistillerDataCallback> callback,
DistilledPagePrefs* distilled_page_prefs);
~DomDistillerRequestViewBase() override;
// Flag this request as an error and send the error page template.
void FlagAsErrorPage();
// Get if this viewer is in an error state.
bool IsErrorPage();
// ViewRequestDelegate implementation:
void OnArticleReady(const DistilledArticleProto* article_proto) override;
void OnArticleUpdated(ArticleDistillationUpdate article_update) override;
void TakeViewerHandle(scoped_ptr<ViewerHandle> viewer_handle);
protected:
// DistilledPagePrefs::Observer implementation:
void OnChangeFontFamily(
DistilledPagePrefs::FontFamily new_font_family) override;
void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override;
// Sends JavaScript to the attached Viewer, buffering data if the viewer isn't
// ready.
virtual void SendJavaScript(const std::string& buffer) = 0;
// 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_;
// Holds the callback to where the data retrieved is sent back.
scoped_ptr<DistillerDataCallback> callback_;
// Number of pages of the distilled article content that have been rendered by
// the viewer.
int page_count_;
// Interface for accessing preferences for distilled pages.
DistilledPagePrefs* distilled_page_prefs_;
// Flag to tell this observer that the web contents are in an error state.
bool is_error_page_;
};
} // namespace dom_distiller
#endif // COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_REQUEST_VIEW_BASE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment