Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_UI_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_
      6 #define CHROME_BROWSER_UI_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_
      7 #pragma once
      8 
      9 #include "base/basictypes.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/task.h"
     12 #include "chrome/browser/ui/webui/chrome_url_data_manager.h"
     13 
     14 #include <map>
     15 #include <string>
     16 #include <vector>
     17 
     18 class FilePath;
     19 class GURL;
     20 class URLRequestChromeJob;
     21 
     22 namespace net {
     23 class URLRequest;
     24 class URLRequestJob;
     25 }
     26 
     27 // ChromeURLDataManagerBackend is used internally by ChromeURLDataManager on the
     28 // IO thread. In most cases you can use the API in ChromeURLDataManager and
     29 // ignore this class. ChromeURLDataManagerBackend is owned by
     30 // ChromeURLRequestContext.
     31 class ChromeURLDataManagerBackend {
     32  public:
     33   typedef int RequestID;
     34 
     35   ChromeURLDataManagerBackend();
     36   ~ChromeURLDataManagerBackend();
     37 
     38   // Invoked to register the protocol factories.
     39   static void Register();
     40 
     41   // Adds a DataSource to the collection of data sources.
     42   void AddDataSource(ChromeURLDataManager::DataSource* source);
     43 
     44   // DataSource invokes this. Sends the data to the URLRequest.
     45   void DataAvailable(RequestID request_id, RefCountedMemory* bytes);
     46 
     47   static net::URLRequestJob* Factory(net::URLRequest* request,
     48                                      const std::string& scheme);
     49 
     50  private:
     51   friend class URLRequestChromeJob;
     52 
     53   typedef std::map<std::string,
     54       scoped_refptr<ChromeURLDataManager::DataSource> > DataSourceMap;
     55   typedef std::map<RequestID, URLRequestChromeJob*> PendingRequestMap;
     56 
     57   // Called by the job when it's starting up.
     58   // Returns false if |url| is not a URL managed by this object.
     59   bool StartRequest(const GURL& url, URLRequestChromeJob* job);
     60 
     61   // Remove a request from the list of pending requests.
     62   void RemoveRequest(URLRequestChromeJob* job);
     63 
     64   // Returns true if the job exists in |pending_requests_|. False otherwise.
     65   // Called by ~URLRequestChromeJob to verify that |pending_requests_| is kept
     66   // up to date.
     67   bool HasPendingJob(URLRequestChromeJob* job) const;
     68 
     69   // Custom sources of data, keyed by source path (e.g. "favicon").
     70   DataSourceMap data_sources_;
     71 
     72   // All pending URLRequestChromeJobs, keyed by ID of the request.
     73   // URLRequestChromeJob calls into this object when it's constructed and
     74   // destructed to ensure that the pointers in this map remain valid.
     75   PendingRequestMap pending_requests_;
     76 
     77   // The ID we'll use for the next request we receive.
     78   RequestID next_request_id_;
     79 
     80   DISALLOW_COPY_AND_ASSIGN(ChromeURLDataManagerBackend);
     81 };
     82 
     83 #endif  // CHROME_BROWSER_UI_WEBUI_CHROME_URL_DATA_MANAGER_BACKEND_H_
     84