Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Unified Diff: components/ntp_snippets/remote/ntp_snippets_fetcher.h

Issue 2505643002: Concurrent Snippet Fetches. (Closed)
Patch Set: Explanatory comments. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | components/ntp_snippets/remote/ntp_snippets_fetcher.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/ntp_snippets/remote/ntp_snippets_fetcher.h
diff --git a/components/ntp_snippets/remote/ntp_snippets_fetcher.h b/components/ntp_snippets/remote/ntp_snippets_fetcher.h
index 7816314aaf3b3bb2401dd5b5587c422c0294f17c..62437c99096287262a34c2022b1411af6ca86f7f 100644
--- a/components/ntp_snippets/remote/ntp_snippets_fetcher.h
+++ b/components/ntp_snippets/remote/ntp_snippets_fetcher.h
@@ -6,6 +6,7 @@
#define COMPONENTS_NTP_SNIPPETS_REMOTE_NTP_SNIPPETS_FETCHER_H_
#include <memory>
+#include <queue>
#include <set>
#include <string>
#include <utility>
@@ -22,7 +23,7 @@
#include "components/ntp_snippets/remote/request_throttler.h"
#include "components/translate/core/browser/language_model.h"
#include "google_apis/gaia/oauth2_token_service.h"
-#include "net/url_request/url_fetcher_delegate.h"
+#include "net/http/http_request_headers.h"
#include "net/url_request/url_request_context_getter.h"
class PrefService;
@@ -54,15 +55,17 @@ CategoryInfo BuildRemoteCategoryInfo(const base::string16& title,
// Fetches snippet data for the NTP from the server.
class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
- public OAuth2TokenService::Observer,
- public net::URLFetcherDelegate {
+ public OAuth2TokenService::Observer {
public:
// Callbacks for JSON parsing, needed because the parsing is platform-
// dependent.
- using SuccessCallback = base::Callback<void(std::unique_ptr<base::Value>)>;
- using ErrorCallback = base::Callback<void(const std::string&)>;
- using ParseJSONCallback = base::Callback<
- void(const std::string&, const SuccessCallback&, const ErrorCallback&)>;
+ using SuccessCallback =
+ base::Callback<void(std::unique_ptr<base::Value> result)>;
+ using ErrorCallback = base::Callback<void(const std::string& error)>;
+ using ParseJSONCallback =
+ base::Callback<void(const std::string& raw_json_string,
+ const SuccessCallback& success_callback,
+ const ErrorCallback& error_callback)>;
struct FetchedCategory {
Category category;
@@ -100,11 +103,7 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
};
// Enumeration listing all possible variants of dealing with personalization.
- enum class Personalization {
- kPersonal,
- kNonPersonal,
- kBoth
- };
+ enum class Personalization { kPersonal, kNonPersonal, kBoth };
// Contains all the parameters for one fetch.
struct Params {
@@ -167,9 +166,6 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
// Returns the URL endpoint used by the fetcher.
const GURL& fetch_url() const { return fetch_url_; }
- // Does the fetcher use authentication to get personalized results?
- bool UsesAuthentication() const;
-
// Overrides internal clock for testing purposes.
void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock) {
tick_clock_ = std::move(tick_clock);
@@ -186,36 +182,103 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
BuildRequestWithUILanguageOnly);
FRIEND_TEST_ALL_PREFIXES(NTPSnippetsFetcherTest,
BuildRequestWithOtherLanguageOnly);
+ friend class NTPSnippetsFetcherTest;
enum FetchAPI {
CHROME_READER_API,
CHROME_CONTENT_SUGGESTIONS_API,
};
- struct RequestBuilder {
- Params params;
- FetchAPI fetch_api = CHROME_READER_API;
- std::string obfuscated_gaia_id;
- bool only_return_personalized_results = false;
- std::string user_class;
- translate::LanguageModel::LanguageInfo ui_language;
- translate::LanguageModel::LanguageInfo other_top_language;
+ class JsonRequest;
+ // A class that builds authenticated and non-authenticated JsonRequests.
+ // This class is only in the header for testing.
+ // TODO(fhorschig): Move into separate file with snippets::internal namespace.
+ class RequestBuilder {
+ public:
RequestBuilder();
RequestBuilder(RequestBuilder&&);
~RequestBuilder();
- std::string BuildRequest();
+ // Builds a Request object that contains all data to fetch new snippets.
+ std::unique_ptr<JsonRequest> Build() const;
+
+ RequestBuilder& SetAuthentication(const std::string& account_id,
+ const std::string& auth_header);
+ RequestBuilder& SetCreationTime(base::TimeTicks creation_time);
+ RequestBuilder& SetFetchAPI(FetchAPI fetch_api);
+ // The language_model borrowed from the fetcher needs to stay alive until
+ // the request body is built.
+ RequestBuilder& SetLanguageModel(
+ const translate::LanguageModel* language_model);
+ RequestBuilder& SetParams(const Params& params);
+ RequestBuilder& SetParseJsonCallback(ParseJSONCallback callback);
+ RequestBuilder& SetPersonalization(Personalization personalization);
+ // The tick_clock borrowed from the fetcher will be injected into the
+ // request. It will be used at build time and after the fetch returned.
+ // It has to be alive until the request is destroyed.
+ RequestBuilder& SetTickClock(base::TickClock* tick_clock);
+ RequestBuilder& SetUrl(const GURL& url);
+ RequestBuilder& SetUrlRequestContextGetter(
+ const scoped_refptr<net::URLRequestContextGetter>& context_getter);
+ RequestBuilder& SetUserClassifier(const UserClassifier& user_classifier);
+
+ std::string PreviewRequestBodyForTesting() { return BuildBody(); }
+ std::string PreviewRequestHeadersForTesting() { return BuildHeaders(); }
+ RequestBuilder& SetUserClassForTesting(const std::string& user_class) {
+ user_class_ = user_class;
+ return *this;
+ }
+
+ protected:
+ // TODO(fhorschig): As soon as crbug.com/crbug.com/645447 is resolved,
+ // make these an implementation detail in the body and remove the mock.
+ virtual bool IsSendingTopLanguagesEnabled() const;
+ virtual bool IsSendingUserClassEnabled() const;
+
+ private:
+ std::string BuildHeaders() const;
+ std::string BuildBody() const;
+ std::unique_ptr<net::URLFetcher> BuildURLFetcher(
+ net::URLFetcherDelegate* request,
+ const std::string& headers,
+ const std::string& body) const;
+
+ bool ReturnOnlyPersonalizedResults() const {
+ return !obfuscated_gaia_id_.empty() &&
+ personalization_ == NTPSnippetsFetcher::Personalization::kPersonal;
+ }
+
+ void PrepareLanguages(
+ translate::LanguageModel::LanguageInfo* ui_language,
+ translate::LanguageModel::LanguageInfo* other_top_language) const;
+
+ // Only required, if the request needs to be sent.
+ std::string auth_header_;
+ base::TickClock* tick_clock_;
+ FetchAPI fetch_api_;
+ Params params_;
+ ParseJSONCallback parse_json_callback_;
+ Personalization personalization_;
+ GURL url_;
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
+
+ // Optional properties.
+ std::string obfuscated_gaia_id_;
+ std::string user_class_;
+ const translate::LanguageModel* language_model_;
+
+ DISALLOW_COPY_AND_ASSIGN(RequestBuilder);
};
- RequestBuilder MakeRequestBuilder() const;
-
- void FetchSnippetsImpl(const GURL& url,
- const std::string& auth_header,
- const std::string& request);
- void FetchSnippetsNonAuthenticated();
- void FetchSnippetsAuthenticated(const std::string& account_id,
+ void FetchSnippetsNonAuthenticated(RequestBuilder builder,
+ SnippetsAvailableCallback callback);
+ void FetchSnippetsAuthenticated(RequestBuilder builder,
+ SnippetsAvailableCallback callback,
+ const std::string& account_id,
const std::string& oauth_access_token);
+ void StartRequest(RequestBuilder builder, SnippetsAvailableCallback callback);
+
void StartTokenRequest();
// OAuth2TokenService::Consumer overrides:
@@ -228,20 +291,24 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
// OAuth2TokenService::Observer overrides:
void OnRefreshTokenAvailable(const std::string& account_id) override;
- // URLFetcherDelegate implementation.
- void OnURLFetchComplete(const net::URLFetcher* source) override;
+ void JsonRequestDone(std::unique_ptr<JsonRequest> request,
+ SnippetsAvailableCallback callback,
+ std::unique_ptr<base::Value> result,
+ FetchResult status_code,
+ const std::string& error_details);
+ void FetchFinished(OptionalFetchedCategories categories,
+ SnippetsAvailableCallback callback,
+ FetchResult status_code,
+ const std::string& error_details);
bool JsonToSnippets(const base::Value& parsed,
- FetchedCategoriesVector* categories);
- void OnJsonParsed(std::unique_ptr<base::Value> parsed);
- void OnJsonError(const std::string& error);
- void FetchFinished(OptionalFetchedCategories fetched_categories,
- FetchResult result,
- const std::string& extra_message);
- void FilterCategories(FetchedCategoriesVector* categories);
+ NTPSnippetsFetcher::FetchedCategoriesVector* categories);
bool DemandQuotaForRequest(bool interactive_request);
+ // Does the fetcher use authentication to get personalized results?
+ bool NeedsAuthentication() const;
+
// Authentication for signed-in users.
SigninManagerBase* signin_manager_;
OAuth2TokenService* token_service_;
@@ -254,6 +321,10 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
// Holds the URL request context.
scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
+ // Stores requests that wait for an access token.
+ std::queue<std::pair<RequestBuilder, SnippetsAvailableCallback>>
+ pending_requests_;
+
// Weak references, not owned.
CategoryFactory* const category_factory_;
translate::LanguageModel* const language_model_;
@@ -282,19 +353,6 @@ class NTPSnippetsFetcher : public OAuth2TokenService::Consumer,
RequestThrottler request_throttler_active_ntp_user_;
RequestThrottler request_throttler_active_suggestions_consumer_;
- // The callback to notify when new snippets get fetched.
- SnippetsAvailableCallback snippets_available_callback_;
-
- // The parameters for the current request.
- Params params_;
-
- // The fetcher for downloading the snippets. Only non-null if a fetch is
- // currently ongoing.
- std::unique_ptr<net::URLFetcher> url_fetcher_;
-
- // When the current request was started, for logging purposes.
- base::TimeTicks fetch_start_time_;
-
// Info on the last finished fetch.
std::string last_status_;
std::string last_fetch_json_;
« no previous file with comments | « no previous file | components/ntp_snippets/remote/ntp_snippets_fetcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698