Title: [280875] trunk/Source/WebKit
- Revision
- 280875
- Author
- commit-qu...@webkit.org
- Date
- 2021-08-10 17:12:16 -0700 (Tue, 10 Aug 2021)
Log Message
WebKitBlobResource error 1 exactly after 60 seconds when trying to read file input
https://bugs.webkit.org/show_bug.cgi?id=228683
<rdar://78448610>
Patch by Alex Christensen <achristen...@webkit.org> on 2021-08-10
Reviewed by Tim Horton.
To prevent UIKit from deleting our files to upload after 60 seconds, copy them to a temporary directory,
then delete the files when cleaning up the WKContentView.
I manually verified this makes the files able to upload after more than 60 seconds, then deletes them when you close the tab.
* UIProcess/ios/WKContentView.h:
* UIProcess/ios/WKContentView.mm:
(-[WKContentView dealloc]):
(-[WKContentView _removeTemporaryFilesIfNecessary]):
(-[WKContentView _removeTemporaryFilesWhenDeallocated:]):
* UIProcess/ios/WKContentViewInteraction.h.orig: Added.
* UIProcess/ios/WKContentViewInteraction.mm.orig: Added.
* UIProcess/ios/forms/WKFileUploadPanel.mm:
(-[WKFileUploadPanel documentPicker:didPickDocumentsAtURLs:]):
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (280874 => 280875)
--- trunk/Source/WebKit/ChangeLog 2021-08-11 00:00:50 UTC (rev 280874)
+++ trunk/Source/WebKit/ChangeLog 2021-08-11 00:12:16 UTC (rev 280875)
@@ -1,3 +1,26 @@
+2021-08-10 Alex Christensen <achristen...@webkit.org>
+
+ WebKitBlobResource error 1 exactly after 60 seconds when trying to read file input
+ https://bugs.webkit.org/show_bug.cgi?id=228683
+ <rdar://78448610>
+
+ Reviewed by Tim Horton.
+
+ To prevent UIKit from deleting our files to upload after 60 seconds, copy them to a temporary directory,
+ then delete the files when cleaning up the WKContentView.
+
+ I manually verified this makes the files able to upload after more than 60 seconds, then deletes them when you close the tab.
+
+ * UIProcess/ios/WKContentView.h:
+ * UIProcess/ios/WKContentView.mm:
+ (-[WKContentView dealloc]):
+ (-[WKContentView _removeTemporaryFilesIfNecessary]):
+ (-[WKContentView _removeTemporaryFilesWhenDeallocated:]):
+ * UIProcess/ios/WKContentViewInteraction.h.orig: Added.
+ * UIProcess/ios/WKContentViewInteraction.mm.orig: Added.
+ * UIProcess/ios/forms/WKFileUploadPanel.mm:
+ (-[WKFileUploadPanel documentPicker:didPickDocumentsAtURLs:]):
+
2021-08-10 Andres Gonzalez <andresg...@apple.com>
Notify accessibility that WebProcess is suspended when in process cache.
Modified: trunk/Source/WebKit/UIProcess/ios/WKContentView.h (280874 => 280875)
--- trunk/Source/WebKit/UIProcess/ios/WKContentView.h 2021-08-11 00:00:50 UTC (rev 280874)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentView.h 2021-08-11 00:12:16 UTC (rev 280875)
@@ -112,6 +112,7 @@
#endif // HAVE(VISIBILITY_PROPAGATION_VIEW)
- (void)_setAcceleratedCompositingRootView:(UIView *)rootView;
+- (void)_removeTemporaryDirectoriesWhenDeallocated:(Vector<RetainPtr<NSURL>>&&)urls;
- (void)_showInspectorHighlight:(const WebCore::InspectorOverlay::Highlight&)highlight;
- (void)_hideInspectorHighlight;
Modified: trunk/Source/WebKit/UIProcess/ios/WKContentView.mm (280874 => 280875)
--- trunk/Source/WebKit/UIProcess/ios/WKContentView.mm 2021-08-11 00:00:50 UTC (rev 280874)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentView.mm 2021-08-11 00:12:16 UTC (rev 280875)
@@ -149,6 +149,7 @@
uint64_t _pdfPrintCallbackID;
RetainPtr<CGPDFDocumentRef> _printedDocument;
+ Vector<RetainPtr<NSURL>> _temporaryURLsToDeleteWhenDeallocated;
}
#if USE(UIKIT_KEYBOARD_ADDITIONS)
@@ -313,9 +314,42 @@
WebKit::WebProcessPool::statistics().wkViewCount--;
+ [self _removeTemporaryFilesIfNecessary];
+
[super dealloc];
}
+- (void)_removeTemporaryFilesIfNecessary
+{
+ if (_temporaryURLsToDeleteWhenDeallocated.isEmpty())
+ return;
+
+ auto deleteTemporaryFiles = makeBlockPtr([urls = std::exchange(_temporaryURLsToDeleteWhenDeallocated, { })] {
+ ASSERT(!RunLoop::isMain());
+ auto manager = adoptNS([[NSFileManager alloc] init]);
+ auto coordinator = adoptNS([[NSFileCoordinator alloc] init]);
+ for (auto& url : urls) {
+ if (![manager fileExistsAtPath:[url path]])
+ continue;
+ NSError *error = nil;
+ [coordinator coordinateWritingItemAtURL:url.get() options:NSFileCoordinatorWritingForDeleting error:&error byAccessor:^(NSURL *coordinatedURL) {
+ NSError *error = nil;
+ if (![manager removeItemAtURL:coordinatedURL error:&error] || error)
+ LOG_ERROR(OS_LOG_DEFAULT, "WKContentViewInteraction failed to remove file at path %@ with error %@", coordinatedURL.path, error);
+ }];
+ if (error)
+ LOG_ERROR(OS_LOG_DEFAULT, "WKContentViewInteraction failed to coordinate removal of temporary file at path %@ with error %@", url, error);
+ }
+ });
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), deleteTemporaryFiles.get());
+}
+
+- (void)_removeTemporaryDirectoriesWhenDeallocated:(Vector<RetainPtr<NSURL>>&&)urls
+{
+ _temporaryURLsToDeleteWhenDeallocated.appendVector(WTFMove(urls));
+}
+
- (WebKit::WebPageProxy*)page
{
return _page.get();
Modified: trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm (280874 => 280875)
--- trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm 2021-08-11 00:00:50 UTC (rev 280874)
+++ trunk/Source/WebKit/UIProcess/ios/forms/WKFileUploadPanel.mm 2021-08-11 00:12:16 UTC (rev 280875)
@@ -648,11 +648,55 @@
return WebCore::multipleFileUploadText(urlsCount);
}
-- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urls
+
+- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray<NSURL *> *)urlsFromUIKit
{
ASSERT(urls.count);
[self _dismissDisplayAnimated:YES];
- [self _chooseFiles:urls displayString:displayStringForDocumentsAtURLs(urls) iconImage:iconForFile(urls[0]).get()];
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), makeBlockPtr([retainedSelf = retainPtr(self), urlsFromUIKit = retainPtr(urlsFromUIKit)] () mutable {
+
+ auto copyToNewTemporaryDirectory = [] (NSArray<NSURL *> *originalURLs) -> std::pair<RetainPtr<NSArray<NSURL *>>, Vector<RetainPtr<NSURL>>> {
+ ASSERT(!RunLoop::isMain());
+ auto maybeMovedURLs = adoptNS([[NSMutableArray alloc] initWithCapacity:originalURLs.count]);
+ __block Vector<RetainPtr<NSURL>> temporaryURLs;
+ auto manager = adoptNS([[NSFileManager alloc] init]);
+ auto coordinator = adoptNS([[NSFileCoordinator alloc] init]);
+ for (NSURL *originalURL in originalURLs) {
+ NSError *error = nil;
+ NSString *temporaryDirectory = FileSystem::createTemporaryDirectory(@"WKFileUploadPanel");
+ if (!temporaryDirectory) {
+ LOG_ERROR("WKFileUploadPanel: Failed to make temporary directory");
+ [maybeMovedURLs addObject:originalURL];
+ continue;
+ }
+ NSString *filePath = [temporaryDirectory stringByAppendingPathComponent:originalURL.lastPathComponent];
+ auto destinationFileURL = adoptNS([[NSURL alloc] initFileURLWithPath:filePath isDirectory:NO]);
+ [coordinator coordinateWritingItemAtURL:originalURL options:NSFileCoordinatorWritingForMoving error:&error byAccessor:^(NSURL *coordinatedOriginalURL) {
+ NSError *error = nil;
+ if (![manager moveItemAtURL:coordinatedOriginalURL toURL:destinationFileURL.get() error:&error] || error) {
+ LOG_ERROR("WKFileUploadPanel: Failed to move file to new path %@ with error %@", destinationFileURL.get(), error);
+ // If moving fails, keep the original URL and our 60 second time limit before it is deleted. We tried our best to extend it.
+ [maybeMovedURLs addObject:coordinatedOriginalURL];
+ } else
+ [maybeMovedURLs addObject:destinationFileURL.get()];
+ }];
+ if (error) {
+ LOG_ERROR("WKFileUploadPanel: Failed to coordinate moving file with error %@", error);
+ // If moving fails, keep the original URL and our 60 second time limit before it is deleted. We tried our best to extend it.
+ [maybeMovedURLs addObject:originalURL];
+ }
+ temporaryURLs.append(adoptNS([[NSURL alloc] initFileURLWithPath:temporaryDirectory isDirectory:YES]));
+ }
+ return { WTFMove(maybeMovedURLs), WTFMove(temporaryURLs) };
+ };
+
+ auto [maybeMovedURLs, temporaryURLs] = copyToNewTemporaryDirectory(urlsFromUIKit.get());
+ [retainedSelf->_view _removeTemporaryDirectoriesWhenDeallocated:WTFMove(temporaryURLs)];
+ RunLoop::main().dispatch([retainedSelf = WTFMove(retainedSelf), maybeMovedURLs = WTFMove(maybeMovedURLs)] {
+ [retainedSelf _chooseFiles:maybeMovedURLs.get() displayString:displayStringForDocumentsAtURLs(maybeMovedURLs.get()) iconImage:iconForFile(maybeMovedURLs.get()[0]).get()];
+ });
+ }).get());
}
- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)documentPicker
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes