// Copyright (c) 2012 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.

// developerPrivate API.
// This is a private API exposing developing and debugging functionalities for
// apps and extensions.
namespace developerPrivate {

  enum ItemType {
    hosted_app,
    packaged_app,
    legacy_packaged_app,
    extension,
    theme
  };

  dictionary ItemInspectView {
    // path to the inspect page.
    DOMString path;

    // For lazy background pages, the value is -1.
    long render_process_id;

    long render_view_id;
    boolean incognito;
    boolean generatedBackgroundPage;
  };

  dictionary InstallWarning {
    DOMString message;
  };

  dictionary ItemInfo {
    DOMString id;
    DOMString name;
    DOMString version;
    DOMString description;
    boolean may_disable;
    boolean enabled;
    DOMString? disabled_reason;
    boolean isApp;
    ItemType type;
    boolean allow_activity;
    boolean allow_file_access;
    boolean wants_file_access;
    boolean incognito_enabled;
    boolean is_unpacked;
    boolean allow_reload;
    boolean terminated;
    boolean allow_incognito;
    DOMString icon_url;

    // Path of an unpacked extension.
    DOMString? path;

    // Options settings page for the item.
    DOMString? options_url;
    DOMString? app_launch_url;
    DOMString? homepage_url;
    DOMString? update_url;
    InstallWarning[] install_warnings;
    boolean offline_enabled;

    // All views of the current extension.
    ItemInspectView[] views;
  };

  dictionary InspectOptions {
    DOMString extension_id;
    DOMString render_process_id;
    DOMString render_view_id;
    boolean incognito;
  };

  enum PackStatus {
    SUCCESS,
    ERROR,
    WARNING
  };

  enum FileType {
    LOAD,
    PEM
  };

  enum SelectType {
    FILE,
    FOLDER
  };

  enum EventType {
    INSTALLED,
    UNINSTALLED,
    LOADED,
    UNLOADED,
    // New window / view opened.
    VIEW_REGISTERED,
    // window / view closed.
    VIEW_UNREGISTERED
  };

  dictionary PackDirectoryResponse {
    // The response message of success or error.
    DOMString message;

    // Unpacked items's path.
    DOMString item_path;

    // Permanent key path.
    DOMString pem_path;

    long override_flags;
    PackStatus status;
  };

  dictionary ProjectInfo {
    DOMString name;
  };

  dictionary EventData {
    EventType event_type;
    DOMString item_id;
  };

  callback VoidCallback = void ();
  callback BooleanCallback = void (boolean result);
  callback ItemsInfoCallback = void (ItemInfo[] result);
  callback GetStringsCallback = void (object result);
  callback GetProjectsInfoCallback = void (ProjectInfo[] result);
  callback PathCallback = void (DOMString path);
  callback PackCallback = void (PackDirectoryResponse response);
  callback VoidCallback = void();

  interface Functions {
    // Runs auto update for extensions and apps immediately.
    // |callback| : Called with the boolean result, true if autoUpdate is
    // successful.
    static void autoUpdate(BooleanCallback callback);

    // Returns information of all the extensions and apps installed.
    // |include_disabled| : include disabled items.
    // |include_terminated| : include terminated items.
    // |callback| : Called with items info.
    static void getItemsInfo(boolean include_disabled,
                             boolean include_terminated,
                             ItemsInfoCallback callback);

    // Opens a permissions dialog for given |itemId|.
    static void showPermissionsDialog(DOMString itemId,
                                      optional VoidCallback callback);

    // Opens an inspect window for given |options|
    static void inspect(InspectOptions options,
                        optional VoidCallback callback);

    // Enable / Disable file access for a given |item_id|
    static void allowFileAccess(DOMString item_id,
                                boolean allow,
                                optional VoidCallback callback);

    // Reloads a given item with |itemId|.
    static void reload(DOMString itemId, optional VoidCallback callback);

    // Enable / Disable a given item with id |itemId|.
    static void enable(DOMString itemId,
                       boolean enable,
                       optional VoidCallback callback);

    // Allow / Disallow item with |item_id| in incognito mode.
    static void allowIncognito(DOMString item_id,
                               boolean allow,
                               VoidCallback callback);

    // Load a user selected unpacked item
    static void loadUnpacked(optional VoidCallback callback);

    // Copies the syncfs folder for the extension to local disk.
    static void exportSyncfsFolderToLocalfs(DOMString folder_name,
                                            optional VoidCallback callback);

    // Loads the unpacked app / extension.
    // |callback| called with itemId of the loaded item.
    static void loadProject(DOMString project_name,
                            PathCallback callback);

    // Open Dialog to browse to an entry.
    // |select_type| : Select a file or a folder.
    // |file_type| : Required file type. For Example pem type is for private
    // key and load type is for an unpacked item.
    // |callback| : called with selected item's path.
    static void choosePath(SelectType select_type,
                           FileType file_type,
                           PathCallback callback);

    // Pack an item with given |path| and |private_key_path|
    // |callback| : called with the success result string.
    static void packDirectory(DOMString path,
                              DOMString private_key_path,
                              long flags,
                              PackCallback callback);

    // Gets localized translated strings for apps_debugger. It returns the
    // strings as a dictionary mapping from string identifier to the
    // translated string to use in the apps_debugger app UI.
    static void getStrings(GetStringsCallback callback);

    // Returns true if the profile is managed.
    static void isProfileManaged(BooleanCallback callback);
  };

  interface Events {
    // Fired when a item state is changed.
    static void onItemStateChanged(EventData response);
  };

};