Commit 48a79144 authored by Marijn Kruisselbrink's avatar Marijn Kruisselbrink Committed by Commit Bot

[NativeFS] Keep directory iterator alive while it has pending promises.

Should hopefully also fix test flakiness where tests seemed to already
be running into this.

Fixed: 1074123
Change-Id: If57c8d6f622c17d795bc1429f66485cda94befd2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2313763Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#791122}
parent 506445a2
......@@ -68,6 +68,10 @@ ScriptPromise NativeFileSystemDirectoryIterator::next(
return ScriptPromise::Cast(script_state, V8IteratorResultDone(script_state));
}
bool NativeFileSystemDirectoryIterator::HasPendingActivity() const {
return pending_next_;
}
void NativeFileSystemDirectoryIterator::Trace(Visitor* visitor) const {
ScriptWrappable::Trace(visitor);
ExecutionContextClient::Trace(visitor);
......
......@@ -8,6 +8,7 @@
#include "base/files/file.h"
#include "third_party/blink/public/mojom/native_file_system/native_file_system_directory_handle.mojom-blink.h"
#include "third_party/blink/public/mojom/native_file_system/native_file_system_error.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
......@@ -22,6 +23,7 @@ class ScriptState;
class NativeFileSystemDirectoryIterator final
: public ScriptWrappable,
public ActiveScriptWrappable<NativeFileSystemDirectoryIterator>,
public ExecutionContextClient,
public mojom::blink::NativeFileSystemDirectoryEntriesListener {
DEFINE_WRAPPERTYPEINFO();
......@@ -37,6 +39,9 @@ class NativeFileSystemDirectoryIterator final
ScriptPromise next(ScriptState*);
// ScriptWrappable:
bool HasPendingActivity() const final;
void Trace(Visitor*) const override;
private:
......
......@@ -7,6 +7,7 @@
// https://www.ecma-international.org/ecma-262/9.0/index.html#sec-asynciterator-interface
[
NoInterfaceObject,
ActiveScriptWrappable,
RuntimeEnabled=NativeFileSystem
] interface NativeFileSystemDirectoryIterator {
[CallWith=ScriptState] Promise<any> next();
......
......@@ -78,3 +78,21 @@ directory_test(async (t, root) => {
names.sort();
assert_array_equals(names, [file_name1, file_name2]);
}, 'keys: full iteration works');
directory_test(async (t, root) => {
const file_name1 = 'foo1.txt';
await createFileWithContents(t, file_name1, 'contents', /*parent=*/ root);
const next = (() => {
const iterator = root.entries();
return iterator.next();
})();
garbageCollect();
let entry = await next;
assert_false(entry.done);
assert_true(Array.isArray(entry.value));
assert_equals(entry.value.length, 2);
assert_equals(entry.value[0], file_name1);
assert_true(entry.value[1] instanceof FileSystemFileHandle);
assert_equals(entry.value[1].name, file_name1);
}, 'iteration while iterator gets garbage collected');
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment