Electron Version: 7.1.1
Operating System: Windows 10 (1803)

If I set the 'margins' option when call webContents.print method,
The app will crash with no error message.

```js
let { remote } = require("electron");
let webContents = remote.getCurrentWebContents();
webContents.print(
  {
    margins: {
      marginType: "custom",
      top: 30,
      bottom: 0,
      left: 0,
      right: 0
    }
  },
  (success, errorType) => {
    if (!success) console.log(errorType);
  }
);
```

shell/browser/api/electron_api_web_contents.cc
IPC_MESSAGE_HANDLER_CODE(WidgetHostMsg_SetCursor, OnCursorChange,
                             handled = false)
    IPC_MESSAGE_UNHANDLED(handled = false)
  IPC_END_MESSAGE_MAP()
  return handled;
}
// There are three ways of destroying a ws:
// 1. call ws.destroy();
// 2. garbage collection;
// 3. user closes the window of ws;
// 4. the embedder detaches the frame.
// For webview only #4 will happen, for BrowserWindow both #1 and #3 may
// happen. The #2 should never happen for ws, because webview is
// managed by GuestViewManager, and BrowserWindow's ws is managed
// by api::BrowserWindow.
// For #1, the destructor will do the cleanup work and we only need to make
// sure "destroyed" event is emitted. For #3, the content::Ws will
// be destroyed on close, and WsDestroyed would be called for it, so
// we need to make sure the api::Ws is also deleted.
// For #4, the Ws will be destroyed by embedder.
void Ws::WsDestroyed() {
  // Cleanup relationships with other parts.
  RemoveFromWeakMap();
  // We can not call Destroy here because we need to call Emit first, but we
  // also do not want any method to be used, so just mark as destroyed here.
  MarkDestroyed();
  Emit("destroyed");
  // For guest view based on OOPIF, the Ws is released by the embedder
  // frame, and we need to clear the reference to the memory.
  if (IsGuest() && managed_ontents()) {