`browsingContext.setViewport` fails intermittently with "unknown error"
Categories
(Remote Protocol :: WebDriver BiDi, defect, P1)
Tracking
(firefox132 fixed)
| Tracking | Status | |
|---|---|---|
| firefox132 | --- | fixed |
People
(Reporter: yurys, Assigned: whimboo)
References
(Blocks 2 open bugs)
Details
(Whiteboard: [webdriver:m12][webdriver:relnote])
Attachments
(3 files)
Steps to reproduce:
Run Playwright tests with Bidi Firefox as described on this page. E.g. use the following command to see the protocol log:
DEBUG=pw:protocol MAX_LOG_LENGTH=1000 npm run biditest -- --project='bidi-firefox-beta*' page-click.spec.ts:24 --workers=1 -x --repeat-each=10
Actual results:
The test is failing every other run when browsingContext.setViewport is sent with the same error response:
{"type":"error","id":14,"error":"unknown error","message":"AbortError: Actor 'MessageHandlerFrame' destroyed before query 'MessageHandlerFrameParent:sendCommand' was resolved","stacktrace":""}
Here is the protocol log:
pw:protocol SEND ► {"id":1,"method":"session.new","params":{"capabilities":{"alwaysMatch":{"acceptInsecureCerts":false,"unhandledPromptBehavior":{"default":"ignore"},"webSocketUrl":true}}}} +0ms
pw:protocol ◀ RECV {"type":"success","id":1,"result":{"sessionId":"3c68f635-422f-498f-b500-e42d6f465db2","capabilities":{"acceptInsecureCerts":false,"browserName":"firefox","browserVersion":"131.0","platformName":"mac","unhandledPromptBehavior":{"default":"ignore"},"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0","moz:buildID":"20240909091655","moz:headless":true,"moz:platformVersion":"23.6.0","moz:processID":22127,"moz:profile":"/var/folders/t3/_mbh6z155sz1cr7prkpn9lsh0000gn/T/playwright_bididev_profile-X4nw8C","moz:shutdownTimeout":60000,"proxy":{}}}} +801ms
pw:protocol SEND ► {"id":2,"method":"session.subscribe","params":{"events":["browsingContext","network","log","script"]}} +0ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmCreated","params":{"realm":"a4dec95e-a91e-4b72-8145-caca0cb6eb2a","origin":"null","context":"a3e0c04a-c8e0-4556-9691-daeae4c0092e","type":"window"}} +13ms
pw:protocol ◀ RECV {"type":"success","id":2,"result":{}} +2ms
pw:protocol SEND ► {"id":3,"method":"browser.createUserContext","params":{}} +8ms
pw:protocol ◀ RECV {"type":"success","id":3,"result":{"userContext":"7a6c3aea-78b9-4783-88c9-675f562eb19d"}} +1ms
pw:protocol SEND ► {"id":4,"method":"browsingContext.create","params":{"type":"window","userContext":"7a6c3aea-78b9-4783-88c9-675f562eb19d"}} +10ms
pw:protocol ◀ RECV {"type":"event","method":"browsingContext.contextCreated","params":{"children":null,"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","originalOpener":null,"url":"about:blank","userContext":"7a6c3aea-78b9-4783-88c9-675f562eb19d","parent":null}} +71ms
pw:protocol SEND ► {"id":5,"method":"browsingContext.setViewport","params":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","viewport":{"width":1280,"height":720},"devicePixelRatio":1}} +1ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmCreated","params":{"realm":"d00e0926-fe3e-4cbc-a016-cb6bb52cd264","origin":"null","context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","type":"window"}} +150ms
pw:protocol SEND ► {"id":6,"method":"script.evaluate","params":{"expression":"1 + 1","target":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","sandbox":"__playwright_utility_world__"},"serializationOptions":{"maxObjectDepth":10,"maxDomDepth":10},"awaitPromise":true,"userActivation":true}} +1ms
pw:protocol ◀ RECV {"type":"event","method":"browsingContext.navigationStarted","params":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","navigation":"e94153bf-de06-4063-81d4-1caecb043288","timestamp":1726101240323,"url":"about:blank"}} +5ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmCreated","params":{"realm":"924cb568-3b93-409f-8ab9-db85c4be0169","origin":"null","context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","type":"window","sandbox":"__playwright_utility_world__"}} +2ms
pw:protocol ◀ RECV {"type":"success","id":6,"result":{"realm":"924cb568-3b93-409f-8ab9-db85c4be0169","type":"success","result":{"type":"number","value":2}}} +0ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmDestroyed","params":{"realm":"d00e0926-fe3e-4cbc-a016-cb6bb52cd264"}} +1ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmDestroyed","params":{"realm":"924cb568-3b93-409f-8ab9-db85c4be0169"}} +0ms
pw:protocol ◀ RECV {"type":"error","id":5,"error":"unknown error","message":"AbortError: Actor 'MessageHandlerFrame' destroyed before query 'MessageHandlerFrameParent:sendCommand' was resolved","stacktrace":""} +0ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmCreated","params":{"realm":"c86fa192-d648-4c1f-a4e2-8a4182ed7600","origin":"null","context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","type":"window"}} +8ms
pw:protocol SEND ► {"id":7,"method":"script.evaluate","params":{"expression":"1 + 1","target":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","sandbox":"__playwright_utility_world__"},"serializationOptions":{"maxObjectDepth":10,"maxDomDepth":10},"awaitPromise":true,"userActivation":true}} +0ms
pw:protocol ◀ RECV {"type":"event","method":"browsingContext.domContentLoaded","params":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","timestamp":1726101240330,"url":"about:blank","navigation":"e94153bf-de06-4063-81d4-1caecb043288"}} +1ms
pw:protocol ◀ RECV {"type":"event","method":"browsingContext.load","params":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","timestamp":1726101240331,"url":"about:blank","navigation":"e94153bf-de06-4063-81d4-1caecb043288"}} +0ms
pw:protocol ◀ RECV {"type":"success","id":4,"result":{"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9"}} +0ms
pw:protocol ◀ RECV {"type":"event","method":"script.realmCreated","params":{"realm":"fc65d4f5-a5ac-4d12-a9c6-b612cb364a9e","origin":"null","context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","type":"window","sandbox":"__playwright_utility_world__"}} +4ms
pw:protocol ◀ RECV {"type":"success","id":7,"result":{"realm":"fc65d4f5-a5ac-4d12-a9c6-b612cb364a9e","type":"success","result":{"type":"number","value":2}}} +0ms
pw:protocol SEND ► {"id":8,"method":"browser.removeUserContext","params":{"userContext":"7a6c3aea-78b9-4783-88c9-675f562eb19d"}} +0ms
pw:protocol ◀ RECV {"type":"success","id":8,"result":{}} +4ms
pw:protocol ◀ RECV {"type":"event","method":"browsingContext.contextDestroyed","params":{"children":null,"context":"5ae7f48d-9a93-4dd0-a006-3d1a40abccb9","originalOpener":null,"url":"about:blank","userContext":null,"parent":null}} +5ms
pw:protocol ◀ RECV {"type":"success","id":0,"result":{}} +5ms
Expected results:
Viewport should be updated with no errors.
| Assignee | ||
Comment 1•1 year ago
|
||
Thanks for the report. As I can see the command browsingContext.create is run but it's not awaited to be completed. Instead the view port is trying to get set when the browsingContext.contextCreated event is received. But at this stage the initial about:blank page hasn't been loaded, which is causing a navigation (see the navigation events) including a replacement of the navigable (browsing context). As result the browsingContext.setViewport command fails.
Yury, are you not waiting for the command to complete on purpose? I'm asking to understand the logic and what we may have to fix here in our handling of commands. Thanks!
| Assignee | ||
Comment 2•1 year ago
|
||
We should likely delay sending the browsingContext.contextCreated event until the initial about:blank page has finished loading to avoid this behavior. It would also mean not sending any navigation-related events during that time. Doing so would resolve issues where clients run commands triggered by that event, but those commands fail because the navigable gets replaced.
There’s an ongoing discussion about such a topic on this GitHub issue.
| Reporter | ||
Comment 3•1 year ago
|
||
Yury, are you not waiting for the command to complete on purpose? I'm asking to understand the logic and what we may have to fix here in our handling of commands. Thanks!
Yes, we send browsingContext.setViewport command whenever a new page is reported via browsingContext.contextCreated event. The logic is the same for the pages created by browsingContext.create and for popup pages/new tab navigations (e.g. ctrl+click). We assume that browsingContext.setViewport command can be sent at any moment regardless of the navigation state, similar to how the user can resize the browser at any time.
In the spec the viewport (and other emulation parameters) should be set on the user context level, so that there are no races with a new page starting navigation. The browser would apply all emulation parameters before the page starts navigation (be it a popup, new tab/window navigation or a page created by a Bidi client). browsingContext.setViewport command in general is only useful for emulating browser window resize.
| Assignee | ||
Comment 4•1 year ago
|
||
Thanks for summarizing on your side. Here's the current situation:
-
When a new tab is opened, we're sending the
browsingContext.contextCreatedevent too early, causing clients to assume the tab is ready for interaction. We should delay this and related events until the initial page has fully loaded (GitHub issue). I’ve also filed bug 1918672 to address this particular issue, and I believe this is likely the cause of many Playwright test failures, though I haven't run them myself yet. -
Instead of aborting the command when the check for re-rendered web content fails due to a browsing context replacement, we should retry the operation once the next window actor is created. The new browsing context should inherit the correct browser dimensions that were already set.
| Assignee | ||
Comment 5•1 year ago
|
||
We probably can fix just this issue with using retryOnAbort: true when calling the _awaitViewportDimensions command in the window global here:
| Assignee | ||
Comment 6•1 year ago
|
||
This actually fixes the problem. I'll have a patch shortly.
| Assignee | ||
Comment 7•1 year ago
|
||
| Assignee | ||
Comment 8•1 year ago
|
||
| Assignee | ||
Updated•1 year ago
|
| Assignee | ||
Comment 9•1 year ago
|
||
We don't depend on bug 1918672 anymore.
Updated•1 year ago
|
Updated•1 year ago
|
Updated•1 year ago
|
Comment 10•1 year ago
|
||
| Assignee | ||
Comment 11•1 year ago
|
||
Updated•1 year ago
|
Comment 12•1 year ago
|
||
Comment 13•1 year ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/9aa9ab741fcb
https://hg.mozilla.org/mozilla-central/rev/29aa62e3a45f
https://hg.mozilla.org/mozilla-central/rev/a689bca815b6
https://hg.mozilla.org/mozilla-central/rev/8e25b43c4b69
| Assignee | ||
Updated•1 year ago
|
Description
•