12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string>
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/macros.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/common/localized_error.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/net/net_error_info.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/renderer/net/net_error_helper_core.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/renderer/render_frame_observer_tracker.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/renderer/render_process_observer.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GURL;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace blink {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebFrame;
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebURLResponse;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct WebURLError;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace content {
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ResourceFetcher;
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Listens for NetErrorInfo messages from the NetErrorTabHelper on the
327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// browser side and updates the error page with more details (currently, just
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// DNS probe results) if/when available.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NetErrorHelper
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public content::RenderFrameObserver,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public content::RenderFrameObserverTracker<NetErrorHelper>,
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      public content::RenderProcessObserver,
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public NetErrorHelperCore::Delegate {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit NetErrorHelper(content::RenderFrame* render_view);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~NetErrorHelper();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Button press notification from error page.
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void ReloadButtonPressed();
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void LoadStaleButtonPressed();
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void MoreButtonPressed();
470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // RenderFrameObserver implementation.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidStartProvisionalLoad() OVERRIDE;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidCommitProvisionalLoad(bool is_new_navigation) OVERRIDE;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void DidFinishLoad() OVERRIDE;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnStop() OVERRIDE;
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void WasShown() OVERRIDE;
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void WasHidden() OVERRIDE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // IPC::Listener implementation.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // RenderProcessObserver implementation.
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void NetworkStateChanged(bool online) OVERRIDE;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Examines |frame| and |error| to see if this is an error worthy of a DNS
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // probe.  If it is, initializes |error_strings| based on |error|,
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |is_failed_post|, and |locale| with suitable strings and returns true.
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If not, returns false, in which case the caller should look up error
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // strings directly using LocalizedError::GetNavigationErrorStrings.
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Updates the NetErrorHelper with the assumption the page will be loaded
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // immediately.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void GetErrorHTML(blink::WebFrame* frame,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const blink::WebURLError& error,
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    bool is_failed_post,
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    std::string* error_html);
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Returns whether a load for |url| in |frame| should have its error page
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // suppressed.
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool ShouldSuppressErrorPage(blink::WebFrame* frame, const GURL& url);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Called when a link with the given tracking ID is pressed.
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void TrackClick(int tracking_id);
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NetErrorHelperCore::Delegate implementation:
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void GenerateLocalizedErrorPage(
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const blink::WebURLError& error,
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      bool is_failed_post,
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      scoped_ptr<LocalizedError::ErrorPageParams> params,
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool* reload_button_shown,
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      bool* load_stale_button_shown,
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      std::string* html) const OVERRIDE;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void LoadErrorPageInMainFrame(const std::string& html,
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const GURL& failed_url) OVERRIDE;
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void EnablePageHelperFunctions() OVERRIDE;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void UpdateErrorPage(const blink::WebURLError& error,
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               bool is_failed_post) OVERRIDE;
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void FetchNavigationCorrections(
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const GURL& navigation_correction_url,
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      const std::string& navigation_correction_request_body) OVERRIDE;
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void CancelFetchNavigationCorrections() OVERRIDE;
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void SendTrackingRequest(
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const GURL& tracking_url,
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const std::string& tracking_request_body) OVERRIDE;
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void ReloadPage() OVERRIDE;
1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void LoadPageFromCache(const GURL& page_url) OVERRIDE;
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnNetErrorInfo(int status);
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnSetNavigationCorrectionInfo(const GURL& navigation_correction_url,
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     const std::string& language,
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     const std::string& country_code,
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     const std::string& api_key,
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                     const GURL& search_url);
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void OnNavigationCorrectionsFetched(const blink::WebURLResponse& response,
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                      const std::string& data);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void OnTrackingRequestComplete(const blink::WebURLResponse& response,
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                 const std::string& data);
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_ptr<content::ResourceFetcher> correction_fetcher_;
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<content::ResourceFetcher> tracking_fetcher_;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<NetErrorHelperCore> core_;
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(NetErrorHelper);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_RENDERER_NET_NET_ERROR_HELPER_H_
128