Index: chrome/browser/prerender/prerender_resource_throttle.cc |
diff --git a/chrome/browser/prerender/prerender_resource_throttle.cc b/chrome/browser/prerender/prerender_resource_throttle.cc |
index 8efbcfe11533015a1f2fffdc107b91f18ad0531c..41600207b17e20aecfae2c8b0ba5f9fffd4cf391 100644 |
--- a/chrome/browser/prerender/prerender_resource_throttle.cc |
+++ b/chrome/browser/prerender/prerender_resource_throttle.cc |
@@ -12,14 +12,13 @@ |
#include "chrome/browser/prerender/prerender_manager.h" |
#include "chrome/browser/prerender/prerender_util.h" |
#include "content/public/browser/browser_thread.h" |
-#include "content/public/browser/render_frame_host.h" |
-#include "content/public/browser/resource_request_info.h" |
#include "content/public/browser/web_contents.h" |
#include "net/http/http_response_headers.h" |
#include "net/url_request/redirect_info.h" |
#include "net/url_request/url_request.h" |
using content::BrowserThread; |
+using content::ResourceRequestInfo; |
using content::ResourceType; |
namespace prerender { |
@@ -49,7 +48,8 @@ class PrerenderThrottleInfo |
: public base::RefCountedThreadSafe<PrerenderThrottleInfo, |
BrowserThread::DeleteOnUIThread> { |
public: |
- PrerenderThrottleInfo() : manager_(nullptr) {} |
+ PrerenderThrottleInfo() |
+ : mode_(NO_PRERENDER), origin_(ORIGIN_NONE), manager_(nullptr) {} |
void Set(PrerenderMode mode, Origin origin, PrerenderManager* manager) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
@@ -94,8 +94,8 @@ void PrerenderResourceThrottle::WillStartRequest(bool* defer) { |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
base::Bind(&PrerenderResourceThrottle::WillStartRequestOnUI, AsWeakPtr(), |
- request_->method(), info->GetResourceType(), |
- info->GetChildID(), info->GetRenderFrameID(), request_->url(), |
+ request_->method(), info->GetResourceType(), request_->url(), |
+ info->GetWebContentsGetterForRequest(), |
prerender_throttle_info_)); |
} |
@@ -112,8 +112,8 @@ void PrerenderResourceThrottle::WillRedirectRequest( |
BrowserThread::UI, FROM_HERE, |
base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, |
AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), |
- IsNoStoreResponse(*request_), info->GetChildID(), |
- info->GetRenderFrameID(), redirect_info.new_url)); |
+ IsNoStoreResponse(*request_), redirect_info.new_url, |
+ info->GetWebContentsGetterForRequest())); |
} |
void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { |
@@ -131,7 +131,6 @@ void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { |
base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, |
content::IsResourceTypeFrame(info->GetResourceType()), |
IsNoStoreResponse(*request_), redirect_count, |
- info->GetChildID(), info->GetRenderFrameID(), |
prerender_throttle_info_)); |
} |
@@ -148,13 +147,12 @@ void PrerenderResourceThrottle::WillStartRequestOnUI( |
const base::WeakPtr<PrerenderResourceThrottle>& throttle, |
const std::string& method, |
ResourceType resource_type, |
- int render_process_id, |
- int render_frame_id, |
const GURL& url, |
+ const ResourceRequestInfo::WebContentsGetter& web_contents_getter, |
scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { |
bool cancel = false; |
PrerenderContents* prerender_contents = |
- PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); |
+ PrerenderContentsFromGetter(web_contents_getter); |
if (prerender_contents) { |
DCHECK(prerender_throttle_info); |
prerender_throttle_info->Set(prerender_contents->prerender_mode(), |
@@ -172,7 +170,13 @@ void PrerenderResourceThrottle::WillStartRequestOnUI( |
prerender_contents->Destroy(FINAL_STATUS_INVALID_HTTP_METHOD); |
} |
cancel = true; |
- } else if (!PrerenderManager::DoesSubresourceURLHaveValidScheme(url)) { |
+ } else if (!PrerenderManager::DoesSubresourceURLHaveValidScheme(url) && |
+ resource_type != content::RESOURCE_TYPE_MAIN_FRAME) { |
+ // Destroying the prerender for unsupported scheme only for non-main |
+ // resource to allow chrome://crash to actually crash in the |
+ // *RendererCrash tests instead of being intercepted here. The unsupported |
+ // scheme for the main resource is checked in WillRedirectRequestOnUI() |
+ // and PrerenderContents::CheckURL(). See http://crbug.com/673771. |
prerender_contents->Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME); |
ReportUnsupportedPrerenderScheme(url); |
cancel = true; |
@@ -200,12 +204,11 @@ void PrerenderResourceThrottle::WillRedirectRequestOnUI( |
ResourceType resource_type, |
bool async, |
bool is_no_store, |
- int render_process_id, |
- int render_frame_id, |
- const GURL& new_url) { |
+ const GURL& new_url, |
+ const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { |
bool cancel = false; |
PrerenderContents* prerender_contents = |
- PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); |
+ PrerenderContentsFromGetter(web_contents_getter); |
if (prerender_contents) { |
prerender_contents->prerender_manager()->RecordPrefetchResponseReceived( |
prerender_contents->origin(), |
@@ -245,8 +248,6 @@ void PrerenderResourceThrottle::WillProcessResponseOnUI( |
bool is_main_resource, |
bool is_no_store, |
int redirect_count, |
- int render_process_id, |
- int render_frame_id, |
scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { |
DCHECK(prerender_throttle_info); |
if (!prerender_throttle_info->manager()) |
@@ -263,15 +264,11 @@ void PrerenderResourceThrottle::WillProcessResponseOnUI( |
} |
// static |
-PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( |
- int render_process_id, int render_frame_id) { |
+PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromGetter( |
+ const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { |
if (g_prerender_contents_for_testing) |
return g_prerender_contents_for_testing; |
- content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( |
- render_process_id, render_frame_id); |
- content::WebContents* web_contents = |
- content::WebContents::FromRenderFrameHost(rfh); |
- return PrerenderContents::FromWebContents(web_contents); |
+ return PrerenderContents::FromWebContents(web_contents_getter.Run()); |
} |
} // namespace prerender |