// 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/appcache_info.mojom";
import "url/mojom/url.mojom";
import "services/network/public/mojom/url_loader_factory.mojom";

enum AppCacheEventID {
  APPCACHE_CHECKING_EVENT,
  APPCACHE_ERROR_EVENT,
  APPCACHE_NO_UPDATE_EVENT,
  APPCACHE_DOWNLOADING_EVENT,
  APPCACHE_PROGRESS_EVENT,
  APPCACHE_UPDATE_READY_EVENT,
  APPCACHE_CACHED_EVENT,
  APPCACHE_OBSOLETE_EVENT,
};

enum AppCacheErrorReason {
  APPCACHE_MANIFEST_ERROR,
  APPCACHE_SIGNATURE_ERROR,
  APPCACHE_RESOURCE_ERROR,
  APPCACHE_CHANGED_ERROR,
  APPCACHE_ABORT_ERROR,
  APPCACHE_QUOTA_ERROR,
  APPCACHE_POLICY_ERROR,
  APPCACHE_UNKNOWN_ERROR,
};

struct AppCacheResourceInfo {
  url.mojom.Url url;
  int64 size;
  bool is_master;
  bool is_manifest;
  bool is_intercept;
  bool is_fallback;
  bool is_foreign;
  bool is_explicit;
  int64 response_id;
};

struct AppCacheErrorDetails {
  string message;
  AppCacheErrorReason reason = APPCACHE_UNKNOWN_ERROR;
  url.mojom.Url url;
  int32 status;
  bool is_cross_origin;
};


// AppCache messages sent from the child process to the browser.
interface AppCacheBackend {
  // Informs the browser of a new appcache host.
  RegisterHost(int32 host_id);

  // Informs the browser of an appcache host being destroyed.
  UnregisterHost(int32 host_id);

  // Informs the browser of which host caused another to be created.
  // This can influence which appcache should be utilized for the main
  // resource load into the newly created host, so it should be sent
  // prior to the main resource request being initiated.
  SetSpawningHostId(int32 host_id, int32 spawning_host_id);

  // Initiates the cache selection algorithm for the given host.
  // This is sent prior to any subresource loads. An AppCacheMsg_CacheSelected
  // message will be sent in response.
  // 'host_id' indentifies a specific document or worker
  // 'document_url' the url of the main resource
  // 'appcache_document_was_loaded_from' the id of the appcache the main
  //     resource was loaded from or kAppCacheNoCacheId
  // 'opt_manifest_url' the manifest url specified in the <html> tag if any
  SelectCache(int32 host_id,
              url.mojom.Url document_url,
              int64 appcache_document_was_loaded_from,
              url.mojom.Url opt_manifest_url);

  // Initiates worker specific cache selection algorithm for the given host.
  SelectCacheForSharedWorker(int32 host_id, int64 appcache_id);

  // Informs the browser of a 'foreign' entry in an appcache.
  MarkAsForeignEntry(int32 host_id,
                     url.mojom.Url document_url,
                     int64 appcache_document_was_loaded_from);

  // Returns the status of the appcache associated with host_id.
  [Sync]
  GetStatus(int32 host_id) => (AppCacheStatus status);

  // Initiates an update of the appcache associated with host_id.
  [Sync]
  StartUpdate(int32 host_id) => (bool success);

  // Swaps a new pending appcache, if there is one, into use for host_id.
  [Sync]
  SwapCache(int32 host_id) => (bool success);

  // Gets resource list from appcache synchronously.
  [Sync]
  GetResourceList(int32 host_id) => (array<AppCacheResourceInfo> resources);
};

// AppCache messages sent from the browser to the renderer process.
interface AppCacheFrontend {
  // Notifies the renderer of the appcache that has been selected for a
  // a particular host. This is sent in reply to AppCacheHostMsg_SelectCache.
  CacheSelected(int32 host_id, AppCacheInfo info);

  // Notifies the renderer of an AppCache status change.
  StatusChanged(array<int32> host_ids, AppCacheStatus status);

  // Notifies the renderer of an AppCache event other than the
  // progress event which has a seperate message.
  EventRaised(array<int32> host_ids, AppCacheEventID event_id);

  // Notifies the renderer of an AppCache progress event.
  ProgressEventRaised(array<int32> host_ids,
                      url.mojom.Url url,
                      int32 total,
                      int32 complete);

  // Notifies the renderer of an AppCache error event.
  ErrorEventRaised(array<int32> host_ids, AppCacheErrorDetails error_details);

  // Notifies the renderer of an AppCache logging message.
  LogMessage(int32 host_id, int32 log_level, string message);

  // Notifies the renderer of the fact that AppCache access was blocked.
  ContentBlocked(int32 host_id, url.mojom.Url manifest_url);

  // In the network service world this message sets the URLLoaderFactory to be
  // used for subresources.
  SetSubresourceFactory(int32 host_id,
                        network.mojom.URLLoaderFactory url_loader_factory);
};

