The best way to start a File-Drag for now, is the downloadURL as i know.

Like here in Nylas N1:
https://github.com/nylas/N1/blob/master/internal_packages/attachments/lib/attachment-component.cjsx#L67

But only Images and PDFs are able to Drop direct on an Application (MAC). Other file formats just can be copied to Folders.
I think I'm not the only one who is looking for a full native file drop and I think chromium offers that already.

On chrome://downloads/ its possible to Drag any File on an Application (Mac).

Is there maybe a way to access this Drag Function in electron or can it become a part of?
Multi File Drag would be very nice too! :)

[chrome://downloads/ > js dragstart > chrome.send('drag', id)](https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/resources/md_downloads/crisper.js&q=crisper.js&sq=package:chromium&type=cs&l=15751)

I have no knowledge, about cc++ but it found that... :D
[drag_download_item_views.cc](https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/download/drag_download_item_views.cc&q=DragDownloadItem&sq=package:chromium&dr=CSs&l=31)
[md_downloads_dom_handler.cc](https://chromium.googlesource.com/chromium/src.git/+/master/chrome/browser/ui/webui/md_downloads/md_downloads_dom_handler.cc)

atom/browser/api/atom_api_web_contents.h
void GoBack();
  void GoForward();
  void GoToOffset(int offset);
  bool IsCrashed() const;
  void SetUserAgent(const std::string& user_agent, mate::Arguments* args);
  std::string GetUserAgent();
  void InsertCSS(const std::string& css);
  bool SavePage(const base::FilePath& full_file_path,
                const content::SavePageType& save_type,
                const SavePageHandler::SavePageCallback& callback);
  void OpenDevTools(mate::Arguments* args);
  void CloseDevTools();
  bool IsDevToolsOpened();
  bool IsDevToolsFocused();
  void ToggleDevTools();
  void EnableDeviceEmulation(const blink::WebDeviceEmulationParams& params);
  void DisableDeviceEmulation();
  void InspectElement(int x, int y);
  void InspectServiceWorker();
  void HasServiceWorker(const base::Callback<void(bool)>&);
  void UnregisterServiceWorker(const base::Callback<void(bool)>&);
  void SetAudioMuted(bool muted);
  bool IsAudioMuted();
  void Print(mate::Arguments* args);
  
  void PrintToPDF(const base::DictionaryValue& setting,
                  const PrintToPDFCallback& callback);
  
  void AddWorkSpace(mate::Arguments* args, const base::FilePath& path);
  void RemoveWorkSpace(mate::Arguments* args, const base::FilePath& path);