| Index: chrome/browser/dom_ui/chrome_url_data_manager_backend.h
|
| ===================================================================
|
| --- chrome/browser/dom_ui/chrome_url_data_manager_backend.h (revision 74394)
|
| +++ chrome/browser/dom_ui/chrome_url_data_manager_backend.h (working copy)
|
| @@ -1,152 +1,76 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// 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_DOM_UI_CHROME_URL_DATA_MANAGER_H_
|
| -#define CHROME_BROWSER_DOM_UI_CHROME_URL_DATA_MANAGER_H_
|
| +#ifndef CHROME_BROWSER_DOM_UI_CHROME_URL_DATA_MANAGER_BACKEND_H_
|
| +#define CHROME_BROWSER_DOM_UI_CHROME_URL_DATA_MANAGER_BACKEND_H_
|
| #pragma once
|
|
|
| +#include "base/basictypes.h"
|
| +#include "base/ref_counted.h"
|
| +#include "chrome/browser/dom_ui/chrome_url_data_manager.h"
|
| +
|
| #include <map>
|
| #include <string>
|
| +#include <vector>
|
|
|
| -#include "base/singleton.h"
|
| -#include "base/task.h"
|
| -#include "base/ref_counted.h"
|
| -#include "chrome/browser/browser_thread.h"
|
| -
|
| -class DictionaryValue;
|
| class FilePath;
|
| class GURL;
|
| -class MessageLoop;
|
| -class RefCountedMemory;
|
| class URLRequestChromeJob;
|
|
|
| namespace net {
|
| class URLRequest;
|
| class URLRequestJob;
|
| -} // namespace net
|
| +}
|
|
|
| -// To serve dynamic data off of chrome: URLs, implement the
|
| -// ChromeURLDataManager::DataSource interface and register your handler
|
| -// with AddDataSource.
|
| -
|
| -// ChromeURLDataManager lives on the IO thread, so any interfacing with
|
| -// it from the UI thread needs to go through an InvokeLater.
|
| -class ChromeURLDataManager {
|
| +// 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:
|
| - // Returns the singleton instance.
|
| - static ChromeURLDataManager* GetInstance();
|
| -
|
| typedef int RequestID;
|
|
|
| - // A DataSource is an object that can answer requests for data
|
| - // asynchronously. DataSources are collectively owned with refcounting smart
|
| - // pointers and should never be deleted on the IO thread, since their calls
|
| - // are handled almost always on the UI thread and there's a possibility of a
|
| - // data race. The |DeleteOnUIThread| trait is used to enforce this.
|
| - //
|
| - // An implementation of DataSource should handle calls to
|
| - // StartDataRequest() by starting its (implementation-specific) asynchronous
|
| - // request for the data, then call SendResponse() to notify.
|
| - class DataSource : public base::RefCountedThreadSafe<
|
| - DataSource, BrowserThread::DeleteOnUIThread> {
|
| - public:
|
| - // See source_name_ and message_loop_ below for docs on these parameters.
|
| - DataSource(const std::string& source_name,
|
| - MessageLoop* message_loop);
|
| + ChromeURLDataManagerBackend();
|
| + ~ChromeURLDataManagerBackend();
|
|
|
| - // Sent by the DataManager to request data at |path|. The source should
|
| - // call SendResponse() when the data is available or if the request could
|
| - // not be satisfied.
|
| - virtual void StartDataRequest(const std::string& path,
|
| - bool is_off_the_record,
|
| - int request_id) = 0;
|
| + // Invoked to register the protocol factories.
|
| + static void Register();
|
|
|
| - // Return the mimetype that should be sent with this response, or empty
|
| - // string to specify no mime type.
|
| - virtual std::string GetMimeType(const std::string& path) const = 0;
|
| + // Adds a DataSource to the collection of data sources.
|
| + void AddDataSource(ChromeURLDataManager::DataSource* source);
|
|
|
| - // Report that a request has resulted in the data |bytes|.
|
| - // If the request can't be satisfied, pass NULL for |bytes| to indicate
|
| - // the request is over.
|
| - virtual void SendResponse(int request_id, RefCountedMemory* bytes);
|
| -
|
| - // Returns the MessageLoop on which the DataSource wishes to have
|
| - // StartDataRequest called to handle the request for |path|. If the
|
| - // DataSource does not care which thread StartDataRequest is called on,
|
| - // this should return NULL. The default implementation always returns
|
| - // message_loop_, which generally results in processing on the UI thread.
|
| - // It may be beneficial to return NULL for requests that are safe to handle
|
| - // directly on the IO thread. This can improve performance by satisfying
|
| - // such requests more rapidly when there is a large amount of UI thread
|
| - // contention.
|
| - virtual MessageLoop* MessageLoopForRequestPath(const std::string& path)
|
| - const;
|
| -
|
| - const std::string& source_name() const { return source_name_; }
|
| -
|
| - static void SetFontAndTextDirection(DictionaryValue* localized_strings);
|
| -
|
| - protected:
|
| - friend class base::RefCountedThreadSafe<DataSource>;
|
| - friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
|
| - friend class DeleteTask<DataSource>;
|
| -
|
| - virtual ~DataSource();
|
| -
|
| - private:
|
| - // The name of this source.
|
| - // E.g., for favicons, this could be "favicon", which results in paths for
|
| - // specific resources like "favicon/34" getting sent to this source.
|
| - const std::string source_name_;
|
| -
|
| - // The MessageLoop for the thread where this DataSource lives.
|
| - // Used to send messages to the DataSource.
|
| - MessageLoop* message_loop_;
|
| - };
|
| -
|
| - // Add a DataSource to the collection of data sources.
|
| - // Because we don't track users of a given path, we can't know when it's
|
| - // safe to remove them, so the added source effectively leaks.
|
| - // This could be improved in the future but currently the users of this
|
| - // interface are conceptually permanent registration anyway.
|
| - // Adding a second DataSource with the same name clobbers the first.
|
| - // NOTE: Calling this from threads other the IO thread must be done via
|
| - // InvokeLater.
|
| - void AddDataSource(scoped_refptr<DataSource> source);
|
| - // Called during shutdown, before destruction of |BrowserThread|.
|
| - void RemoveDataSourceForTest(const char* source_name); // For unit tests.
|
| - void RemoveAllDataSources(); // For the browser.
|
| -
|
| // 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);
|
| - void RemoveFileSource(const std::string& source_name);
|
|
|
| + // 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;
|
| - friend struct DefaultSingletonTraits<ChromeURLDataManager>;
|
|
|
| - ChromeURLDataManager();
|
| - ~ChromeURLDataManager();
|
| + 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.
|
| - static void URLToRequest(const GURL& url,
|
| - std::string* source,
|
| - std::string* path);
|
| + 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
|
| - static bool URLToFilePath(const GURL& url, FilePath* file_path);
|
| + 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);
|
|
|
| @@ -155,37 +79,21 @@
|
| // up to date.
|
| bool HasPendingJob(URLRequestChromeJob* job) const;
|
|
|
| - // Sent by Request::SendResponse.
|
| - void DataAvailable(RequestID request_id,
|
| - scoped_refptr<RefCountedMemory> bytes);
|
| -
|
| // File sources of data, keyed by source name (e.g. "inspector").
|
| - typedef std::map<std::string, FilePath> FileSourceMap;
|
| FileSourceMap file_sources_;
|
|
|
| // Custom sources of data, keyed by source path (e.g. "favicon").
|
| - typedef std::map<std::string, scoped_refptr<DataSource> > DataSourceMap;
|
| 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.
|
| - typedef std::map<RequestID, URLRequestChromeJob*> PendingRequestMap;
|
| PendingRequestMap pending_requests_;
|
|
|
| // The ID we'll use for the next request we receive.
|
| RequestID next_request_id_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ChromeURLDataManagerBackend);
|
| };
|
|
|
| -// Since we have a single global ChromeURLDataManager, we don't need to
|
| -// grab a reference to it when creating Tasks involving it.
|
| -DISABLE_RUNNABLE_METHOD_REFCOUNT(ChromeURLDataManager);
|
| -
|
| -// Register our special URL handler under our special URL scheme.
|
| -// Must be done once at startup.
|
| -void RegisterURLRequestChromeJob();
|
| -
|
| -// Undoes the registration done by RegisterURLRequestChromeJob.
|
| -void UnregisterURLRequestChromeJob();
|
| -
|
| -#endif // CHROME_BROWSER_DOM_UI_CHROME_URL_DATA_MANAGER_H_
|
| +#endif // CHROME_BROWSER_DOM_UI_CHROME_URL_DATA_MANAGER_BACKEND_H_
|
|
|