| // Copyright 2016 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_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_ |
| #define COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <set> |
| #include <string> |
| #include <utility> |
| |
| #include "base/macros.h" |
| #include "base/threading/thread_checker.h" |
| #include "components/data_reduction_proxy/proto/pageload_metrics.pb.h" |
| #include "net/url_request/url_fetcher_delegate.h" |
| #include "url/gurl.h" |
| |
| namespace base { |
| class Time; |
| } |
| |
| namespace net { |
| class URLFetcher; |
| class URLRequestContextGetter; |
| } |
| |
| namespace data_reduction_proxy { |
| class DataReductionProxyData; |
| struct DataReductionProxyPageLoadTiming; |
| |
| using NavigationID = std::pair<uint64_t, std::string>; |
| |
| // Manages pingbacks about page load timing information to the data saver proxy |
| // server. This class is not thread safe. |
| class DataReductionProxyPingbackClient : public net::URLFetcherDelegate { |
| public: |
| // The caller must ensure that |url_request_context| remains alive for the |
| // lifetime of the |DataReductionProxyPingbackClient| instance. |
| explicit DataReductionProxyPingbackClient( |
| net::URLRequestContextGetter* url_request_context); |
| ~DataReductionProxyPingbackClient() override; |
| |
| // Sends a pingback to the data saver proxy server about various timing |
| // information. |
| virtual void SendPingback(const DataReductionProxyData& data, |
| const DataReductionProxyPageLoadTiming& timing); |
| |
| // Sets the probability of actually sending a pingback to the server for any |
| // call to SendPingback. |
| void SetPingbackReportingFraction(float pingback_reporting_fraction); |
| |
| // Adds an opt out for |tab_identifier_key| for a data saver |page_id|. An opt |
| // out occurs when users dismiss the preview in favor of the full page. |
| void AddOptOut(const NavigationID& navigation_id); |
| |
| // Removes any stored data associated with |tab_identifier_key| in a task that |
| // runs later. |
| void ClearNavigationKeyAsync(const NavigationID& navigation_id); |
| |
| // The total number of pending loads being tracked due to opt outs. |
| size_t OptOutsSizeForTesting() const; |
| |
| protected: |
| // Generates a float in the range [0, 1). Virtualized in testing. |
| virtual float GenerateRandomFloat() const; |
| |
| // Returns the current time. Virtualized in testing. |
| virtual base::Time CurrentTime() const; |
| |
| private: |
| // URLFetcherDelegate implmentation: |
| void OnURLFetchComplete(const net::URLFetcher* source) override; |
| |
| // Whether a pingback should be sent. |
| bool ShouldSendPingback() const; |
| |
| // Creates an URLFetcher that will POST to |secure_proxy_url_| using |
| // |url_request_context_|. The max retries is set to 5. |
| // |data_to_send_| will be used to fill the body of the Fetcher, and will be |
| // reset to an empty RecordPageloadMetricsRequest. |
| void CreateFetcherForDataAndStart(); |
| |
| // Removes any stored data associated with |tab_identifier_key|. |
| void ClearNavigationKeySync(const NavigationID& navigation_id); |
| |
| net::URLRequestContextGetter* url_request_context_; |
| |
| // The URL for the data saver proxy's ping back service. |
| const GURL pingback_url_; |
| |
| // The currently running fetcher. |
| std::unique_ptr<net::URLFetcher> current_fetcher_; |
| |
| // Serialized data to send to the data saver proxy server. |
| RecordPageloadMetricsRequest metrics_request_; |
| |
| // The probability of sending a pingback to the server. |
| float pingback_reporting_fraction_; |
| |
| // The map of tab identifier keys to page IDs. |
| std::set<NavigationID> opt_outs_; |
| |
| base::ThreadChecker thread_checker_; |
| |
| DISALLOW_COPY_AND_ASSIGN(DataReductionProxyPingbackClient); |
| }; |
| |
| } // namespace data_reduction_proxy |
| |
| #endif // COMPONENTS_DATA_REDUCTION_PROXY_CORE_BROWSER_DATA_REDUCTION_PROXY_PINGBACK_CLIENT_H_ |