| Index: chrome/browser/renderer_host/intercept_navigation_resource_throttle.cc | 
| diff --git a/chrome/browser/renderer_host/intercept_navigation_resource_throttle.cc b/chrome/browser/renderer_host/intercept_navigation_resource_throttle.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..8e7a45ddefb96c483895436089da3b793d13b4d8 | 
| --- /dev/null | 
| +++ b/chrome/browser/renderer_host/intercept_navigation_resource_throttle.cc | 
| @@ -0,0 +1,109 @@ | 
| +// Copyright (c) 2012 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/renderer_host/intercept_navigation_resource_throttle.h" | 
| + | 
| +#include "base/callback.h" | 
| +#include "content/public/browser/browser_thread.h" | 
| +#include "content/public/browser/render_view_host.h" | 
| +#include "content/public/browser/resource_request_info.h" | 
| +#include "content/public/browser/resource_throttle_controller.h" | 
| +#include "content/public/browser/web_contents.h" | 
| +#include "content/public/common/referrer.h" | 
| +#include "net/url_request/url_request.h" | 
| + | 
| +using content::BrowserThread; | 
| +using content::Referrer; | 
| +using content::RenderViewHost; | 
| +using content::ResourceRequestInfo; | 
| +using content::WebContents; | 
| + | 
| +namespace { | 
| + | 
| +void CheckShouldIgnoreNavigationOnUIThread( | 
| +    int render_process_id, | 
| +    int render_view_id, | 
| +    const GURL& url, | 
| +    const Referrer& referrer, | 
| +    bool is_content_initiated, | 
| +    base::Callback<void(bool)> callback) { | 
| + | 
| +  RenderViewHost* rvh = | 
| +      RenderViewHost::FromID(render_process_id, render_view_id); | 
| +  WebContents* web_contents = | 
| +      rvh ? WebContents::FromRenderViewHost(rvh) : NULL; | 
| +  bool should_ignore_navigation = false; | 
| +  if (web_contents) { | 
| +    should_ignore_navigation = web_contents->ShouldIgnoreNavigation( | 
| +            url, referrer, is_content_initiated); | 
| +  } | 
| + | 
| +  BrowserThread::PostTask( | 
| +      BrowserThread::IO, | 
| +      FROM_HERE, | 
| +      base::Bind(callback, should_ignore_navigation)); | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| +InterceptNavigationResourceThrottle::InterceptNavigationResourceThrottle( | 
| +    net::URLRequest* request) | 
| +    : request_(request), | 
| +      weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 
| +} | 
| + | 
| +InterceptNavigationResourceThrottle:: | 
| +    ~InterceptNavigationResourceThrottle() { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| +} | 
| + | 
| +void InterceptNavigationResourceThrottle::WillStartRequest(bool* defer) { | 
| +  *defer = ShouldDeferRequestForURL(request_->url()); | 
| +} | 
| + | 
| +void InterceptNavigationResourceThrottle::WillRedirectRequest( | 
| +    const GURL& new_url, | 
| +    bool* defer) { | 
| +  *defer = ShouldDeferRequestForURL(new_url); | 
| +} | 
| + | 
| +bool InterceptNavigationResourceThrottle::ShouldDeferRequestForURL( | 
| +    const GURL& url) { | 
| +  const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request_); | 
| +  if (!info) | 
| +    return false; | 
| + | 
| +  int render_process_id, render_view_id; | 
| +  if (!info->GetAssociatedRenderView(&render_process_id, &render_view_id)) { | 
| +    return false; | 
| +  } | 
| + | 
| +  // This class should only be instantiated for top level frame requests. | 
| +  DCHECK(info->IsMainFrame()); | 
| + | 
| +  BrowserThread::PostTask( | 
| +      BrowserThread::UI, | 
| +      FROM_HERE, | 
| +      base::Bind( | 
| +          &CheckShouldIgnoreNavigationOnUIThread, | 
| +          render_process_id, | 
| +          render_view_id, | 
| +          url, | 
| +          Referrer(GURL(request_->referrer()), info->GetReferrerPolicy()), | 
| +          info->HasUserGesture(), | 
| +          base::Bind(&InterceptNavigationResourceThrottle::OnResultObtained, | 
| +                     weak_ptr_factory_.GetWeakPtr()))); | 
| +  return true; | 
| +} | 
| + | 
| +void InterceptNavigationResourceThrottle::OnResultObtained( | 
| +    bool should_ignore_navigation) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
| + | 
| +  if (should_ignore_navigation) { | 
| +    controller()->CancelWithHandledExternallyStatus(); | 
| +  } else { | 
| +    controller()->Resume(); | 
| +  } | 
| +} | 
|  |