| // Copyright 2019 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 CHROME_BROWSER_CHROMEOS_ANDROID_SMS_FCM_CONNECTION_ESTABLISHER_H_ |
| #define CHROME_BROWSER_CHROMEOS_ANDROID_SMS_FCM_CONNECTION_ESTABLISHER_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/memory/weak_ptr.h" |
| #include "base/timer/timer.h" |
| #include "chrome/browser/chromeos/android_sms/connection_establisher.h" |
| |
| namespace chromeos { |
| |
| namespace android_sms { |
| |
| // ConnectionEstablisher implementation that initiates an FCM web push |
| // suscription frin the Android Messages for Web service worker and the |
| // Tachyon server by dispatching a known message string to it. |
| class FcmConnectionEstablisher : public ConnectionEstablisher { |
| public: |
| explicit FcmConnectionEstablisher( |
| std::unique_ptr<base::OneShotTimer> retry_timer); |
| ~FcmConnectionEstablisher() override; |
| |
| // ConnectionEstablisher: |
| void EstablishConnection( |
| const GURL& url, |
| ConnectionMode connection_mode, |
| content::ServiceWorkerContext* service_worker_context) override; |
| |
| void TearDownConnection( |
| const GURL& url, |
| content::ServiceWorkerContext* service_worker_context) override; |
| |
| private: |
| // This enum is used for logging metrics. It should be kept in sync with |
| // AndroidSmsFcmMessageType in enums.xml |
| enum class MessageType { |
| kStart = 0, |
| kResume = 1, |
| kStop = 2, |
| kMaxValue = kStop, |
| }; |
| friend std::ostream& operator<<(std::ostream& stream, |
| const MessageType& message_type); |
| |
| struct PendingServiceWorkerMessage { |
| PendingServiceWorkerMessage( |
| GURL service_worker_scope, |
| MessageType message_type, |
| content::ServiceWorkerContext* service_worker_context); |
| GURL service_worker_scope; |
| MessageType message_type; |
| content::ServiceWorkerContext* service_worker_context; |
| }; |
| |
| struct InFlightMessage { |
| explicit InFlightMessage(PendingServiceWorkerMessage message); |
| PendingServiceWorkerMessage message; |
| size_t retry_count = 0u; |
| }; |
| |
| FRIEND_TEST_ALL_PREFIXES(FcmConnectionEstablisherTest, |
| TestEstablishConnection); |
| FRIEND_TEST_ALL_PREFIXES(FcmConnectionEstablisherTest, |
| TestTearDownConnection); |
| |
| static MessageType GetMessageTypeForConnectionMode( |
| ConnectionMode connection_mode); |
| |
| static std::string GetMessageStringForType(MessageType message_type); |
| |
| void SendMessageToServiceWorkerWithRetries( |
| const GURL& url, |
| MessageType message_type, |
| content::ServiceWorkerContext* service_worker_context); |
| |
| void ProcessMessageQueue(); |
| |
| void SendInFlightMessage(); |
| |
| void OnMessageDispatchResult(bool status); |
| |
| std::unique_ptr<base::OneShotTimer> retry_timer_; |
| base::Optional<InFlightMessage> in_flight_message_; |
| |
| // A queue of messages to be dispatched. Messages are dispatched and retried |
| // one at a time from this queue. |
| base::queue<PendingServiceWorkerMessage> message_queue_; |
| |
| static const char kStartFcmMessage[]; |
| static const char kResumeFcmMessage[]; |
| static const char kStopFcmMessage[]; |
| static const int kMaxRetryCount; |
| static const base::TimeDelta kRetryDelay; |
| |
| base::WeakPtrFactory<FcmConnectionEstablisher> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FcmConnectionEstablisher); |
| }; |
| |
| } // namespace android_sms |
| |
| } // namespace chromeos |
| |
| #endif // CHROME_BROWSER_CHROMEOS_ANDROID_SMS_FCM_CONNECTION_ESTABLISHER_H_ |