Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 3583b2ac96f10694075cac1324cf5b14a41d77cb
      
https://github.com/WebKit/WebKit/commit/3583b2ac96f10694075cac1324cf5b14a41d77cb
  Author: Razvan Caliman <[email protected]>
  Date:   2023-12-12 (Tue, 12 Dec 2023)

  Changed paths:
    A LayoutTests/inspector/unit-tests/retryuntil-expected.txt
    A LayoutTests/inspector/unit-tests/retryuntil.html
    M Source/WebInspectorUI/UserInterface/Base/Utilities.js
    M 
Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js

  Log Message:
  -----------
  REGRESSION ( Sonoma?): [ Sonoma release ] 
TestWebKitAPI.WKInspectorExtension.EvaluateScriptOnPage is a consistent failure
https://bugs.webkit.org/show_bug.cgi?id=263447
rdar://117265270

Reviewed by Timothy Hatcher.

The API test loads a page from an URL, opens Web Inspector for it, registers a 
Web Inspector Web Extension
and immediately sends a request to evaluate some JavaScript in the main frame 
and subframes for that URL.

The test fails because of a race condition: the objects that represent the 
frame and execution context
within Web Inspector frontend are not necessarily available when the evaluation 
request comes in.

The missing objects result in early returns with error codes:
`WI.WebInspectorExtension.ErrorCode.InvalidRequest` or 
`WI.WebInspectorExtension.ErrorCode.ContextDestroyed`.

Fixing the race means waiting for the corresponding `WI.Frame` and 
`WI.ExecutionContext` instances
to be available before attempting to use them. A simple retry approach with a 
timeout works fine.

---

A `WI.Frame` is created in response to initializing an `InspectorPageAgent`
and receiving a response to the `getResourceTree()` command.

A `WI.ExecutionContext` is created asynchronously in response to the 
"executionContextCreated" event
dispatched by `PageRuntimeAgent`.

The test failed consistently on Release builds but not on Debug builds. The 
slower Debug builds likely gave
enough time for the Web Inspector frontend to be created and populated with the 
necessary objects.

---

Why is Web Inspector frontend involved in an Web Extensions API test? Good 
question!

The call to evaluate a script from a Web Inspector web extension in the page 
context goes down this path:

`WebInspectorUIExtensionController::evaluateScriptForExtension` (C++)
    -> `InspectorFrontendAPIDispatcher::dispatchCommandWithResultAsync()` (C++, 
Web Inspector backend)
        -> `WI.WebInspectorExtensionController.evaluateScriptForExtension()` 
(JS, Web Inspector frontend)
            -> `InspectorRuntimeAgent::evaluate()` (C++, Web Inspector backend)

The result of the evaluation gets ferried on the same route all the way back.

* LayoutTests/inspector/unit-tests/retryuntil.html: Added.
* LayoutTests/inspector/unit-tests/retryuntil-expected.txt: Added.
* Source/WebInspectorUI/UserInterface/Base/Utilities.js:
* 
Source/WebInspectorUI/UserInterface/Controllers/WebInspectorExtensionController.js:
(WI.WebInspectorExtensionController.prototype.async evaluateScriptForExtension):
(WI.WebInspectorExtensionController.prototype.evaluateScriptForExtension): 
Deleted.

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


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

Reply via email to