OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ | 5 #ifndef COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ |
6 #define COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ | 6 #define COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 #include <queue> | 9 #include <queue> |
10 #include <string> | 10 #include <string> |
11 #include <utility> | 11 #include <utility> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/callback.h" | 14 #include "base/callback.h" |
15 #include "base/optional.h" | 15 #include "base/optional.h" |
16 #include "base/time/clock.h" | 16 #include "base/time/clock.h" |
17 #include "base/time/tick_clock.h" | 17 #include "base/time/tick_clock.h" |
18 #include "components/ntp_snippets/category.h" | 18 #include "components/ntp_snippets/category.h" |
19 #include "components/ntp_snippets/category_info.h" | 19 #include "components/ntp_snippets/category_info.h" |
20 #include "components/ntp_snippets/remote/json_request.h" | 20 #include "components/ntp_snippets/remote/json_request.h" |
21 #include "components/ntp_snippets/remote/remote_suggestion.h" | 21 #include "components/ntp_snippets/remote/remote_suggestion.h" |
22 #include "components/ntp_snippets/remote/request_params.h" | 22 #include "components/ntp_snippets/remote/request_params.h" |
23 #include "components/ntp_snippets/status.h" | 23 #include "components/ntp_snippets/status.h" |
24 #include "components/translate/core/browser/language_model.h" | 24 #include "components/translate/core/browser/language_model.h" |
25 #include "components/version_info/version_info.h" | 25 #include "components/version_info/version_info.h" |
26 #include "net/url_request/url_request_context_getter.h" | 26 #include "net/url_request/url_request_context_getter.h" |
27 | 27 |
| 28 class AccessTokenFetcher; |
| 29 class OAuth2TokenService; |
28 class PrefService; | 30 class PrefService; |
29 class SigninManagerBase; | 31 class SigninManagerBase; |
30 | 32 |
31 namespace base { | 33 namespace base { |
32 class Value; | 34 class Value; |
33 } // namespace base | 35 } // namespace base |
34 | 36 |
35 namespace ntp_snippets { | 37 namespace ntp_snippets { |
36 | 38 |
37 class UserClassifier; | 39 class UserClassifier; |
(...skipping 15 matching lines...) Expand all Loading... |
53 const base::Optional<base::string16>& title); | 55 const base::Optional<base::string16>& title); |
54 | 56 |
55 // Provides the CategoryInfo data for other remote suggestions. | 57 // Provides the CategoryInfo data for other remote suggestions. |
56 CategoryInfo BuildRemoteCategoryInfo(const base::string16& title, | 58 CategoryInfo BuildRemoteCategoryInfo(const base::string16& title, |
57 bool allow_fetching_more_results); | 59 bool allow_fetching_more_results); |
58 | 60 |
59 // Fetches suggestion data for the NTP from the server. | 61 // Fetches suggestion data for the NTP from the server. |
60 // TODO(fhorschig): Untangle cyclic dependencies by introducing a | 62 // TODO(fhorschig): Untangle cyclic dependencies by introducing a |
61 // RemoteSuggestionsFetcherInterface. (Would be good for mock implementations, | 63 // RemoteSuggestionsFetcherInterface. (Would be good for mock implementations, |
62 // too!) | 64 // too!) |
63 class RemoteSuggestionsFetcher : public OAuth2TokenService::Consumer, | 65 class RemoteSuggestionsFetcher { |
64 public OAuth2TokenService::Observer { | |
65 public: | 66 public: |
66 struct FetchedCategory { | 67 struct FetchedCategory { |
67 Category category; | 68 Category category; |
68 CategoryInfo info; | 69 CategoryInfo info; |
69 RemoteSuggestion::PtrVector suggestions; | 70 RemoteSuggestion::PtrVector suggestions; |
70 | 71 |
71 FetchedCategory(Category c, CategoryInfo&& info); | 72 FetchedCategory(Category c, CategoryInfo&& info); |
72 FetchedCategory(FetchedCategory&&); // = default, in .cc | 73 FetchedCategory(FetchedCategory&&); // = default, in .cc |
73 ~FetchedCategory(); // = default, in .cc | 74 ~FetchedCategory(); // = default, in .cc |
74 FetchedCategory& operator=(FetchedCategory&&); // = default, in .cc | 75 FetchedCategory& operator=(FetchedCategory&&); // = default, in .cc |
75 }; | 76 }; |
76 using FetchedCategoriesVector = std::vector<FetchedCategory>; | 77 using FetchedCategoriesVector = std::vector<FetchedCategory>; |
77 using OptionalFetchedCategories = base::Optional<FetchedCategoriesVector>; | 78 using OptionalFetchedCategories = base::Optional<FetchedCategoriesVector>; |
78 | 79 |
79 using SnippetsAvailableCallback = | 80 using SnippetsAvailableCallback = |
80 base::OnceCallback<void(Status status, | 81 base::OnceCallback<void(Status status, |
81 OptionalFetchedCategories fetched_categories)>; | 82 OptionalFetchedCategories fetched_categories)>; |
82 | 83 |
83 RemoteSuggestionsFetcher( | 84 RemoteSuggestionsFetcher( |
84 SigninManagerBase* signin_manager, | 85 SigninManagerBase* signin_manager, |
85 OAuth2TokenService* token_service, | 86 OAuth2TokenService* token_service, |
86 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter, | 87 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter, |
87 PrefService* pref_service, | 88 PrefService* pref_service, |
88 translate::LanguageModel* language_model, | 89 translate::LanguageModel* language_model, |
89 const ParseJSONCallback& parse_json_callback, | 90 const ParseJSONCallback& parse_json_callback, |
90 const GURL& api_endpoint, | 91 const GURL& api_endpoint, |
91 const std::string& api_key, | 92 const std::string& api_key, |
92 const UserClassifier* user_classifier); | 93 const UserClassifier* user_classifier); |
93 ~RemoteSuggestionsFetcher() override; | 94 ~RemoteSuggestionsFetcher(); |
94 | 95 |
95 // Initiates a fetch from the server. When done (successfully or not), calls | 96 // Initiates a fetch from the server. When done (successfully or not), calls |
96 // the callback. | 97 // the callback. |
97 // | 98 // |
98 // If an ongoing fetch exists, both fetches won't influence each other (i.e. | 99 // If an ongoing fetch exists, both fetches won't influence each other (i.e. |
99 // every callback will be called exactly once). | 100 // every callback will be called exactly once). |
100 void FetchSnippets(const RequestParams& params, | 101 void FetchSnippets(const RequestParams& params, |
101 SnippetsAvailableCallback callback); | 102 SnippetsAvailableCallback callback); |
102 | 103 |
103 // Debug string representing the status/result of the last fetch attempt. | 104 // Debug string representing the status/result of the last fetch attempt. |
(...skipping 24 matching lines...) Expand all Loading... |
128 FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest, | 129 FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest, |
129 BuildRequestWithUILanguageOnly); | 130 BuildRequestWithUILanguageOnly); |
130 FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest, | 131 FRIEND_TEST_ALL_PREFIXES(ChromeReaderSnippetsFetcherTest, |
131 BuildRequestWithOtherLanguageOnly); | 132 BuildRequestWithOtherLanguageOnly); |
132 friend class ChromeReaderSnippetsFetcherTest; | 133 friend class ChromeReaderSnippetsFetcherTest; |
133 | 134 |
134 void FetchSnippetsNonAuthenticated(internal::JsonRequest::Builder builder, | 135 void FetchSnippetsNonAuthenticated(internal::JsonRequest::Builder builder, |
135 SnippetsAvailableCallback callback); | 136 SnippetsAvailableCallback callback); |
136 void FetchSnippetsAuthenticated(internal::JsonRequest::Builder builder, | 137 void FetchSnippetsAuthenticated(internal::JsonRequest::Builder builder, |
137 SnippetsAvailableCallback callback, | 138 SnippetsAvailableCallback callback, |
138 const std::string& account_id, | |
139 const std::string& oauth_access_token); | 139 const std::string& oauth_access_token); |
140 void StartRequest(internal::JsonRequest::Builder builder, | 140 void StartRequest(internal::JsonRequest::Builder builder, |
141 SnippetsAvailableCallback callback); | 141 SnippetsAvailableCallback callback); |
142 | 142 |
143 void StartTokenRequest(); | 143 void StartTokenRequest(); |
144 | 144 |
145 // OAuth2TokenService::Consumer overrides: | 145 void AccessTokenFetchFinished(const GoogleServiceAuthError& error, |
146 void OnGetTokenSuccess(const OAuth2TokenService::Request* request, | 146 const std::string& access_token); |
147 const std::string& access_token, | 147 void AccessTokenError(const GoogleServiceAuthError& error); |
148 const base::Time& expiration_time) override; | |
149 void OnGetTokenFailure(const OAuth2TokenService::Request* request, | |
150 const GoogleServiceAuthError& error) override; | |
151 | |
152 // OAuth2TokenService::Observer overrides: | |
153 void OnRefreshTokenAvailable(const std::string& account_id) override; | |
154 | 148 |
155 void JsonRequestDone(std::unique_ptr<internal::JsonRequest> request, | 149 void JsonRequestDone(std::unique_ptr<internal::JsonRequest> request, |
156 SnippetsAvailableCallback callback, | 150 SnippetsAvailableCallback callback, |
157 std::unique_ptr<base::Value> result, | 151 std::unique_ptr<base::Value> result, |
158 internal::FetchResult status_code, | 152 internal::FetchResult status_code, |
159 const std::string& error_details); | 153 const std::string& error_details); |
160 void FetchFinished(OptionalFetchedCategories categories, | 154 void FetchFinished(OptionalFetchedCategories categories, |
161 SnippetsAvailableCallback callback, | 155 SnippetsAvailableCallback callback, |
162 internal::FetchResult status_code, | 156 internal::FetchResult status_code, |
163 const std::string& error_details); | 157 const std::string& error_details); |
164 | 158 |
165 bool JsonToSnippets(const base::Value& parsed, | 159 bool JsonToSnippets(const base::Value& parsed, |
166 FetchedCategoriesVector* categories, | 160 FetchedCategoriesVector* categories, |
167 const base::Time& fetch_time); | 161 const base::Time& fetch_time); |
168 | 162 |
169 // Authentication for signed-in users. | 163 // Authentication for signed-in users. |
170 SigninManagerBase* signin_manager_; | 164 SigninManagerBase* signin_manager_; |
171 OAuth2TokenService* token_service_; | 165 OAuth2TokenService* token_service_; |
172 std::unique_ptr<OAuth2TokenService::Request> oauth_request_; | |
173 bool waiting_for_refresh_token_ = false; | |
174 | 166 |
175 // When a token request gets canceled, we want to retry once. | 167 std::unique_ptr<AccessTokenFetcher> token_fetcher_; |
176 bool oauth_token_retried_ = false; | |
177 | 168 |
178 // Holds the URL request context. | 169 // Holds the URL request context. |
179 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; | 170 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; |
180 | 171 |
181 // Stores requests that wait for an access token. | 172 // Stores requests that wait for an access token. |
182 std::queue< | 173 std::queue< |
183 std::pair<internal::JsonRequest::Builder, SnippetsAvailableCallback>> | 174 std::pair<internal::JsonRequest::Builder, SnippetsAvailableCallback>> |
184 pending_requests_; | 175 pending_requests_; |
185 | 176 |
186 // Weak reference, not owned. | 177 // Weak reference, not owned. |
(...skipping 16 matching lines...) Expand all Loading... |
203 // Info on the last finished fetch. | 194 // Info on the last finished fetch. |
204 std::string last_status_; | 195 std::string last_status_; |
205 std::string last_fetch_json_; | 196 std::string last_fetch_json_; |
206 | 197 |
207 DISALLOW_COPY_AND_ASSIGN(RemoteSuggestionsFetcher); | 198 DISALLOW_COPY_AND_ASSIGN(RemoteSuggestionsFetcher); |
208 }; | 199 }; |
209 | 200 |
210 } // namespace ntp_snippets | 201 } // namespace ntp_snippets |
211 | 202 |
212 #endif // COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ | 203 #endif // COMPONENTS_NTP_SNIPPETS_REMOTE_REMOTE_SUGGESTIONS_FETCHER_H_ |
OLD | NEW |