Skip to content

Commit d57ea9e

Browse files
authored
[BREAKING] Update file chooser events (#2336)
* Update file chooser events * Rename to CancelAsync * Update PuppeteerSharp.csproj * add doc * fix comment? * fix test * Fix flaky test
1 parent ce2e022 commit d57ea9e

File tree

5 files changed

+35
-26
lines changed

5 files changed

+35
-26
lines changed

lib/PuppeteerSharp.Tests/CoverageTests/JSCoverageTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ public async Task ShouldReportRightRanges()
117117
{
118118
await Page.Coverage.StartJSCoverageAsync();
119119
await Page.GoToAsync(TestConstants.ServerUrl + "/jscoverage/ranges.html");
120+
// Prevent flaky tests.
121+
await Task.Delay(1000);
120122
var coverage = await Page.Coverage.StopJSCoverageAsync();
121123
Assert.That(coverage, Has.Exactly(1).Items);
122124
var entry = coverage[0];

lib/PuppeteerSharp.Tests/InputTests/FileChooserCancelTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ await Task.WhenAll(
2828
Page.ClickAsync("input"));
2929

3030
var fileChooser = waitForTask.Result;
31-
fileChooser.Cancel();
31+
await fileChooser.CancelAsync();
3232

3333
await Task.WhenAll(
3434
Page.WaitForFileChooserAsync(),
@@ -47,9 +47,9 @@ await Task.WhenAll(
4747
Page.ClickAsync("input"));
4848

4949
var fileChooser = waitForTask.Result;
50-
fileChooser.Cancel();
50+
await fileChooser.CancelAsync();
5151

52-
var ex = Assert.Throws<PuppeteerException>(() => fileChooser.Cancel());
52+
var ex = Assert.ThrowsAsync<PuppeteerException>(() => fileChooser.CancelAsync());
5353
Assert.AreEqual("Cannot accept FileChooser which is already handled!", ex.Message);
5454
}
5555
}

lib/PuppeteerSharp/ElementHandle.cs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -189,34 +189,39 @@ public async Task UploadFileAsync(bool resolveFilePaths, params string[] filePat
189189
throw new PuppeteerException("Multiple file uploads only work with <input type=file multiple>");
190190
}
191191

192-
var objectId = RemoteObject.ObjectId;
193-
var node = await Client.SendAsync<DomDescribeNodeResponse>("DOM.describeNode", new DomDescribeNodeRequest
194-
{
195-
ObjectId = RemoteObject.ObjectId,
196-
}).ConfigureAwait(false);
197-
var backendNodeId = node.Node.BackendNodeId;
198-
192+
// The zero-length array is a special case, it seems that
193+
// DOM.setFileInputFiles does not actually update the files in that case, so
194+
// the solution is to eval the element value to a new FileList directly.
199195
if (!filePaths.Any() || filePaths == null)
200196
{
201197
await EvaluateFunctionAsync(@"(element) => {
202198
element.files = new DataTransfer().files;
203199
204200
// Dispatch events for this case because it should behave akin to a user action.
205-
element.dispatchEvent(new Event('input', { bubbles: true }));
201+
element.dispatchEvent(
202+
new Event('input', {bubbles: true, composed: true})
203+
);
206204
element.dispatchEvent(new Event('change', { bubbles: true }));
207205
}").ConfigureAwait(false);
206+
207+
return;
208208
}
209-
else
209+
210+
var objectId = RemoteObject.ObjectId;
211+
var node = await Client.SendAsync<DomDescribeNodeResponse>("DOM.describeNode", new DomDescribeNodeRequest
210212
{
211-
var files = resolveFilePaths ? filePaths.Select(Path.GetFullPath).ToArray() : filePaths;
212-
CheckForFileAccess(files);
213-
await Client.SendAsync("DOM.setFileInputFiles", new DomSetFileInputFilesRequest
214-
{
215-
ObjectId = objectId,
216-
Files = files,
217-
BackendNodeId = backendNodeId,
218-
}).ConfigureAwait(false);
219-
}
213+
ObjectId = RemoteObject.ObjectId,
214+
}).ConfigureAwait(false);
215+
var backendNodeId = node.Node.BackendNodeId;
216+
217+
var files = resolveFilePaths ? filePaths.Select(Path.GetFullPath).ToArray() : filePaths;
218+
CheckForFileAccess(files);
219+
await Client.SendAsync("DOM.setFileInputFiles", new DomSetFileInputFilesRequest
220+
{
221+
ObjectId = objectId,
222+
Files = files,
223+
BackendNodeId = backendNodeId,
224+
}).ConfigureAwait(false);
220225
}
221226

222227
/// <inheritdoc/>

lib/PuppeteerSharp/FileChooser.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,16 @@ public Task AcceptAsync(params string[] filePaths)
6464
/// <summary>
6565
/// Closes the file chooser without selecting any files.
6666
/// </summary>
67-
public void Cancel()
67+
/// <returns>A task that resolves after the cancel event is sent to the browser.</returns>
68+
public Task CancelAsync()
6869
{
6970
if (_handled)
7071
{
7172
throw new PuppeteerException("Cannot accept FileChooser which is already handled!");
7273
}
7374

7475
_handled = true;
76+
return _element.EvaluateFunctionAsync("element => element.dispatchEvent(new Event('cancel', {bubbles: true}))");
7577
}
7678
}
7779
}

lib/PuppeteerSharp/PuppeteerSharp.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
<Description>Headless Browser .NET API</Description>
1313
<PackageId>PuppeteerSharp</PackageId>
1414
<PackageReleaseNotes></PackageReleaseNotes>
15-
<PackageVersion>12.0.0</PackageVersion>
16-
<ReleaseVersion>12.0.0</ReleaseVersion>
17-
<AssemblyVersion>12.0.0</AssemblyVersion>
18-
<FileVersion>12.0.0</FileVersion>
15+
<PackageVersion>13.0.0</PackageVersion>
16+
<ReleaseVersion>13.0.0</ReleaseVersion>
17+
<AssemblyVersion>13.0.0</AssemblyVersion>
18+
<FileVersion>13.0.0</FileVersion>
1919
<SynchReleaseVersion>false</SynchReleaseVersion>
2020
<StyleCopTreatErrorsAsWarnings>false</StyleCopTreatErrorsAsWarnings>
2121
<DebugType>embedded</DebugType>

0 commit comments

Comments
 (0)