Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 0b875224e976587c77b3a9a9e8d0cd4992f94376
      
https://github.com/WebKit/WebKit/commit/0b875224e976587c77b3a9a9e8d0cd4992f94376
  Author: Devin Rousso <[email protected]>
  Date:   2023-05-17 (Wed, 17 May 2023)

  Changed paths:
    M Source/WebInspectorUI/UserInterface/Views/Popover.js

  Log Message:
  -----------
  Web Inspector: more then one popover can be displayed in the same time
https://bugs.webkit.org/show_bug.cgi?id=253557
<rdar://problem/106741263>

Reviewed by Patrick Angle.

Because all `WI.Popover` shared the same `<canvas>` for drawing the background, 
a second `WI.Popover` being shown would change the background of the first 
`WI.Popover`.

This fix has two parts.

1) Programmatically enforce that there can only be one `WI.Popver` "visible" at 
a time. Note that "visible" is defined by `WI.Popover.prototype.get visible` 
(i.e. attached to the DOM *and* not actively being dismissed). If a second 
`WI.Popover` is shown, `dismiss` the first `WI.Popover`. This prevents the two 
`WI.Popover` from overlapping (though there is a brief period where both can be 
visible while the first `WI.Popover` transitions to full transparency, but this 
is a better UX).

2) Instead of having a single globally shared `<canvas>`, have a global pool of 
`<canvas>` that are shared by all `WI.Popover`. When a `WI.Popover` is shown, 
it removes any `<canvas>` from the pool and uses it until it's `dismiss`. Note 
that if a second `WI.Popover` is shown during this time, another `<canvas>` 
will be created as the first `WI.Popover` would have removed the only 
`<canvas>` in the global pool of `<canvas>`. In order to avoid keeping that 
second `<canvas>` alive forever (since it would sit in the global pool of 
`<canvas>` until a second `WI.Popover` used it), each `<canvas>` in the global 
pool of `<canvas>` is wrapped in a `WeakRef`, so the worst that could happen is 
an empty `WeakRef` being kept alive.

With both of these, we now have a more ideal experience where
- only one `WI.Popover` will be "visible" at a time, such that a second 
`WI.Popover` being shown will `dismiss` the first `WI.Popover`
- if two `WI.Popover` are actually visible at the same time, each will have 
their own `<canvas>`, ensuring neither clobbers the background of the other

* Source/WebInspectorUI/UserInterface/Views/Popover.js:
(WI.Popover):
(WI.Popover.prototype.dismiss):
(WI.Popover.prototype.handleEvent):
(WI.Popover.prototype._drawBackground):
(WI.Popover.prototype._drawFrame):
(WI.Popover._getCanvasContext): Deleted.

Canonical link: https://commits.webkit.org/264159@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to