Skip to content

handling notebook_loaded.Notebook events correctly #885

@jcb91

Description

@jcb91

As discussed in #879, sometimes (particularly with big notebooks, slow connections, etc), nbextensions get loaded before the notebook has finished loading. In other cases, the notebook may have fully loaded before the nbextension gets loaded, so the nbextension will miss the notebook_loaded.Notebook event. Finally, the event is fired again as part of loading checkpoints, so it's not necessarily a one-time-only event! Nbextension code should be able to deal with any of these three scenarios.

The best way to approach this and still get any initialization which needs to be applied to the whole notebook performed correctly seems to be:

  1. make sure any whole-notebook initialization function can be called multiple times without causing problems like duplicating html elements, etc.
  2. bind the initialization function to the notebook_loaded.Notebook event, so that it gets re-initialized correctly whenever the notebook is (re)loaded
  3. As part of the load_ipython_extension function used to load the nbextension, check if Jupyter.notebook._fully_loaded === true, which indicates we missed the first notebook_loaded.Notebook event. If this is true, call the initialization function(s) mentioned in 1 directly

I've had a quick skim through our nbextensions looking for ones which may need their loading behaviour altered, and come up with the following lists:

The following need updates to handle loading correctly:

These I'm uncertain about:

These seem to run at least some code without load_ipython_extension
being called, which I don't think is supposed to happen, so perhaps need a bit
of reworking:

These haven't even been updated to notebook 4.x, so should either be updated or removed:

These already use the correct approach:

  • autoscroll
  • collapsible_headings
  • init_cell
  • nbTranslate
  • toc2

And these don't need notebook loaded to initialize:

  • addbefore
  • autosavetime
  • chrome-clipboard
  • code_font_size
  • code_prettify
  • comment-uncomment
  • contrib_nbextensions_help_item
  • css_selector
  • datestamper
  • dragdrop
  • equation-numbering
  • gist_it
  • help_panel
  • hide_header
  • hinterland
  • keyboard_shortcut_editor
  • limit_output
  • navigation-hotkeys
  • nbTranslate
  • nbviewer_theme
  • no_exec_dunder
  • notify
  • printview
  • qtconsole
  • rubberband
  • runtools
  • scratchpad
  • search-replace
  • select_keymap
  • skill
  • snippets_menu
  • snippets
  • spellchecker
  • toc2
  • toggle_all_line_numbers
  • tree-filter
  • zenmode

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions