Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: d390171291c8e77d5d90ab818b200f5601f84c17
      
https://github.com/WebKit/WebKit/commit/d390171291c8e77d5d90ab818b200f5601f84c17
  Author: Aditya Keerthi <akeer...@apple.com>
  Date:   2023-05-11 (Thu, 11 May 2023)

  Changed paths:
    M Source/WebKit/UIProcess/mac/WebPageProxyMac.mm

  Log Message:
  -----------
  [macOS] `-[WKWebView acceptsFirstMouse:]` deadlocks when launching the GPU 
process
https://bugs.webkit.org/show_bug.cgi?id=256618
rdar://108567032

Reviewed by Wenson Hsieh.

Following the enablement of the GPU process on macOS, an increased number of
hangs are being observed in `-[WKWebView acceptsFirstMouse:]`.

`acceptsFirstMouse` synchronously waits on IPC from the Web process. This is
necessary as the return value depends on the web content that is being clicked
on, and the AppKit API is synchronous. Specifically, returning true allows the
user to click on a view in an inactive window and activate it with a single
click. Returning false means that the user would have to click twice: once to
make the window active, and then to interact with the web view. WebKit only
returns true when the event might begin a drag.

The deadlock observed here is similar to a deadlock that was observed on iOS,
and fixed in 252568@main. The Web process may be attempting to launch the GPU
process at the same time `RequestAcceptsFirstMouse` is received.  This results
in a sync wait under ``RemoteRenderingBackendProxy::DidInitialize`. While that
method allows for interruptions due to receiving sync messages, the
`RequestAcceptsFirstMouse` message itself is not sync, it is async, and paired
with `HandleAcceptsFirstMouse` (see 240322@main for more details on that 
design).

Similar to 252568@main, the UI process is then unable to initialize the GPU
process, since the message will be added to `m_pendingMessages` on
`AuxiliaryProcessProxy` while waiting for the GPU process to launch. These
messages are dispatched asynchronously, but there is no chance to do so, as the
UI process is waiting for `HandleAcceptsFirstMouse` from the blocked Web 
process.

To fix, simply return false from `acceptsFirstMouse` when the GPU process has
yet to be initialized. This is low risk, since there would not be any painted
content to interact with if the GPU process does not exist.

* Source/WebKit/UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::acceptsFirstMouse):

Leverage the helper method added 252568@main to detect this scenario.

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


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to