// 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.

module content.mojom;

import "content/public/common/push_messaging_status.mojom";
import "url/mojo/url.mojom";

// TODO(heke): The type-mapping struct and enums are duplicately defined. Need
// to remove/replace those defined in content or blink namespace.

struct PushSubscriptionOptions {
  bool user_visible_only;
  string sender_info;
};

enum PushErrorType {
  ABORT = 0,
  NETWORK = 1,
  NONE = 2,
  NOT_ALLOWED = 3,
  NOT_FOUND = 4,
  NOT_SUPPORTED = 5,
  INVALID_STATE = 6,
  LAST = INVALID_STATE
};

interface PushMessaging {
  Subscribe(int32 render_frame_id,
            int64 service_worker_registration_id,
            PushSubscriptionOptions options,
            bool user_gesture)
           => (PushRegistrationStatus status,
               url.mojom.Url? endpoint,
               PushSubscriptionOptions? options,
               array<uint8>? p256dh,
               array<uint8>? auth);

  // We use the value of |error_type| as a flag. If |error_type| == NONE, it
  // means no error and returns |did_unsubscribe|. Else, it means there is an
  // error and returns |error_type| and |error_message|.
  Unsubscribe(int64 service_worker_registration_id)
             => (PushErrorType error_type,
                 bool did_unsubscribe,
                 string? error_message);

  GetSubscription(int64 service_worker_registration_id)
                 => (PushGetRegistrationStatus status,
                     url.mojom.Url? endpoint,
                     PushSubscriptionOptions? options,
                     array<uint8>? p256dh,
                     array<uint8>? auth);
};
