This logic doesn't really belong in ContentManager. It would be better to trigger an event, which is handled somewhere else. But there's no obvious place to put this event, so creating the error dialog inside the new_notebook method is ok for now.
Don't store notebook_path in ContentManager, because this sort of state (in addition to notebook_name) can change, and keeping track of this logic doesn't seem to be a part of the file management system. Instead, this logic can be left to the Notebook instance (and possible other places that manage it). This makes refactoring easier, and avoids having to replicate this logic in every implementation of ContentManager.
The websocket handler auth checking was calling clear_cookie(), which
threw an error because it doesn't make sense for Websockets. It doesn't
seem important, and we silence it in our other websocket handlers, so
silencing it here too.
- add debug statement at the very beginning of a web socket request
- add debug statement in open, indicating that the connection has been accepted
- add timeout, so failed or slow kernel_info doesn't cause the request to never get a response
- don't send kernel_info_request before authenticating the request
The last one required some icky coroutine shenanigans,
because of our subclass structure, but it should work fine.
This is required for e.g. Scala, where the mode is given as
text/x-scala, but the actual implementation is in clike mode.
This wouldn't be an issue, but IPython loads modes lazily, so
you need both mode name and MIME to resolve correct file and
configure CodeMirror.