See https://github.com/electron/electron/blob/54ad38526095f4a415ad75a1757feae4336c9db4/atom/browser/atom_permission_manager.cc#L213 and https://github.com/electron/electron/blob/54ad38526095f4a415ad75a1757feae4336c9db4/atom/browser/atom_permission_manager.cc#L246

Should probably call out to https://github.com/electron/electron/blob/54ad38526095f4a415ad75a1757feae4336c9db4/atom/browser/atom_permission_manager.cc#L231 and be documented as such
shell/browser/electron_permission_manager.cc
const std::vector<content::PermissionType>& permissions,
    content::RenderFrameHost* render_frame_host,
    const GURL& requesting_origin,
    bool user_gesture,
    StatusesCallback response_callback) {
  return RequestPermissionsWithDetails(permissions, render_frame_host,
                                       requesting_origin, user_gesture, nullptr,
                                       std::move(response_callback));
}
int ElectronPermissionManager::RequestPermissionsWithDetails(
    const std::vector<content::PermissionType>& permissions,
    content::RenderFrameHost* render_frame_host,
    const GURL& requesting_origin,
    bool user_gesture,
    const base::DictionaryValue* details,
    StatusesCallback response_callback) {
  if (permissions.empty()) {
    std::move(response_callback).Run({});
    return content::PermissionController::kNoPendingOperation;
  }
  if (request_handler_.is_null()) {
    std::vector<blink::mojom::PermissionStatus> statuses;
    for (auto permission : permissions) {
      if (permission == content::PermissionType::MIDI_SYSEX) {
        content::ChildProcessSecurityPolicy::GetInstance()
            ->GrantSendMidiSysExMessage(
                render_frame_host->GetProcess()->GetID());