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