blob: 6eb924db51632d897fb60fbec04cb81451440240 [file] [log] [blame]
// Copyright 2019 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 "weblayer/renderer/error_page_helper.h"
#include "base/command_line.h"
#include "components/security_interstitials/content/renderer/security_interstitial_page_controller.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "weblayer/common/features.h"
namespace weblayer {
// static
void ErrorPageHelper::Create(content::RenderFrame* render_frame) {
if (render_frame->IsMainFrame())
new ErrorPageHelper(render_frame);
}
// static
ErrorPageHelper* ErrorPageHelper::GetForFrame(
content::RenderFrame* render_frame) {
return render_frame->IsMainFrame() ? Get(render_frame) : nullptr;
}
void ErrorPageHelper::PrepareErrorPage() {
if (is_disabled_for_next_error_) {
is_disabled_for_next_error_ = false;
return;
}
is_preparing_for_error_page_ = true;
}
void ErrorPageHelper::DidCommitProvisionalLoad(ui::PageTransition transition) {
show_error_page_in_finish_load_ = is_preparing_for_error_page_;
is_preparing_for_error_page_ = false;
}
void ErrorPageHelper::DidFinishLoad() {
if (!show_error_page_in_finish_load_)
return;
security_interstitials::SecurityInterstitialPageController::Install(
render_frame());
}
void ErrorPageHelper::OnDestruct() {
delete this;
}
void ErrorPageHelper::DisableErrorPageHelperForNextError() {
is_disabled_for_next_error_ = true;
}
ErrorPageHelper::ErrorPageHelper(content::RenderFrame* render_frame)
: RenderFrameObserver(render_frame),
RenderFrameObserverTracker<ErrorPageHelper>(render_frame) {
render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
base::BindRepeating(&ErrorPageHelper::BindErrorPageHelper,
weak_factory_.GetWeakPtr()));
}
ErrorPageHelper::~ErrorPageHelper() = default;
void ErrorPageHelper::BindErrorPageHelper(
mojo::PendingAssociatedReceiver<mojom::ErrorPageHelper> receiver) {
// There is only a need for a single receiver to be bound at a time.
error_page_helper_receiver_.reset();
error_page_helper_receiver_.Bind(std::move(receiver));
}
} // namespace weblayer