summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h')
-rw-r--r--chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h b/chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h
new file mode 100644
index 00000000000..631976003fc
--- /dev/null
+++ b/chromium/chrome/browser/push_messaging/push_messaging_app_identifier.h
@@ -0,0 +1,152 @@
+// Copyright 2014 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_PUSH_MESSAGING_PUSH_MESSAGING_APP_IDENTIFIER_H_
+#define CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_APP_IDENTIFIER_H_
+
+#include <stddef.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+
+#include "base/check.h"
+#include "base/gtest_prod_util.h"
+#include "base/time/time.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
+
+class Profile;
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+// The prefix used for all push messaging application ids.
+extern const char kPushMessagingAppIdentifierPrefix[];
+
+// Type used to identify a Service Worker registration from a Push API
+// perspective. These can be persisted to prefs, in a 1:1 mapping between
+// app_id (which includes origin) and service_worker_registration_id.
+// Legacy mapped values saved by old versions of Chrome are also supported;
+// these don't contain the origin in the app_id, so instead they map from
+// app_id to pair<origin, service_worker_registration_id>.
+class PushMessagingAppIdentifier {
+ public:
+ // Register profile-specific prefs.
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+ // Returns whether the modern InstanceID API should be used with this app_id
+ // (rather than legacy GCM registration).
+ static bool UseInstanceID(const std::string& app_id);
+
+ // Generates a new app identifier, with partially random app_id.
+ static PushMessagingAppIdentifier Generate(
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ const absl::optional<base::Time>& expiration_time = absl::nullopt);
+
+ // Looks up an app identifier by app_id. If not found, is_null() will be true.
+ static PushMessagingAppIdentifier FindByAppId(Profile* profile,
+ const std::string& app_id);
+
+ // Looks up an app identifier by origin & service worker registration id.
+ // If not found, is_null() will be true.
+ static PushMessagingAppIdentifier FindByServiceWorker(
+ Profile* profile,
+ const GURL& origin,
+ int64_t service_worker_registration_id);
+
+ // Returns all the PushMessagingAppIdentifiers currently registered for the
+ // given |profile|.
+ static std::vector<PushMessagingAppIdentifier> GetAll(Profile* profile);
+
+ // Deletes all PushMessagingAppIdentifiers currently registered for the given
+ // |profile|.
+ static void DeleteAllFromPrefs(Profile* profile);
+
+ // Returns the number of PushMessagingAppIdentifiers currently registered for
+ // the given |profile|.
+ static size_t GetCount(Profile* profile);
+
+ ~PushMessagingAppIdentifier();
+
+ // Persist this app identifier to prefs.
+ void PersistToPrefs(Profile* profile) const;
+
+ // Delete this app identifier from prefs.
+ void DeleteFromPrefs(Profile* profile) const;
+
+ // Returns true if this identifier does not represent an app (i.e. this was
+ // returned by a failed Find call).
+ bool is_null() const { return service_worker_registration_id_ < 0; }
+
+ // String that should be passed to push services like GCM to identify a
+ // particular Service Worker (so we can route incoming messages). Example:
+ // wp:https://foo.example.com:8443/#9CC55CCE-B8F9-4092-A364-3B0F73A3AB5F
+ // Legacy app_ids have no origin, e.g. wp:9CC55CCE-B8F9-4092-A364-3B0F73A3AB5F
+ const std::string& app_id() const {
+ DCHECK(!is_null());
+ return app_id_;
+ }
+
+ const GURL& origin() const {
+ DCHECK(!is_null());
+ return origin_;
+ }
+
+ int64_t service_worker_registration_id() const {
+ DCHECK(!is_null());
+ return service_worker_registration_id_;
+ }
+
+ void set_expiration_time(const absl::optional<base::Time>& expiration_time) {
+ expiration_time_ = expiration_time;
+ }
+
+ bool IsExpired() const;
+
+ absl::optional<base::Time> expiration_time() const {
+ DCHECK(!is_null());
+ return expiration_time_;
+ }
+
+ // Copy constructor
+ PushMessagingAppIdentifier(const PushMessagingAppIdentifier& other);
+
+ private:
+ friend class PushMessagingAppIdentifierTest;
+ friend class PushMessagingBrowserTestBase;
+ FRIEND_TEST_ALL_PREFIXES(PushMessagingAppIdentifierTest, FindLegacy);
+
+ // Generates a new app identifier for legacy GCM (not modern InstanceID).
+ static PushMessagingAppIdentifier LegacyGenerateForTesting(
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ const absl::optional<base::Time>& expiration_time = absl::nullopt);
+
+ static PushMessagingAppIdentifier GenerateInternal(
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ bool use_instance_id,
+ const absl::optional<base::Time>& expiration_time = absl::nullopt);
+
+ // Constructs an invalid app identifier.
+ PushMessagingAppIdentifier();
+ // Constructs a valid app identifier.
+ PushMessagingAppIdentifier(
+ const std::string& app_id,
+ const GURL& origin,
+ int64_t service_worker_registration_id,
+ const absl::optional<base::Time>& expiration_time = absl::nullopt);
+
+ // Validates that all the fields contain valid values.
+ void DCheckValid() const;
+
+ std::string app_id_;
+ GURL origin_;
+ int64_t service_worker_registration_id_;
+ absl::optional<base::Time> expiration_time_;
+};
+
+#endif // CHROME_BROWSER_PUSH_MESSAGING_PUSH_MESSAGING_APP_IDENTIFIER_H_