1. 02 Feb, 2022 5 commits
    • Robert Knight's avatar
      Only send annotations to matching frame · 0a1077b3
      Robert Knight authored
      When the sidebar is connected to multiple guest frames it will send all
      incoming annotations to all frames. The result is typically that the
      annotation will anchor in one frame and orphan in the others. Depending
      on what order this happens in, the annotation will non-deterministically
      show up as an Annotation or Orphan in the sidebar.
      
      In order to determine which frames an annotation should be sent to in
      all cases, we'd either need the backend to return information about which
      search URIs an annotation matches or make a separate search request for
      each frame and record the associated frame with the results. This
      will require some significant refactoring of the annotation search
      service.
      
      As an interim step, make `FrameSyncService` send annotations only to a
      single frame based on matching URL, with a fallback to sending to the
      main frame if there is no exact match. This will work as expected for
      most pages, and is at least deterministic when it does fail. When we
      have a solution for being able to match annotations to frames more
      generally, we can adapt this code to use it.
      
      This is a partial solution to https://github.com/hypothesis/client/issues/3992.
      0a1077b3
    • Robert Knight's avatar
    • Robert Knight's avatar
    • Robert Knight's avatar
    • Robert Knight's avatar
      Revise how guest notifies host and sidebar when it is unloaded · 4b021476
      Robert Knight authored
      Change how the guest notifies other frames, specifically the sidebar and host,
      when it is unloaded. The host and sidebar now receive a `frameDestroyed` message
      from the corresponding guest port, which allows them to easily close the right
      port and remove it from the list of active guest ports.
      
      Due to a Safari bug (see code comments) we can't send the `frameDestroyed`
      messages from the guest frame while it is being unloaded. However it is possible
      to first transfer the port to the host frame and then have the host frame send
      the message on the same port. I also tried sending the message from the guest
      frame, and then transferring the port to the host frame but that didn't work.
      This workaround has the advantage that it is transparent to the receiver of the
      `frameDestroyed` message.
      
      This change is also a step towards possibly not relying on user-provided guest
      frame identifiers in the sidebar, which only become available once the
      `documentInfoChanged` call has been received. Instead the sidebar could
      use its own internal IDs for guest frames, avoiding the possibility for
      conflicts.
      
      Changes in detail:
      
       - Add `disconnect` method to PortRPC
      
       - When guest is unloaded, transfer ports to the host frame in a
         `hypothesisGuestUnloaded` message, and make the host frame dispatch
         `frameDestroyed` calls on these ports.
      
       - Handle `frameDestroyed` in sidebar by closing port, removing it from
         the active guest list and removing the associated frame from the
         store
      
       - Handle `frameDestroyed` in host frame by closing port and removing it
         from the active guest list
      4b021476
  2. 01 Feb, 2022 15 commits
  3. 31 Jan, 2022 19 commits
  4. 28 Jan, 2022 1 commit