| 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);
|
|
|