- Electron version: 1.2.1
- Operating system: Mac OS X

See also https://github.com/electron/electron/issues/5714

STR:
1. Start a webserver on localhost:port that serves a dummy index.html
2. Register a custom http protocol.
   
   ``` js
   electron.protocol.registerStandardSchemes(['foobar', 'http', 'https']);
   
   app.on('ready', function() {
     electron.protocol.registerHttpProtocol('foobar', (request, callback) => {
       const redirectPath = `http://localhost:port/index.html`;
       callback({ method: request.method, referrer: request.referrer, url: redirectPath });
     }, e => { if (e) { console.log(e); } });
   });
   ```
3. Either through devtools, or via some js in our index.html, have a single line that does `fetch('http://localhost:port/index.html')` or anything else from our server.

Results: as soon as `fetch` is called, the webview becomes black, and the devtools crash if they were open. No other visible error or stdout.

If devtools were open, they show this message: "Devtools was disconnected from the page.
Once page is reloaded, DevTools will automatically reconnect."

atom/browser/api/atom_api_protocol.cc
const BooleanCallback& callback) {
  content::BrowserThread::PostTaskAndReplyWithResult(
      content::BrowserThread::IO, FROM_HERE,
      base::Bind(&Protocol::IsProtocolHandledInIO,
                 base::Unretained(this), scheme),
      callback);
}
bool Protocol::IsProtocolHandledInIO(const std::string& scheme) {
  return job_factory_->IsHandledProtocol(scheme);
}
void Protocol::UninterceptProtocol(
    const std::string& scheme, mate::Arguments* args) {
  CompletionCallback callback;
  args->GetNext(&callback);
  content::BrowserThread::PostTaskAndReplyWithResult(
      content::BrowserThread::IO, FROM_HERE,
      base::Bind(&Protocol::UninterceptProtocolInIO,
                 base::Unretained(this), scheme),
      base::Bind(&Protocol::OnIOCompleted,
                 base::Unretained(this), callback));
}
Protocol::ProtocolError Protocol::UninterceptProtocolInIO(
    const std::string& scheme) {
  if (!original_protocols_.contains(scheme))
    return PROTOCOL_NOT_INTERCEPTED;
  job_factory_->ReplaceProtocol(scheme,
                                original_protocols_.take_and_erase(scheme));
  return PROTOCOL_OK;
}
void Protocol::OnIOCompleted(