12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_BACKEND_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_BACKEND_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/supports_user_data.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/url_data_manager.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/url_data_source.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_job_factory.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RefCountedMemory; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AppCacheServiceImpl; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChromeBlobStorageContext; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ResourceContext; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLDataManagerBackend; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLDataSourceImpl; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequestChromeJob; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// URLDataManagerBackend is used internally by ChromeURLDataManager on the IO 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// thread. In most cases you can use the API in ChromeURLDataManager and ignore 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// this class. URLDataManagerBackend is owned by ResourceContext. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLDataManagerBackend : public base::SupportsUserData::Data { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef int RequestID; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) URLDataManagerBackend(); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~URLDataManagerBackend(); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invoked to create the protocol handler for chrome://. |is_incognito| should 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be set for incognito profiles. Called on the UI thread. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static net::URLRequestJobFactory::ProtocolHandler* CreateProtocolHandler( 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ResourceContext* resource_context, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_incognito, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AppCacheServiceImpl* appcache_service, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromeBlobStorageContext* blob_storage_context); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Adds a DataSource to the collection of data sources. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddDataSource(URLDataSourceImpl* source); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DataSource invokes this. Sends the data to the URLRequest. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DataAvailable(RequestID request_id, base::RefCountedMemory* bytes); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static net::URLRequestJob* Factory(net::URLRequest* request, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& scheme); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class URLRequestChromeJob; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<std::string, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<URLDataSourceImpl> > DataSourceMap; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::map<RequestID, URLRequestChromeJob*> PendingRequestMap; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by the job when it's starting up. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns false if |url| is not a URL managed by this object. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool StartRequest(const net::URLRequest* request, URLRequestChromeJob* job); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Helper function to call StartDataRequest on |source|'s delegate. This is 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needed because while we want to call URLDataSourceDelegate's method, we 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // need to add a refcount on the source. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void CallStartRequest(scoped_refptr<URLDataSourceImpl> source, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_process_id, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int request_id); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove a request from the list of pending requests. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RemoveRequest(URLRequestChromeJob* job); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the job exists in |pending_requests_|. False otherwise. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by ~URLRequestChromeJob to verify that |pending_requests_| is kept 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // up to date. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasPendingJob(URLRequestChromeJob* job) const; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Look up the data source for the request. Returns the source if it is found, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // else NULL. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) URLDataSourceImpl* GetDataSourceFromURL(const GURL& url); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Custom sources of data, keyed by source path (e.g. "favicon"). 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DataSourceMap data_sources_; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All pending URLRequestChromeJobs, keyed by ID of the request. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // URLRequestChromeJob calls into this object when it's constructed and 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destructed to ensure that the pointers in this map remain valid. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PendingRequestMap pending_requests_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The ID we'll use for the next request we receive. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestID next_request_id_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(URLDataManagerBackend); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Creates protocol handler for chrome-devtools://. |is_incognito| should be 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// set for incognito profiles. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)net::URLRequestJobFactory::ProtocolHandler* 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CreateDevToolsProtocolHandler(content::ResourceContext* resource_context, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_incognito); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_BROWSER_WEBUI_URL_DATA_MANAGER_BACKEND_H_ 116