Index: net/base/sdch_dictionary_fetcher.h |
diff --git a/net/base/sdch_dictionary_fetcher.h b/net/base/sdch_dictionary_fetcher.h |
index 68a044ab98addecbcb72133fd7bec05f47e5de16..f70d56a5ccb03f894fe3f1f34da025c88448fda9 100644 |
--- a/net/base/sdch_dictionary_fetcher.h |
+++ b/net/base/sdch_dictionary_fetcher.h |
@@ -2,9 +2,11 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// Support modularity by calling to load a new SDCH filter dictionary. |
-// Note that this sort of calling can't be done in the /net directory, as it has |
-// no concept of the HTTP cache (which is only visible at the browser level). |
+// TODO(rdsmith): This class needs to be moved out to the net/ embedder and |
+// hooked into whatever mechanisms the embedder uses for authentication. |
+// Specifically, this class needs methods overriding |
+// URLRequest::Delegate::{OnAuthRequired,OnCertificateRequested} and can't |
+// implement them at the net/ layer. |
#ifndef NET_BASE_SDCH_DICTIONARY_FETCHER_H_ |
#define NET_BASE_SDCH_DICTIONARY_FETCHER_H_ |
@@ -18,62 +20,75 @@ |
#include "base/threading/non_thread_safe.h" |
#include "net/base/sdch_manager.h" |
#include "net/url_request/url_fetcher_delegate.h" |
+#include "net/url_request/url_request.h" |
namespace net { |
-class URLFetcher; |
-class URLRequestContextGetter; |
+class URLRequest; |
+class URLRequestThrottlerEntryInterface; |
+// This class implements the SdchFetcher interface. It queues requests |
+// for dictionaries and dispatches them serially, implementing |
+// the URLRequest::Delegate interface to handle callbacks (but see above |
+// TODO). It tracks all requests, only attempting to fetch each dictionary |
+// once. |
class NET_EXPORT SdchDictionaryFetcher |
- : public URLFetcherDelegate, |
- public SdchFetcher, |
+ : public SdchFetcher, |
+ public URLRequest::Delegate, |
public base::NonThreadSafe { |
public: |
- // The consumer must guarantee that |*manager| outlives |
- // this object. The current implementation guarantees this by |
- // the SdchManager owning this object. |
- SdchDictionaryFetcher(SdchManager* manager, |
- scoped_refptr<URLRequestContextGetter> context); |
+ // The consumer must guarantee that |*consumer| and |*context| outlive |
+ // this object. |
+ SdchDictionaryFetcher(SdchFetcher::Delegate* consumer, |
+ URLRequestContext* context); |
virtual ~SdchDictionaryFetcher(); |
- // Implementation of SdchFetcher class. |
+ // Implementation of SdchFetcher methods. |
virtual void Schedule(const GURL& dictionary_url) OVERRIDE; |
virtual void Cancel() OVERRIDE; |
- private: |
- // Delay in ms between Schedule and actual download. |
- // This leaves the URL in a queue, which is de-duped, so that there is less |
- // chance we'll try to load the same URL multiple times when a pile of |
- // page subresources (or tabs opened in parallel) all suggest the dictionary. |
- static const int kMsDelayFromRequestTillDownload = 100; |
- |
- // Ensure the download after the above delay. |
- void ScheduleDelayedRun(); |
- |
- // Make sure we're processing (or waiting for) the the arrival of the next URL |
- // in the |fetch_queue_|. |
- void StartFetching(); |
+ // Implementation of URLRequest::Delegate methods. |
+ virtual void OnResponseStarted(URLRequest* request) OVERRIDE; |
+ virtual void OnReadCompleted(URLRequest* request, int bytes_read) OVERRIDE; |
- // Implementation of URLFetcherDelegate. Called after transmission |
- // completes (either successfully or with failure). |
- virtual void OnURLFetchComplete(const URLFetcher* source) OVERRIDE; |
- |
- SdchManager* const manager_; |
+ private: |
+ enum State { |
+ STATE_NONE, |
+ STATE_IDLE, |
+ STATE_REQUEST_STARTED, |
+ STATE_REQUEST_READING, |
+ STATE_REQUEST_COMPLETE, |
+ }; |
+ |
+ // State machine implementation. |
+ int DoLoop(int rv); |
+ int DoDispatchRequest(int rv); |
+ int DoRequestStarted(int rv); |
+ int DoRead(int rv); |
+ int DoCompleteRequest(int rv); |
+ |
+ State next_state_; |
+ bool in_loop_; |
+ |
+ SdchFetcher::Delegate* const consumer_; |
// A queue of URLs that are being used to download dictionaries. |
std::queue<GURL> fetch_queue_; |
- // The currently outstanding URL fetch of a dicitonary. |
- // If this is null, then there is no outstanding request. |
- scoped_ptr<URLFetcher> current_fetch_; |
- bool task_is_pending_; |
+ // The request and buffer used for getting the current dictionary |
+ // Both are null when a fetch is not in progress. |
+ scoped_ptr<URLRequest> current_request_; |
+ scoped_refptr<IOBuffer> buffer_; |
+ |
+ // The currently accumulating dictionary. |
+ std::string dictionary_; |
// Althought the SDCH spec does not preclude a server from using a single URL |
// to load several distinct dictionaries (by telling a client to load a |
// dictionary from an URL several times), current implementations seem to have |
// that 1-1 relationship (i.e., each URL points at a single dictionary, and |
// the dictionary content does not change over time, and hence is not worth |
- // trying to load more than once). In addition, some dictionaries prove |
+ // trying to load more than once). In addition, some dictionaries prove |
// unloadable only after downloading them (because they are too large? ...or |
// malformed?). As a protective element, Chromium will *only* load a |
// dictionary at most once from a given URL (so that it doesn't waste |
@@ -83,13 +98,10 @@ class NET_EXPORT SdchDictionaryFetcher |
// TODO(jar): Try to augment the SDCH proposal to include this restiction. |
std::set<GURL> attempted_load_; |
- // Store the system_url_request_context_getter to use it when we start |
- // fetching. |
- scoped_refptr<URLRequestContextGetter> context_; |
+ // Store the URLRequestContext associated with the owning SdchManager for |
+ // use while fetching. |
+ URLRequestContext* context_; |
- // Always spread out the dictionary fetches, so that they don't steal |
- // bandwidth from the actual page load. Create delayed tasks to spread out |
- // the download. |
base::WeakPtrFactory<SdchDictionaryFetcher> weak_factory_; |
DISALLOW_COPY_AND_ASSIGN(SdchDictionaryFetcher); |