blob: a1dc3824ef16106b0831da2806975056d862e29b [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/content/browser/distillability_driver.h"
#include <memory>
#include <utility>
#include "base/bind.h"
#include "build/build_config.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
namespace dom_distiller {
// Implementation of the Mojo DistillabilityService. This is called by the
// renderer to notify the browser that a page is distillable.
class DistillabilityServiceImpl : public mojom::DistillabilityService {
public:
explicit DistillabilityServiceImpl(
base::WeakPtr<DistillabilityDriver> distillability_driver)
: distillability_driver_(distillability_driver) {}
~DistillabilityServiceImpl() override = default;
void NotifyIsDistillable(bool is_distillable,
bool is_last_update,
bool is_mobile_friendly) override {
if (!distillability_driver_)
return;
DistillabilityResult result;
result.is_distillable = is_distillable;
result.is_last = is_last_update;
result.is_mobile_friendly = is_mobile_friendly;
DVLOG(1) << "Notifying observers of distillability service result: "
<< result;
distillability_driver_->OnDistillability(result);
}
private:
base::WeakPtr<DistillabilityDriver> distillability_driver_;
};
DistillabilityDriver::DistillabilityDriver(content::WebContents* web_contents)
: latest_result_(base::nullopt), web_contents_(web_contents) {
if (!web_contents)
return;
}
DistillabilityDriver::~DistillabilityDriver() = default;
void DistillabilityDriver::CreateDistillabilityService(
mojo::PendingReceiver<mojom::DistillabilityService> receiver) {
mojo::MakeSelfOwnedReceiver(
std::make_unique<DistillabilityServiceImpl>(weak_factory_.GetWeakPtr()),
std::move(receiver));
}
void DistillabilityDriver::SetIsSecureCallback(
base::RepeatingCallback<bool(content::WebContents*)> is_secure_check) {
is_secure_check_ = std::move(is_secure_check);
}
void DistillabilityDriver::OnDistillability(
const DistillabilityResult& result) {
#if !defined(OS_ANDROID)
if (result.is_distillable) {
if (!is_secure_check_ || !is_secure_check_.Run(web_contents_)) {
DistillabilityResult not_distillable;
not_distillable.is_distillable = false;
not_distillable.is_last = result.is_last;
not_distillable.is_mobile_friendly = result.is_mobile_friendly;
latest_result_ = not_distillable;
for (auto& observer : observers_)
observer.OnResult(not_distillable);
return;
}
}
#endif // !defined(OS_ANDROID)
latest_result_ = result;
for (auto& observer : observers_)
observer.OnResult(result);
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(DistillabilityDriver)
} // namespace dom_distiller