| // This script depends on the following scripts: |
| // resources/test-helpers.js |
| |
| // A helper class for WPTs testing FileSystemObserver scope behavior. |
| // |
| // Sets up a `watched_handle` for the test to watch. Provides the |
| // `in_scope_paths()` and `out_of_scope_paths()` async iterators to get paths |
| // that are in scope or out of scope of the `watched_path` respectively. |
| class ScopeTest { |
| #test_dir_handle; |
| |
| #watched_handle; |
| #out_of_scope_directory; |
| |
| #child_dir_name; |
| #child_dir_handle; |
| |
| #setup_promise_and_resolvers = Promise.withResolvers(); |
| |
| constructor(test, test_dir_handle) { |
| test.add_cleanup(async () => { |
| await this.#setup_promise_and_resolvers.promise; |
| this.#watched_handle.remove({recursive: true}); |
| this.#out_of_scope_directory.remove({recursive: true}); |
| }); |
| |
| this.#test_dir_handle = test_dir_handle; |
| |
| this.#setup(); |
| } |
| |
| async watched_handle() { |
| await this.#setup_promise_and_resolvers.promise; |
| return this.#watched_handle; |
| } |
| |
| async * in_scope_paths(recursive) { |
| await this.#setup_promise_and_resolvers.promise; |
| |
| yield new ScopeTestPath(this.#watched_handle, []) |
| |
| if (recursive) { |
| yield new ScopeTestPath(this.#child_dir_handle, [this.#child_dir_name]); |
| } |
| } |
| |
| async * out_of_scope_paths(recursive) { |
| await this.#setup_promise_and_resolvers.promise; |
| |
| yield new ScopeTestPath(this.#out_of_scope_directory, []) |
| |
| if (!recursive) { |
| yield new ScopeTestPath(this.#child_dir_handle, [this.#child_dir_name]); |
| } |
| } |
| |
| async #setup() { |
| this.#watched_handle = await this.#test_dir_handle.getDirectoryHandle( |
| getUniqueName(), {create: true}); |
| |
| this.#child_dir_name = getUniqueName(); |
| this.#child_dir_handle = await this.#watched_handle.getDirectoryHandle( |
| this.#child_dir_name, {create: true}); |
| |
| this.#out_of_scope_directory = |
| await this.#test_dir_handle.getDirectoryHandle( |
| getUniqueName(), {create: true}); |
| |
| this.#setup_promise_and_resolvers.resolve(); |
| } |
| } |
| |
| // The class that ScopeTest delivers the in scope and out of scope paths in. |
| class ScopeTestPath { |
| #parentHandle; |
| #fileName; |
| #relativePathComponents; |
| |
| constructor(parentHandle, parentRelativePathComponents) { |
| this.#parentHandle = parentHandle; |
| this.#fileName = getUniqueName(); |
| this.#relativePathComponents = |
| [...parentRelativePathComponents, this.#fileName]; |
| } |
| |
| parentHandle() { |
| return this.#parentHandle; |
| } |
| |
| fileName() { |
| return this.#fileName; |
| } |
| |
| // Returns the relative path components to the watched directory. |
| relativePathComponents() { |
| return this.#relativePathComponents; |
| } |
| |
| createHandle() { |
| return this.#parentHandle.getFileHandle(this.#fileName, {create: true}); |
| } |
| } |