blob: bc717770c6a666fa63cb3598675b9b5a61918259 [file] [log] [blame]
// 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 <memory>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include "components/dom_distiller/core/distilled_page_prefs.h"
#include "components/dom_distiller/core/dom_distiller_service.h"
#include "components/dom_distiller/core/experiments.h"
#include "components/dom_distiller/core/task_tracker.h"
#include "components/dom_distiller/core/viewer.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
namespace dom_distiller {
DomDistillerRequestViewBase::DomDistillerRequestViewBase(
DistilledPagePrefs* distilled_page_prefs)
: page_count_(0),
distilled_page_prefs_(distilled_page_prefs),
is_error_page_(false) {
}
DomDistillerRequestViewBase::~DomDistillerRequestViewBase() {
}
void DomDistillerRequestViewBase::FlagAsErrorPage() {
// Viewer handle is not passed to this in the case of error pages
// so send all JavaScript now.
SendCommonJavaScript();
SendJavaScript(viewer::GetErrorPageJs());
is_error_page_ = true;
}
bool DomDistillerRequestViewBase::IsErrorPage() {
return is_error_page_;
}
void DomDistillerRequestViewBase::OnArticleReady(
const DistilledArticleProto* article_proto) {
if (page_count_ == 0) {
std::string text_direction;
if (article_proto->pages().size() > 0) {
text_direction = article_proto->pages(0).text_direction();
} else {
text_direction = "auto";
}
// Send first page, title, and text direction to client.
SendJavaScript(viewer::GetSetTitleJs(article_proto->title()));
SendJavaScript(viewer::GetSetTextDirectionJs(text_direction));
SendJavaScript(viewer::GetUnsafeArticleContentJs(article_proto));
} 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()));
}
}
// We may still be showing the "Loading" indicator.
SendJavaScript(viewer::GetToggleLoadingIndicatorJs(true));
// 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, !article_update.HasNextPage()));
if (page_count_ == 0) {
// This is the first page, so send the title and text direction to the
// client.
SendJavaScript(viewer::GetSetTitleJs(page.title()));
SendJavaScript(viewer::GetSetTextDirectionJs(page.text_direction()));
}
}
}
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::OnChangeFontScaling(float scaling) {
SendJavaScript(viewer::GetDistilledPageFontScalingJs(scaling));
}
void DomDistillerRequestViewBase::TakeViewerHandle(
std::unique_ptr<ViewerHandle> viewer_handle) {
viewer_handle_ = std::move(viewer_handle);
// Getting the viewer handle means this is not an error page, send
// the viewer JavaScript and show the loading indicator.
SendCommonJavaScript();
}
void DomDistillerRequestViewBase::SendCommonJavaScript() {
SendJavaScript(viewer::GetJavaScript());
SendJavaScript(viewer::GetDistilledPageFontScalingJs(
distilled_page_prefs_->GetFontScaling()));
}
} // namespace dom_distiller