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