Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 37e5346e6e2813aebde62407b48f70a81850959c
      
https://github.com/WebKit/WebKit/commit/37e5346e6e2813aebde62407b48f70a81850959c
  Author: Youenn Fablet <youe...@gmail.com>
  Date:   2023-05-23 (Tue, 23 May 2023)

  Changed paths:
    M 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.serviceworker-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.sharedworker-expected.txt
    M 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.worker-expected.txt
    M Source/WebCore/CMakeLists.txt
    M Source/WebCore/DerivedSources-input.xcfilelist
    M Source/WebCore/DerivedSources.make
    M Source/WebCore/Modules/compression/CompressionStream.js
    M Source/WebCore/Modules/compression/DecompressionStream.js
    A Source/WebCore/Modules/streams/TransformStream.cpp
    A Source/WebCore/Modules/streams/TransformStream.h
    M Source/WebCore/Modules/streams/TransformStream.idl
    R Source/WebCore/Modules/streams/TransformStream.js
    M Source/WebCore/Modules/streams/TransformStreamInternals.js
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/dom/TextDecoderStream.js
    M Source/WebCore/dom/TextEncoderStream.js

  Log Message:
  -----------
  Memory leak in compression stream to blob conversion
https://bugs.webkit.org/show_bug.cgi?id=256837
rdar://109409251

Reviewed by Chris Dumez.

TransformStream is keeping a reference ot its ReadableStream and its 
InternalReadableStream.
InternalReadableStream is keeping a reference to its TransformStream as part of 
the algorithms.
This triggers a reference cycle that cannot be broken until the stream context 
is stopped as:
- InternalReadableStream is DOMGuarded.
- ReadableStream keeps a reference to its InternalReadableStream.

To prevent this, we do the same change we did in the past for ReadableStream 
and WritableStream:
- TransformStream becomes a C++ object.
- TransformStream keeps a reference to its InternalTransformStream which is a 
JS object.
- To prevent GC, we make sure to let TransformStream mark its 
InternalTransformStream instead of relying on DOMGuarded.
- InternalTransformStream keeps a reference to InternalReadableStream, but not 
to the corresponding ReadableStream, which ensures therre is no ref cycles.

We update transforms tream creation call sites accordingly.

Manually tested.
Existing tests ensure that streams behavior and related remains the same.

* 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.serviceworker-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.sharedworker-expected.txt:
* 
LayoutTests/imported/w3c/web-platform-tests/streams/idlharness.any.worker-expected.txt:
* Source/WebCore/CMakeLists.txt:
* Source/WebCore/DerivedSources-input.xcfilelist:
* Source/WebCore/DerivedSources.make:
* Source/WebCore/Modules/compression/CompressionStream.js:
(initializeCompressionStream):
(getter.readable):
(getter.writable):
* Source/WebCore/Modules/compression/DecompressionStream.js:
(initializeDecompressionStream):
(getter.readable):
(getter.writable):
* Source/WebCore/Modules/streams/TransformStream.cpp: Added.
(WebCore::TransformStream::create):
(WebCore::TransformStream::TransformStream):
(WebCore::TransformStream::~TransformStream):
(WebCore::invokeTransformStreamFunction):
(WebCore::createInternalTransformStream):
(WebCore::JSTransformStream::visitAdditionalChildren):
* Source/WebCore/Modules/streams/TransformStream.h: Added.
(WebCore::TransformStream::readable):
(WebCore::TransformStream::writable):
(WebCore::TransformStream::internalTransformStream):
* Source/WebCore/Modules/streams/TransformStream.idl:
* Source/WebCore/Modules/streams/TransformStream.js: Removed.
* Source/WebCore/Modules/streams/TransformStreamInternals.js:
(isTransformStream):
(createInternalTransformStreamFromTransformer):
(createTransformStream):
(initializeTransformStream):
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/dom/TextDecoderStream.js:
(initializeTextDecoderStream):
(getter.readable):
(getter.writable):
* Source/WebCore/dom/TextEncoderStream.js:
(initializeTextEncoderStream):
(getter.readable):
(getter.writable):

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


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

Reply via email to