• Robert Knight's avatar
    Explicitly specify guest/sidebar frames to ping in `startDiscovery` · 3dd8144a
    Robert Knight authored
    The logic used by guest/host and sidebar frames to find each other in
    `Discovery#startDiscovery` relied on traversing the frame tree starting
    from `window.top` using `window.frames`. Since `window.frames` doesn't
    include frames in shadow roots, this did not work if _both_ the guest and
    sidebar are contained within a shadow root. The sidebar is always
    contained in a shadow root created by the `<hypothesis-sidebar>`
    element, so this simplifies to only working if the guest/host is not
    contained in a shadow root.
    
    For current use cases it is possible for guest frames to get a direct
    reference to the sidebar frame they should be communicating with and for
    the sidebar to get direct a reference to the host frame (its parent).
    This avoids the need for `window.frames` traversal.
    
    This commit leverages that by changing `startDiscovery` to take an
    explicit array of frames to ping. Guest frames invoke `startDiscovery`
    passing a reference to the sidebar frame and sidebar frames invoke
    `startDiscovery` passing a reference to the parent (host) frame.
    
    This fixes the following scenarios:
    
     - Hypothesis not completing loading if host frame is contained within a
       shadow root. eg. In the VitalSource book reader.
    
     - Same-origin guest frames loading Hypothesis after the sidebar has
       already loaded. See http://localhost:3000/document/parent-frame test
       case in client dev server.
    
     - Multiple sidebars attempting to connect to the same guest frame, if
       Hypothesis is loaded multiple times in different parts of the frame
       tree. See http://localhost:3000/document/multi-frames test case in
       client dev server.
    
    This approach has some limitations:
    
     - Child guest frames which are not same-origin with the parent host frame
       are not supported.
     - Child guest frames which attempt to connect to the sidebar before it
       has loaded will fail to connect. This could be remedied by making the
       guest wait for confirmation of the sidebar having loaded before
       calling `connectToSidebar`. This doesn't affect the host frame since
       the sidebar pings that frame directly.
    
    These limitations are acceptable in the short term but will be remedied
    by a larger overhaul of inter-frame communication that is currently
    being worked on.
    3dd8144a
Name
Last commit
Last update
.github Loading commit data...
bin Loading commit data...
dev-server Loading commit data...
docs Loading commit data...
embedding-examples Loading commit data...
images Loading commit data...
requirements Loading commit data...
scripts Loading commit data...
src Loading commit data...
.babelrc Loading commit data...
.dockerignore Loading commit data...
.eslintignore Loading commit data...
.eslintrc Loading commit data...
.gitignore Loading commit data...
.npmignore Loading commit data...
.npmrc Loading commit data...
.prettierignore Loading commit data...
.python-version Loading commit data...
CODE_OF_CONDUCT Loading commit data...
Dockerfile Loading commit data...
Jenkinsfile Loading commit data...
LICENSE Loading commit data...
Makefile Loading commit data...
README.md Loading commit data...
codecov.yml Loading commit data...
gulpfile.js Loading commit data...
package.json Loading commit data...
pyproject.toml Loading commit data...
requirements-dev.in Loading commit data...
tox.ini Loading commit data...
tsconfig.json Loading commit data...
yarn.lock Loading commit data...