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