1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/search/instant_io_context.h" 6 7 #include "content/public/browser/browser_thread.h" 8 #include "content/public/browser/resource_context.h" 9 #include "content/public/browser/resource_request_info.h" 10 #include "net/url_request/url_request.h" 11 #include "url/gurl.h" 12 13 using content::BrowserThread; 14 15 namespace { 16 17 // Retrieves the Instant data from the |context|'s named user-data. GetDataForResourceContext(content::ResourceContext * context)18InstantIOContext* GetDataForResourceContext( 19 content::ResourceContext* context) { 20 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 21 return base::UserDataAdapter<InstantIOContext>::Get( 22 context, InstantIOContext::kInstantIOContextKeyName); 23 } 24 GetDataForRequest(const net::URLRequest * request)25InstantIOContext* GetDataForRequest(const net::URLRequest* request) { 26 const content::ResourceRequestInfo* info = 27 content::ResourceRequestInfo::ForRequest(request); 28 if (!info) 29 return NULL; 30 31 return GetDataForResourceContext(info->GetContext()); 32 } 33 34 } // namespace 35 36 const char InstantIOContext::kInstantIOContextKeyName[] = "instant_io_context"; 37 InstantIOContext()38InstantIOContext::InstantIOContext() { 39 // The InstantIOContext is created on the UI thread but is accessed 40 // on the IO thread. 41 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 42 } 43 ~InstantIOContext()44InstantIOContext::~InstantIOContext() { 45 } 46 47 // static SetUserDataOnIO(content::ResourceContext * resource_context,scoped_refptr<InstantIOContext> instant_io_context)48void InstantIOContext::SetUserDataOnIO( 49 content::ResourceContext* resource_context, 50 scoped_refptr<InstantIOContext> instant_io_context) { 51 resource_context->SetUserData( 52 InstantIOContext::kInstantIOContextKeyName, 53 new base::UserDataAdapter<InstantIOContext>(instant_io_context.get())); 54 } 55 56 // static AddInstantProcessOnIO(scoped_refptr<InstantIOContext> instant_io_context,int process_id)57void InstantIOContext::AddInstantProcessOnIO( 58 scoped_refptr<InstantIOContext> instant_io_context, 59 int process_id) { 60 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 61 instant_io_context->process_ids_.insert(process_id); 62 } 63 64 // static RemoveInstantProcessOnIO(scoped_refptr<InstantIOContext> instant_io_context,int process_id)65void InstantIOContext::RemoveInstantProcessOnIO( 66 scoped_refptr<InstantIOContext> instant_io_context, int process_id) { 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 68 instant_io_context->process_ids_.erase(process_id); 69 } 70 71 // static ClearInstantProcessesOnIO(scoped_refptr<InstantIOContext> instant_io_context)72void InstantIOContext::ClearInstantProcessesOnIO( 73 scoped_refptr<InstantIOContext> instant_io_context) { 74 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 75 instant_io_context->process_ids_.clear(); 76 } 77 78 // static ShouldServiceRequest(const net::URLRequest * request)79bool InstantIOContext::ShouldServiceRequest(const net::URLRequest* request) { 80 const content::ResourceRequestInfo* info = 81 content::ResourceRequestInfo::ForRequest(request); 82 if (!info) 83 return false; 84 85 InstantIOContext* instant_io_context = GetDataForRequest(request); 86 if (!instant_io_context) 87 return false; 88 89 int process_id = -1; 90 int render_view_id = -1; 91 if (info->GetAssociatedRenderView(&process_id, &render_view_id) && 92 instant_io_context->IsInstantProcess(process_id)) 93 return true; 94 return false; 95 } 96 IsInstantProcess(int process_id) const97bool InstantIOContext::IsInstantProcess(int process_id) const { 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 99 return process_ids_.find(process_id) != process_ids_.end(); 100 } 101