1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
#define CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
#include <memory>
#include <string>
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/common/net/net_error_page_support.mojom.h"
#include "chrome/common/network_diagnostics.mojom.h"
#include "chrome/common/network_easter_egg.mojom.h"
#include "chrome/renderer/net/net_error_helper_core.h"
#include "chrome/renderer/net/net_error_page_controller.h"
#include "components/error_page/common/localized_error.h"
#include "components/error_page/common/net_error_info.h"
#include "components/security_interstitials/content/renderer/security_interstitial_page_controller.h"
#include "components/security_interstitials/core/controller_client.h"
#include "content/public/common/alternative_error_page_override_info.mojom-forward.h"
#include "content/public/renderer/render_frame_observer.h"
#include "content/public/renderer/render_frame_observer_tracker.h"
#include "mojo/public/cpp/bindings/associated_receiver_set.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
class GURL;
namespace error_page {
class Error;
}
// Listens for NetErrorInfo messages from the NetErrorTabHelper on the
// browser side and updates the error page with more details (currently, just
// DNS probe results) if/when available.
// TODO(crbug.com/41235130): Should this class be moved into the error_page
// component?
class NetErrorHelper
: public content::RenderFrameObserver,
public content::RenderFrameObserverTracker<NetErrorHelper>,
public NetErrorHelperCore::Delegate,
public NetErrorPageController::Delegate,
public chrome::mojom::NetworkDiagnosticsClient {
public:
explicit NetErrorHelper(content::RenderFrame* render_frame);
NetErrorHelper(const NetErrorHelper&) = delete;
NetErrorHelper& operator=(const NetErrorHelper&) = delete;
~NetErrorHelper() override;
// NetErrorPageController::Delegate implementation
void ButtonPressed(NetErrorHelperCore::Button button) override;
void SavePageForLater() override;
void CancelSavePage() override;
void UpdateEasterEggHighScore(int high_score) override;
void ResetEasterEggHighScore() override;
// RenderFrameObserver implementation.
void DidCommitProvisionalLoad(ui::PageTransition transition) override;
void DidFinishLoad() override;
void OnDestruct() override;
// Sets values in |pending_error_page_info_|. If |error_html| is not null, it
// initializes |error_html| with the HTML of an error page in response to
// |error|. Updates internals state with the assumption the page will be
// loaded immediately.
void PrepareErrorPage(const error_page::Error& error,
bool is_failed_post,
content::mojom::AlternativeErrorPageOverrideInfoPtr
alternative_error_page_info,
std::string* error_html);
private:
chrome::mojom::NetworkDiagnostics* GetRemoteNetworkDiagnostics();
chrome::mojom::NetworkEasterEgg* GetRemoteNetworkEasterEgg();
chrome::mojom::NetErrorPageSupport* GetRemoteNetErrorPageSupport();
// NetErrorHelperCore::Delegate implementation:
error_page::LocalizedError::PageState GenerateLocalizedErrorPage(
const error_page::Error& error,
bool is_failed_post,
bool can_use_local_diagnostics_service,
content::mojom::AlternativeErrorPageOverrideInfoPtr
alternative_error_page_info,
std::string* html) override;
void EnablePageHelperFunctions() override;
error_page::LocalizedError::PageState UpdateErrorPage(
const error_page::Error& error,
bool is_failed_post,
bool can_use_local_diagnostics_service) override;
void InitializeErrorPageEasterEggHighScore(int high_score) override;
void RequestEasterEggHighScore() override;
void ReloadFrame() override;
void DiagnoseError(const GURL& page_url) override;
void PortalSignin() override;
void DownloadPageLater() override;
void SetIsShowingDownloadButton(bool show) override;
content::RenderFrame* GetRenderFrame() override;
#if BUILDFLAG(IS_ANDROID)
void SetAutoFetchState(
chrome::mojom::OfflinePageAutoFetcherScheduleResult state) override;
#endif
void OnNetworkDiagnosticsClientRequest(
mojo::PendingAssociatedReceiver<chrome::mojom::NetworkDiagnosticsClient>
receiver);
// chrome::mojom::NetworkDiagnosticsClient:
void SetCanShowNetworkDiagnosticsDialog(bool can_show) override;
void DNSProbeStatus(int32_t) override;
std::unique_ptr<NetErrorHelperCore> core_;
mojo::AssociatedReceiverSet<chrome::mojom::NetworkDiagnosticsClient>
network_diagnostics_client_receivers_;
mojo::AssociatedRemote<chrome::mojom::NetworkDiagnostics>
remote_network_diagnostics_;
mojo::AssociatedRemote<chrome::mojom::NetworkEasterEgg>
remote_network_easter_egg_;
mojo::AssociatedRemote<chrome::mojom::NetErrorPageSupport>
remote_net_error_page_support_;
base::Value::Dict error_page_params_;
// Weak factories for vending weak pointers to PageControllers. Weak
// pointers are invalidated on each commit, to prevent getting messages from
// Controllers used for the previous commit that haven't yet been cleaned up.
base::WeakPtrFactory<NetErrorPageController::Delegate>
weak_controller_delegate_factory_{this};
};
#endif // CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
|