1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135

content / common / pepper_plugin.mojom [blame]

// Copyright 2020 The Chromium Authors
// 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/webplugininfo.mojom";
import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/process_id.mojom";
import "url/mojom/origin.mojom";
import "url/mojom/url.mojom";

// Generic Pepper messages. Implemented by the browser.
interface PepperHost {
  // Notification that a Pepper plugin instance is created in the DOM.
  InstanceCreated(int32 instance_id,
                  pending_associated_remote<PepperPluginInstance> instance,
                  pending_associated_receiver<PepperPluginInstanceHost> host);

  // Bind a PepperHungDetectorHost. The interface will be used to inform the
  // browser that a renderer's plugin module has been blocked for too long.
  BindHungDetectorHost(pending_receiver<PepperHungDetectorHost> host,
             int32 plugin_child_id,
             mojo_base.mojom.FilePath plugin_path);

  // Return information about a plugin for the given URL and MIME
  // type. If there is no matching plugin, |found| is false.
  // |actual_mime_type| is the actual mime type supported by the
  // found plugin.
  [Sync]
  GetPluginInfo(url.mojom.Url url,
                string mime_type) =>
               (bool found,
                content.mojom.WebPluginInfo plugin_info,
                string actual_mime_type);

  // Notification an in-process instance has been created.
  DidCreateInProcessInstance(int32 instance_id,
                             int32 frame_routing_id,
                             url.mojom.Url document_url,
                             url.mojom.Url plugin_url);

  // Notification that an in-process instance has been destroyed.
  DidDeleteInProcessInstance(int32 instance_id);

  // Notification that a plugin has created a new plugin instance. The
  // parameters indicate:
  //  - The plugin process ID that we're creating the instance for.
  //  - The instance ID of the instance being created.
  //  - A PepperRendererInstanceData struct which contains properties from the
  //    renderer which are associated with the plugin instance. This includes
  //    the routing ID of the associated RenderFrame and the URL of plugin.
  //  - Whether the plugin we're creating an instance for is external or
  //    internal.
  //
  // This message must be sync even though it returns no parameters to avoid
  // a race condition with the plugin process. The plugin process sends messages
  // to the browser that assume the browser knows about the instance. We need to
  // make sure that the browser actually knows about the instance before we tell
  // the plugin to run.
  [Sync]
  DidCreateOutOfProcessPepperInstance(int32 plugin_child_id,
                                      int32 pp_instance,
                                      bool is_external,
                                      int32 frame_routing_id,
                                      url.mojom.Url document_url,
                                      url.mojom.Url plugin_url,
                                      bool is_privileged_context) => ();

  // Notification that a plugin has destroyed an instance.
  DidDeleteOutOfProcessPepperInstance(int32 plugin_child_id,
                                      int32 pp_instance,
                                      bool is_external);

  // A renderer sends this to the browser process when it wants to create a
  // ppapi plugin.  The browser will create the plugin process if necessary,
  // and will return a handle to the channel on success.
  //
  // The plugin_child_id is the ChildProcessHost ID assigned in the browser
  // process. This ID is valid only in the context of the browser process and is
  // used to identify the proper process when the renderer notifies it that the
  // plugin is hung.
  //
  // |embedder_origin| provides the origin of the frame that embeds the plugin
  // (i.e. the origin of the document that contains the <embed> html tag).
  // |embedder_origin| needs to be included in the message payload, because the
  // message is received and handled on the IO thread in the browser process
  // (where it is not possible to consult
  // RenderFrameHostImpl::GetLastCommittedOrigin).
  //
  // On error null handles are returned.
  [Sync]
  OpenChannelToPepperPlugin(url.mojom.Origin embedder_origin,
                            mojo_base.mojom.FilePath path,
                            url.mojom.Origin? origin_lock) =>
                           (handle<message_pipe>? handle_to_channel,
                            mojo_base.mojom.ProcessId plugin_pid,
                            int32 plugin_child_id);
};

// This interface is used on the renderer IO thread and is received on the
// browser UI thread for determining an out of process pepper plugin container
// has not responded to the renderer for too long.
interface PepperHungDetectorHost {
  // Sent to the browser when the renderer detects it is blocked on a pepper
  // plugin message for too long. This is also sent when it becomes unhung
  // (according to the value of is_hung). The browser can give the user the
  // option of killing the plugin.
  PluginHung(bool is_hung);
};

// Plugin instance specific host messages that are sent from the renderer
// main thread and dispatched on the UI thread of the browser. Implemented by
// the browser.
interface PepperPluginInstanceHost {
  // Notification a plugin instance has started playback.
  StartsPlayback();

  // Notification a plugin instance has stopped playback.
  StopsPlayback();

  // Notification that a plugin instance has crashed.
  // Note: |plugin_pid| should not be trusted. The corresponding process has
  // probably died. Moreover, the ID may have been reused by a new process. Any
  // usage other than displaying it in a prompt to the user is very likely to be
  // wrong.
  InstanceCrashed(mojo_base.mojom.FilePath plugin_path,
                  mojo_base.mojom.ProcessId plugin_pid);
};

// Plugin instance specific messages. Implemented by the renderer.
interface PepperPluginInstance {
  // Set the volume of a plugin. |volume| should be in the [0, 1] range.
  SetVolume(double volume);
};