| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/search/new_tab_page_navigation_throttle.h" |
| |
| #include "base/metrics/histogram_macros.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/search/search.h" |
| #include "chrome/common/url_constants.h" |
| #include "content/public/browser/navigation_handle.h" |
| #include "content/public/browser/web_contents.h" |
| #include "net/http/http_status_code.h" |
| #include "url/gurl.h" |
| |
| NewTabPageNavigationThrottle::NewTabPageNavigationThrottle( |
| content::NavigationHandle* navigation_handle) |
| : content::NavigationThrottle(navigation_handle) {} |
| |
| NewTabPageNavigationThrottle::~NewTabPageNavigationThrottle() = default; |
| |
| const char* NewTabPageNavigationThrottle::GetNameForLogging() { |
| return "NewTabPageNavigationThrottle"; |
| } |
| |
| // static |
| std::unique_ptr<content::NavigationThrottle> |
| NewTabPageNavigationThrottle::MaybeCreateThrottleFor( |
| content::NavigationHandle* handle) { |
| content::WebContents* web_contents = handle->GetWebContents(); |
| Profile* profile = |
| Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
| if (web_contents->GetVisibleURL() != chrome::kChromeUINewTabURL || |
| !search::IsInstantNTPURL(handle->GetURL(), profile) || |
| handle->GetURL() == chrome::kChromeSearchLocalNtpUrl) { |
| return nullptr; |
| } |
| |
| return std::make_unique<NewTabPageNavigationThrottle>(handle); |
| } |
| |
| content::NavigationThrottle::ThrottleCheckResult |
| NewTabPageNavigationThrottle::WillProcessResponse() { |
| const net::HttpResponseHeaders* headers = |
| navigation_handle()->GetResponseHeaders(); |
| if (!headers) |
| return content::NavigationThrottle::PROCEED; |
| |
| int response_code = headers->response_code(); |
| if (response_code < 400 && response_code != net::HTTP_NO_CONTENT) |
| return content::NavigationThrottle::PROCEED; |
| |
| return OpenLocalNewTabPage(); |
| } |
| |
| content::NavigationThrottle::ThrottleCheckResult |
| NewTabPageNavigationThrottle::WillFailRequest() { |
| return OpenLocalNewTabPage(); |
| } |
| |
| content::NavigationThrottle::ThrottleCheckResult |
| NewTabPageNavigationThrottle::OpenLocalNewTabPage() { |
| UMA_HISTOGRAM_ENUMERATION("InstantExtended.CacheableNTPLoad", |
| search::CACHEABLE_NTP_LOAD_FAILED, |
| search::CACHEABLE_NTP_LOAD_MAX); |
| navigation_handle()->GetWebContents()->OpenURL( |
| content::OpenURLParams(GURL(chrome::kChromeSearchLocalNtpUrl), |
| navigation_handle()->GetReferrer(), |
| navigation_handle()->GetFrameTreeNodeId(), |
| WindowOpenDisposition::CURRENT_TAB, |
| navigation_handle()->GetPageTransition(), |
| false /* is_renderer_initiated */)); |
| return content::NavigationThrottle::CANCEL_AND_IGNORE; |
| } |