// 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 chrome.mojom;

import "content/public/common/webplugininfo.mojom";
import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "url/mojom/origin.mojom";
import "url/mojom/url.mojom";


// Plugin messages sent from renderer to the host.
interface PluginHost {
  // Tells the browser to show the Flash permission bubble in the same tab.
  ShowFlashPermissionBubble();

  // Tells the browser that there was an error loading a plugin.
  CouldNotLoadPlugin(mojo_base.mojom.FilePath file_path);

  // Notifies when a plugin couldn't be loaded because it's outdated.
  BlockedOutdatedPlugin(PluginRenderer plugin_renderer,
                        string group_id);

  // Notifies when a plugin couldn't be loaded because it requires a
  // component update.
  BlockedComponentUpdatedPlugin(PluginRenderer plugin_renderer,
                                string group_id);

};

// Plugin messages sent from renderer to the host requiring user auth actions.
interface PluginAuthHost {
  // Notifies when a plugin couldn't be loaded because it requires
  // user authorization.
  BlockedUnauthorizedPlugin(mojo_base.mojom.String16 name, string group_id);
};

// These are only used internally, so the order does not matter.
enum PluginStatus {
  kAllowed,
  // Plugin is blocked, but still can be manually loaded via context menu.
  kBlocked,
  // Plugin is blocked by policy, so it cannot be manually loaded.
  kBlockedByPolicy,
  // Plugin is blocked, and cannot be manually loaded via context menu.
  kBlockedNoLoading,
  kComponentUpdateRequired,
  kDisabled,
  // Flash is blocked, but user can click on the placeholder to trigger the
  // Flash permission prompt.
  kFlashHiddenPreferHtml,
  kNotFound,
  kOutdatedBlocked,
  kOutdatedDisallowed,
  kPlayImportantContent,
  kRestartRequired,
  kUnauthorized,
};

struct PluginInfo {
  PluginStatus status;
  content.mojom.WebPluginInfo plugin;
  string actual_mime_type;
  string group_identifier;
  mojo_base.mojom.String16 group_name;
};

struct PluginParam {
  mojo_base.mojom.String16 name;
  mojo_base.mojom.String16 value;
};

interface PluginInfoHost {
  // Return information about a plugin for the given URL and MIME type.
  // Includes specific reasons why a plugin can't be used, for example because
  // it's disabled.
  [Sync]
  GetPluginInfo(int32 render_frame_id,
                url.mojom.Url url,
                url.mojom.Origin origin,
                string mime_type) => (PluginInfo plugin_info);
};

// Plugin messages sent from a host to the renderer.
interface PluginRenderer {

  // Notifies a missing plugin placeholder that we have finished downloading
  // the plugin.
  FinishedDownloading();

  // Notifies a missing plugin placeholder that we have finished component-
  // updating the plug-in.
  UpdateSuccess();

  // Notifies a missing plugin placeholder that we have failed to
  // component-update the plug-in.
  UpdateFailure();

  // Notifies a missing plugin placeholder that we have started the component
  // download.
  UpdateDownloading();
};
