Skip to content

Commit 083f263

Browse files
navigator.mediaCapabilities wrapper should not become GC-collectable before its navigator object
https://bugs.webkit.org/show_bug.cgi?id=315684 Reviewed by Ryosuke Niwa. navigator.mediaCapabilities wrapper should not become GC-collectable before its navigator object. The MediaCapabilities interface is annotated [SameObject] in the spec: https://www.w3.org/TR/media-capabilities/#idl-index It means that navigator.mediaCapabilities must return the same object on every access. See: WebPlatformForEmbedded/WPEWebKit#1678 Original author: Andrzej Surdej (https://github.com/asurdej-comcast) Updated existing LayoutTest with mediaCapabilities case. * LayoutTests/fast/dom/navigator-property-gc-after-frame-detach-expected.txt: * LayoutTests/fast/dom/navigator-property-gc-after-frame-detach.html: * Source/WebCore/Modules/mediacapabilities/MediaCapabilities.cpp: (WebCore::MediaCapabilities::MediaCapabilities): (WebCore::MediaCapabilities::navigator): * Source/WebCore/Modules/mediacapabilities/MediaCapabilities.h: (WebCore::MediaCapabilities::create): * Source/WebCore/Modules/mediacapabilities/MediaCapabilities.idl: * Source/WebCore/Modules/mediacapabilities/NavigatorMediaCapabilities.cpp: (WebCore::NavigatorMediaCapabilities::NavigatorMediaCapabilities): (WebCore::NavigatorMediaCapabilities::from): * Source/WebCore/Modules/mediacapabilities/NavigatorMediaCapabilities.h: * Source/WebCore/Modules/mediacapabilities/WorkerNavigatorMediaCapabilities.cpp: (WebCore::WorkerNavigatorMediaCapabilities::WorkerNavigatorMediaCapabilities): (WebCore::WorkerNavigatorMediaCapabilities::from): * Source/WebCore/Modules/mediacapabilities/WorkerNavigatorMediaCapabilities.h: Canonical link: https://commits.webkit.org/315088@main
1 parent 3919bd6 commit 083f263

9 files changed

Lines changed: 30 additions & 12 deletions

LayoutTests/fast/dom/navigator-property-gc-after-frame-detach-expected.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@ Tests that Navigator properties do not get GC'd before their Navigator object.
33
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
44

55

6+
PASS frameNavigator.mediaCapabilities.foo is 1
67
PASS frameNavigator.geolocation.foo is 1
78
PASS frameNavigator.mimeTypes.foo is 1
89
PASS frameNavigator.plugins.foo is 1
910
PASS frameNavigator.serviceWorker.foo is 1
1011

12+
PASS frameNavigator.mediaCapabilities.foo is 1
1113
PASS frameNavigator.geolocation.foo is 1
1214
PASS frameNavigator.mimeTypes.foo is 1
1315
PASS frameNavigator.plugins.foo is 1
1416
PASS frameNavigator.serviceWorker.foo is 1
1517

18+
PASS frameNavigator.mediaCapabilities.foo is 1
1619
PASS frameNavigator.geolocation.foo is 1
1720
PASS frameNavigator.mimeTypes.foo is 1
1821
PASS frameNavigator.plugins.foo is 1

LayoutTests/fast/dom/navigator-property-gc-after-frame-detach.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
description("Tests that Navigator properties do not get GC'd before their Navigator object.");
88
jsTestIsAsync = true;
99

10-
var navigatorProperties = [ "geolocation", "mimeTypes", "plugins" ];
10+
var navigatorProperties = [ "mediaCapabilities", "geolocation", "mimeTypes", "plugins" ];
1111
if (navigator.serviceWorker)
1212
navigatorProperties.push("serviceWorker");
1313

Source/WebCore/Modules/mediacapabilities/MediaCapabilities.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,16 @@
4848

4949
namespace WebCore {
5050

51+
MediaCapabilities::MediaCapabilities(NavigatorBase& navigator)
52+
: m_navigator(navigator)
53+
{
54+
}
55+
56+
NavigatorBase* MediaCapabilities::navigator()
57+
{
58+
return m_navigator.get();
59+
}
60+
5161
static bool isValidMediaMIMEType(const ContentType& contentType)
5262
{
5363
// A "bucket" MIME types is one whose container type does not uniquely specify a codec.

Source/WebCore/Modules/mediacapabilities/MediaCapabilities.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,24 @@
3333
namespace WebCore {
3434

3535
class DeferredPromise;
36+
class NavigatorBase;
3637
class ScriptExecutionContext;
3738
struct MediaDecodingConfiguration;
3839
struct MediaEncodingConfiguration;
3940

4041
class MediaCapabilities : public RefCountedAndCanMakeWeakPtr<MediaCapabilities> {
4142
public:
42-
static Ref<MediaCapabilities> create() { return adoptRef(*new MediaCapabilities); }
43+
static Ref<MediaCapabilities> create(NavigatorBase& navigator) { return adoptRef(*new MediaCapabilities(navigator)); }
44+
45+
NavigatorBase* navigator();
4346

4447
void decodingInfo(ScriptExecutionContext&, MediaDecodingConfiguration&&, Ref<DeferredPromise>&&);
4548
void encodingInfo(ScriptExecutionContext&, MediaEncodingConfiguration&&, Ref<DeferredPromise>&&);
4649

4750
private:
48-
MediaCapabilities() = default;
51+
explicit MediaCapabilities(NavigatorBase&);
4952

53+
WeakPtr<NavigatorBase> m_navigator;
5054
uint64_t m_nextTaskIdentifier { 0 };
5155
HashMap<uint64_t, PlatformMediaEngineConfigurationFactory::DecodingConfigurationCallback> m_decodingTasks;
5256
HashMap<uint64_t, PlatformMediaEngineConfigurationFactory::EncodingConfigurationCallback> m_encodingTasks;

Source/WebCore/Modules/mediacapabilities/MediaCapabilities.idl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
// https://w3c.github.io/media-capabilities/#media-capabilities-interface
2727
[
2828
EnabledBySetting=MediaCapabilitiesEnabled,
29-
Exposed=(Window,DedicatedWorker)
29+
Exposed=(Window,DedicatedWorker),
30+
GenerateIsReachable=ReachableFromNavigator
3031
] interface MediaCapabilities {
3132
[CallWith=CurrentScriptExecutionContext] Promise<MediaCapabilitiesDecodingInfo> decodingInfo(MediaDecodingConfiguration configuration);
3233
[CallWith=CurrentScriptExecutionContext] Promise<MediaCapabilitiesEncodingInfo> encodingInfo(MediaEncodingConfiguration configuration);

Source/WebCore/Modules/mediacapabilities/NavigatorMediaCapabilities.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace WebCore {
3434

3535
WTF_MAKE_TZONE_ALLOCATED_IMPL(NavigatorMediaCapabilities);
3636

37-
NavigatorMediaCapabilities::NavigatorMediaCapabilities()
38-
: m_mediaCapabilities(MediaCapabilities::create())
37+
NavigatorMediaCapabilities::NavigatorMediaCapabilities(Navigator& navigator)
38+
: m_mediaCapabilities(MediaCapabilities::create(navigator))
3939
{
4040
}
4141

@@ -45,7 +45,7 @@ NavigatorMediaCapabilities& NavigatorMediaCapabilities::from(Navigator& navigato
4545
{
4646
auto* supplement = downcast<NavigatorMediaCapabilities>(Supplement<Navigator>::from(&navigator, supplementName()));
4747
if (!supplement) {
48-
auto newSupplement = makeUnique<NavigatorMediaCapabilities>();
48+
auto newSupplement = makeUnique<NavigatorMediaCapabilities>(navigator);
4949
supplement = newSupplement.get();
5050
provideTo(&navigator, supplementName(), WTF::move(newSupplement));
5151
}

Source/WebCore/Modules/mediacapabilities/NavigatorMediaCapabilities.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class Navigator;
3636
class NavigatorMediaCapabilities final : public Supplement<Navigator> {
3737
WTF_MAKE_TZONE_ALLOCATED(NavigatorMediaCapabilities);
3838
public:
39-
NavigatorMediaCapabilities();
39+
explicit NavigatorMediaCapabilities(Navigator&);
4040
~NavigatorMediaCapabilities();
4141

4242
static MediaCapabilities& mediaCapabilities(Navigator&);

Source/WebCore/Modules/mediacapabilities/WorkerNavigatorMediaCapabilities.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace WebCore {
3434

3535
WTF_MAKE_TZONE_ALLOCATED_IMPL(WorkerNavigatorMediaCapabilities);
3636

37-
WorkerNavigatorMediaCapabilities::WorkerNavigatorMediaCapabilities()
38-
: m_mediaCapabilities(MediaCapabilities::create())
37+
WorkerNavigatorMediaCapabilities::WorkerNavigatorMediaCapabilities(WorkerNavigator& navigator)
38+
: m_mediaCapabilities(MediaCapabilities::create(navigator))
3939
{
4040
}
4141

@@ -45,7 +45,7 @@ WorkerNavigatorMediaCapabilities& WorkerNavigatorMediaCapabilities::from(WorkerN
4545
{
4646
auto* supplement = downcast<WorkerNavigatorMediaCapabilities>(Supplement<WorkerNavigator>::from(&navigator, supplementName()));
4747
if (!supplement) {
48-
auto newSupplement = makeUnique<WorkerNavigatorMediaCapabilities>();
48+
auto newSupplement = makeUnique<WorkerNavigatorMediaCapabilities>(navigator);
4949
supplement = newSupplement.get();
5050
provideTo(&navigator, supplementName(), WTF::move(newSupplement));
5151
}

Source/WebCore/Modules/mediacapabilities/WorkerNavigatorMediaCapabilities.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class WorkerNavigator;
3636
class WorkerNavigatorMediaCapabilities final : public Supplement<WorkerNavigator> {
3737
WTF_MAKE_TZONE_ALLOCATED(WorkerNavigatorMediaCapabilities);
3838
public:
39-
WorkerNavigatorMediaCapabilities();
39+
explicit WorkerNavigatorMediaCapabilities(WorkerNavigator&);
4040
~WorkerNavigatorMediaCapabilities();
4141

4242
static MediaCapabilities& mediaCapabilities(WorkerNavigator&);

0 commit comments

Comments
 (0)