**Is your feature request related to a problem? Please describe.**
The clipboard module depends on the remote module on Linux.

**Describe the solution you'd like**
It should be implemented using dedicated IPCs that are properly validated to avoid security issues.

**Describe alternatives you've considered**
The app can call the clipboard APIs in the main process in response to app-level IPCs from the renderer.

**Additional context**
Follow-up from https://github.com/electron/electron/pull/13028

atom/common/api/atom_api_native_image.cc
int width = 0;
  int height = 0;
  float scale_factor = 1.0f;
  options.Get("width", &width);
  options.Get("height", &height);
  options.Get("scaleFactor", &scale_factor);
  bool skia_rep_added = false;
  gfx::ImageSkia image_skia = image_.AsImageSkia();
  v8::Local<v8::Value> buffer;
  GURL url;
  if (options.Get("buffer", &buffer) && node::Buffer::HasInstance(buffer)) {
    AddImageSkiaRep(
        &image_skia,
        reinterpret_cast<unsigned char*>(node::Buffer::Data(buffer)),
        node::Buffer::Length(buffer), width, height, scale_factor);
    skia_rep_added = true;
  } else if (options.Get("dataURL", &url)) {
    std::string mime_type, charset, data;
    if (net::DataURL::Parse(url, &mime_type, &charset, &data)) {
      if (mime_type == "image/png" || mime_type == "image/jpeg") {
        AddImageSkiaRep(&image_skia,
                        reinterpret_cast<const unsigned char*>(data.c_str()),
                        data.size(), width, height, scale_factor);
        skia_rep_added = true;
      }
    }
  }