Bug 247863 - PerformanceObserver does not queue a task on observe call
Summary: PerformanceObserver does not queue a task on observe call
Status: NEW
Alias: None
Product: WebKit
Classification: Unclassified
Component: New Bugs (show other bugs)
Version: Safari Technology Preview
Hardware: Mac (Intel) macOS 12
: P2 Normal
Assignee: Nobody
URL:
Keywords: BrowserCompat, InRadar
Depends on:
Blocks:
 
Reported: 2022-11-13 11:30 PST by Philip Walton
Modified: 2022-11-20 21:33 PST (History)
6 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Philip Walton 2022-11-13 11:30:21 PST
Steps to reproduce:

1. Navigate to https://example.com in Safari and wait for content to appear on the screen
2. Open the Web Inspector and paste the following code into the JavaScript console:

```
const po = new PerformanceObserver(() => {
  console.log('PO handler scope');
});

po.observe({type: 'paint', buffered: true});
console.log('Top-level scope');
```

3. Notice the order in which the log statements are printed.

In Safari the order is:

```
PO handler scope
Top-level scope
```

But in Chrome and Firefox the order is reversed:

```
Top-level scope
PO handler scope
```

Based on my reading of the observe processing model in the spec [1] both Chrome and Firefox are correct. The last line in the processing model "5.2 observe() method" reads "Queue the PerformanceObserver task with relevantGlobal as input.", which should defer execution of the observer callback until after the current call stack finishes.

[1] https://www.w3.org/TR/performance-timeline/#observe-method
Comment 1 Karl Dubost 2022-11-14 19:17:07 PST
Wondering if there is a WPT for this.
Comment 2 Radar WebKit Bug Importer 2022-11-20 11:31:15 PST
<rdar://problem/102564727>
Comment 3 Noam Rosenthal 2022-11-20 21:33:48 PST
(In reply to Karl Dubost from comment #1)
> Wondering if there is a WPT for this.

I took a rough look at the WPT folders and I'm pretty sure there isn't.