summaryrefslogtreecommitdiff
path: root/chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h')
-rw-r--r--chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h b/chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
new file mode 100644
index 00000000000..770ea5067c0
--- /dev/null
+++ b/chromium/components/ntp_snippets/remote/remote_suggestions_fetcher_impl.h
@@ -0,0 +1,147 @@
+// Copyright 2017 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 COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_IMPL_H_
+#define COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_IMPL_H_
+
+#include <memory>
+#include <queue>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/optional.h"
+#include "base/time/clock.h"
+#include "components/ntp_snippets/remote/json_request.h"
+#include "components/ntp_snippets/remote/json_to_categories.h"
+#include "components/ntp_snippets/remote/remote_suggestions_fetcher.h"
+#include "components/ntp_snippets/remote/request_params.h"
+#include "net/url_request/url_request_context_getter.h"
+
+class AccessTokenFetcher;
+class OAuth2TokenService;
+class PrefService;
+class SigninManagerBase;
+
+namespace base {
+class Value;
+} // namespace base
+
+namespace language {
+class UrlLanguageHistogram;
+} // namespace language
+
+namespace ntp_snippets {
+
+class UserClassifier;
+
+class RemoteSuggestionsFetcherImpl : public RemoteSuggestionsFetcher {
+ public:
+ RemoteSuggestionsFetcherImpl(
+ SigninManagerBase* signin_manager,
+ OAuth2TokenService* token_service,
+ scoped_refptr<net::URLRequestContextGetter> url_request_context_getter,
+ PrefService* pref_service,
+ language::UrlLanguageHistogram* language_histogram,
+ const ParseJSONCallback& parse_json_callback,
+ const GURL& api_endpoint,
+ const std::string& api_key,
+ const UserClassifier* user_classifier);
+ ~RemoteSuggestionsFetcherImpl() override;
+
+ void FetchSnippets(const RequestParams& params,
+ SnippetsAvailableCallback callback) override;
+
+ const std::string& GetLastStatusForDebugging() const override;
+ const std::string& GetLastJsonForDebugging() const override;
+ const GURL& GetFetchUrlForDebugging() const override;
+
+ // Overrides internal clock for testing purposes.
+ void SetClockForTesting(std::unique_ptr<base::Clock> clock) {
+ clock_ = std::move(clock);
+ }
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestAuthenticated);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestUnauthenticated);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestExcludedIds);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestNoUserClass);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestWithTwoLanguages);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestWithUILanguageOnly);
+ FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest,
+ BuildRequestWithOtherLanguageOnly);
+ friend class ChromeReaderSnippetsFetcherTest;
+
+ void FetchSnippetsNonAuthenticated(internal::JsonRequest::Builder builder,
+ SnippetsAvailableCallback callback);
+ void FetchSnippetsAuthenticated(internal::JsonRequest::Builder builder,
+ SnippetsAvailableCallback callback,
+ const std::string& oauth_access_token);
+ void StartRequest(internal::JsonRequest::Builder builder,
+ SnippetsAvailableCallback callback);
+
+ void StartTokenRequest();
+
+ void AccessTokenFetchFinished(const GoogleServiceAuthError& error,
+ const std::string& access_token);
+ void AccessTokenError(const GoogleServiceAuthError& error);
+
+ void JsonRequestDone(std::unique_ptr<internal::JsonRequest> request,
+ SnippetsAvailableCallback callback,
+ std::unique_ptr<base::Value> result,
+ internal::FetchResult status_code,
+ const std::string& error_details);
+ void FetchFinished(OptionalFetchedCategories categories,
+ SnippetsAvailableCallback callback,
+ internal::FetchResult status_code,
+ const std::string& error_details);
+
+ // Authentication for signed-in users.
+ SigninManagerBase* signin_manager_;
+ OAuth2TokenService* token_service_;
+
+ std::unique_ptr<AccessTokenFetcher> token_fetcher_;
+
+ // 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<internal::JsonRequest::Builder, SnippetsAvailableCallback>>
+ pending_requests_;
+
+ // Weak reference, not owned.
+ language::UrlLanguageHistogram* const language_histogram_;
+
+ const ParseJSONCallback parse_json_callback_;
+
+ // API endpoint for fetching suggestions.
+ const GURL fetch_url_;
+
+ // API key to use for non-authenticated requests.
+ const std::string api_key_;
+
+ // Allow for an injectable clock for testing.
+ std::unique_ptr<base::Clock> clock_;
+
+ // Classifier that tells us how active the user is. Not owned.
+ const UserClassifier* user_classifier_;
+
+ // Info on the last finished fetch.
+ std::string last_status_;
+ std::string last_fetch_json_;
+
+ DISALLOW_COPY_AND_ASSIGN(RemoteSuggestionsFetcherImpl);
+};
+
+} // namespace ntp_snippets
+
+#endif // COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_IMPL_H_