- Electron version: 1.1.3

The clipboard API docs are somewhat confusing, but it looks like you can only deal with plain text, RTF, HTML, and image data.

It would be great if I could define arbitrary data types. Ideally, multiple types in a single clipboard.write operator.

This is how the Javascript DOM clipboard API works, and Chromium supports it, so hopefully the capability can be exposed in Electron.

The call might look like

```
clipboard.write({
    text: "Textual representation",
    html: "<p>HTML representation</p>",
    "application/graph-editor": "<xml>...custom representation</xml>",
});
```

(The `type` arguments to all the calls describe the _clipboard_ type, not the data type. The only meaningful arguments are `undefined` and `"selection"`, as far as I can tell. Please let me know if I'm wrong about this.)

atom/common/api/atom_api_clipboard.cc
ui::ScopedClipboardWriter writer(GetClipboardType(args));
  writer.WriteRTF(text);
}
base::string16 Clipboard::ReadHtml(mate::Arguments* args) {
  base::string16 data;
  base::string16 html;
  std::string url;
  uint32_t start;
  uint32_t end;
  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  clipboard->ReadHTML(GetClipboardType(args), &html, &url, &start, &end);
  data = html.substr(start, end - start);
  return data;
}
void Clipboard::WriteHtml(const base::string16& html, mate::Arguments* args) {
  ui::ScopedClipboardWriter writer(GetClipboardType(args));
  writer.WriteHTML(html, std::string());
}
v8::Local<v8::Value> Clipboard::ReadBookmark(mate::Arguments* args) {
  base::string16 title;
  std::string url;
  mate::Dictionary dict = mate::Dictionary::CreateEmpty(args->isolate());
  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
  clipboard->ReadBookmark(&title, &url);
  dict.Set("title", title);
  dict.Set("url", url);
  return dict.GetHandle();
}
void Clipboard::WriteBookmark(const base::string16& title,