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