| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/alternate_nav_url_fetcher.h" | 5 #include "chrome/browser/alternate_nav_url_fetcher.h" |
| 6 | 6 |
| 7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "chrome/browser/api/infobars/link_infobar_delegate.h" | 8 #include "chrome/browser/api/infobars/link_infobar_delegate.h" |
| 9 #include "chrome/browser/infobars/infobar_tab_helper.h" | 9 #include "chrome/browser/infobars/infobar_tab_helper.h" |
| 10 #include "chrome/browser/intranet_redirect_detector.h" | 10 #include "chrome/browser/intranet_redirect_detector.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 const net::URLFetcher* source) { | 177 const net::URLFetcher* source) { |
| 178 DCHECK_EQ(fetcher_.get(), source); | 178 DCHECK_EQ(fetcher_.get(), source); |
| 179 SetStatusFromURLFetch( | 179 SetStatusFromURLFetch( |
| 180 source->GetURL(), source->GetStatus(), source->GetResponseCode()); | 180 source->GetURL(), source->GetStatus(), source->GetResponseCode()); |
| 181 ShowInfobarIfPossible(); | 181 ShowInfobarIfPossible(); |
| 182 // WARNING: |this| may be deleted! | 182 // WARNING: |this| may be deleted! |
| 183 } | 183 } |
| 184 | 184 |
| 185 void AlternateNavURLFetcher::StartFetch(NavigationController* controller) { | 185 void AlternateNavURLFetcher::StartFetch(NavigationController* controller) { |
| 186 controller_ = controller; | 186 controller_ = controller; |
| 187 registrar_.Add( | 187 content::WebContents* web_contents = controller_->GetWebContents(); |
| 188 this, | 188 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| 189 content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 189 content::Source<content::WebContents>(web_contents)); |
| 190 content::Source<content::WebContents>(controller_->GetWebContents())); | |
| 191 | 190 |
| 192 DCHECK_EQ(NOT_STARTED, state_); | 191 DCHECK_EQ(NOT_STARTED, state_); |
| 193 state_ = IN_PROGRESS; | 192 state_ = IN_PROGRESS; |
| 194 fetcher_.reset(net::URLFetcher::Create( | 193 fetcher_.reset(net::URLFetcher::Create(GURL(alternate_nav_url_), |
| 195 GURL(alternate_nav_url_), net::URLFetcher::HEAD, this)); | 194 net::URLFetcher::HEAD, this)); |
| 196 fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); | 195 fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); |
| 197 fetcher_->SetRequestContext( | 196 fetcher_->SetRequestContext( |
| 198 controller_->GetBrowserContext()->GetRequestContext()); | 197 controller_->GetBrowserContext()->GetRequestContext()); |
| 199 fetcher_->SetStopOnRedirect(true); | 198 fetcher_->SetStopOnRedirect(true); |
| 200 fetcher_->Start(); | 199 fetcher_->Start(); |
| 201 } | 200 } |
| 202 | 201 |
| 203 void AlternateNavURLFetcher::SetStatusFromURLFetch( | 202 void AlternateNavURLFetcher::SetStatusFromURLFetch( |
| 204 const GURL& url, | 203 const GURL& url, |
| 205 const net::URLRequestStatus& status, | 204 const net::URLRequestStatus& status, |
| 206 int response_code) { | 205 int response_code) { |
| 207 if (status.is_success()) { | 206 if (status.is_success()) { |
| 208 // HTTP 2xx, 401, and 407 all indicate that the target address exists. | 207 // HTTP 2xx, 401, and 407 all indicate that the target address exists. |
| 209 state_ = (((response_code / 100) == 2) || (response_code == 401) || | 208 state_ = (((response_code / 100) == 2) || (response_code == 401) || |
| 210 (response_code == 407)) ? SUCCEEDED : FAILED; | 209 (response_code == 407)) ? SUCCEEDED : FAILED; |
| 211 } else { | 210 } else { |
| 212 // If we got HTTP 3xx, we'll have auto-canceled; treat this as evidence the | 211 // If we got HTTP 3xx, we'll have auto-canceled; treat this as evidence the |
| 213 // target address exists as long as we're not redirected to a common | 212 // target address exists as long as we're not redirected to a common |
| 214 // location every time, lest we annoy the user with infobars on everything | 213 // location every time, lest we annoy the user with infobars on everything |
| 215 // they type. See comments on IntranetRedirectDetector. | 214 // they type. See comments on IntranetRedirectDetector. |
| 216 state_ = ((status.status() == net::URLRequestStatus::CANCELED) && | 215 state_ = ((status.status() == net::URLRequestStatus::CANCELED) && |
| 217 ((response_code / 100) == 3) && | 216 ((response_code / 100) == 3) && |
| 218 !net::RegistryControlledDomainService::SameDomainOrHost(url, | 217 !net::RegistryControlledDomainService::SameDomainOrHost(url, |
| 219 IntranetRedirectDetector::RedirectOrigin())) ? SUCCEEDED : FAILED; | 218 IntranetRedirectDetector::RedirectOrigin())) ? SUCCEEDED : FAILED; |
| 220 } | 219 } |
| 221 } | 220 } |
| 222 | 221 |
| 223 void AlternateNavURLFetcher::ShowInfobarIfPossible() { | 222 void AlternateNavURLFetcher::ShowInfobarIfPossible() { |
| 224 if (!navigated_to_entry_ || state_ != SUCCEEDED) { | 223 if (navigated_to_entry_ && (state_ == SUCCEEDED)) { |
| 225 if (state_ == FAILED) | 224 InfoBarTabHelper* infobar_helper = |
| 226 delete this; | 225 TabContents::FromWebContents(controller_->GetWebContents())-> |
| 226 infobar_tab_helper(); |
| 227 infobar_helper->AddInfoBar( |
| 228 new AlternateNavInfoBarDelegate(infobar_helper, alternate_nav_url_)); |
| 229 } else if (state_ != FAILED) { |
| 227 return; | 230 return; |
| 228 } | 231 } |
| 229 | |
| 230 InfoBarTabHelper* infobar_helper = | |
| 231 TabContents::FromWebContents(controller_->GetWebContents())-> | |
| 232 infobar_tab_helper(); | |
| 233 infobar_helper->AddInfoBar( | |
| 234 new AlternateNavInfoBarDelegate(infobar_helper, alternate_nav_url_)); | |
| 235 delete this; | 232 delete this; |
| 236 } | 233 } |
| OLD | NEW |