diff options
Diffstat (limited to 'chrome/browser/webui/chrome_url_data_manager_backend.h')
-rw-r--r-- | chrome/browser/webui/chrome_url_data_manager_backend.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/chrome/browser/webui/chrome_url_data_manager_backend.h b/chrome/browser/webui/chrome_url_data_manager_backend.h new file mode 100644 index 0000000..01ffdb7 --- /dev/null +++ b/chrome/browser/webui/chrome_url_data_manager_backend.h @@ -0,0 +1,99 @@ +// Copyright (c) 2011 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. + +#ifndef CHROME_BROWSER_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_ +#define CHROME_BROWSER_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_ +#pragma once + +#include "base/basictypes.h" +#include "base/ref_counted.h" +#include "chrome/browser/webui/chrome_url_data_manager.h" + +#include <map> +#include <string> +#include <vector> + +class FilePath; +class GURL; +class URLRequestChromeJob; + +namespace net { +class URLRequest; +class URLRequestJob; +} + +// ChromeURLDataManagerBackend is used internally by ChromeURLDataManager on the +// IO thread. In most cases you can use the API in ChromeURLDataManager and +// ignore this class. ChromeURLDataManagerBackend is owned by +// ChromeURLRequestContext. +class ChromeURLDataManagerBackend { + public: + typedef int RequestID; + + ChromeURLDataManagerBackend(); + ~ChromeURLDataManagerBackend(); + + // Invoked to register the protocol factories. + static void Register(); + + // Adds a DataSource to the collection of data sources. + void AddDataSource(ChromeURLDataManager::DataSource* source); + + // Add/remove a path from the collection of file sources. + // A file source acts like a file:// URL to the specified path. + // Calling this from threads other the IO thread must be done via + // InvokeLater. + void AddFileSource(const std::string& source_name, const FilePath& path); + + // DataSource invokes this. Sends the data to the URLRequest. + void DataAvailable(RequestID request_id, RefCountedMemory* bytes); + + static net::URLRequestJob* Factory(net::URLRequest* request, + const std::string& scheme); + + private: + friend class URLRequestChromeJob; + + typedef std::map<std::string, + scoped_refptr<ChromeURLDataManager::DataSource> > DataSourceMap; + typedef std::map<std::string, FilePath> FileSourceMap; + typedef std::map<RequestID, URLRequestChromeJob*> PendingRequestMap; + + // Parse a URL into the components used to resolve its request. + void URLToRequest(const GURL& url, std::string* source, std::string* path); + + // Translate a chrome resource URL into a local file path if there is one. + // Returns false if there is no file handler for this URL + bool URLToFilePath(const GURL& url, FilePath* file_path); + + // Called by the job when it's starting up. + // Returns false if |url| is not a URL managed by this object. + bool StartRequest(const GURL& url, URLRequestChromeJob* job); + + // Remove a request from the list of pending requests. + void RemoveRequest(URLRequestChromeJob* job); + + // Returns true if the job exists in |pending_requests_|. False otherwise. + // Called by ~URLRequestChromeJob to verify that |pending_requests_| is kept + // up to date. + bool HasPendingJob(URLRequestChromeJob* job) const; + + // File sources of data, keyed by source name (e.g. "inspector"). + FileSourceMap file_sources_; + + // Custom sources of data, keyed by source path (e.g. "favicon"). + DataSourceMap data_sources_; + + // All pending URLRequestChromeJobs, keyed by ID of the request. + // URLRequestChromeJob calls into this object when it's constructed and + // destructed to ensure that the pointers in this map remain valid. + PendingRequestMap pending_requests_; + + // The ID we'll use for the next request we receive. + RequestID next_request_id_; + + DISALLOW_COPY_AND_ASSIGN(ChromeURLDataManagerBackend); +}; + +#endif // CHROME_BROWSER_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_ |