Open loretoparisi opened 6 years ago
[UPDATE]
Okay, I have found out the issue with the new frame / frame delegates, I was in fact missing the latter WebPolicyDecisionListener
listener:
- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation
request:(NSURLRequest *)request
frame:(WebFrame *)frame
decisionListener:(id<WebPolicyDecisionListener>)listener
{
if (WebNavigationTypeLinkClicked == [[actionInformation objectForKey:WebActionNavigationTypeKey] intValue])
{
NSLog(@"CLICKED %@", [request URL]);
}
[listener use]; // Say for webview to do it work...
}
So I guess now I need to handle the download policy here in some way...
[UPDATE] - PART II So, in the Objective-C / Cocoa Realm I have approached the following
NSLog(@"CLICKED %@", [request URL]);
NSString *needle = @"blob:";
if( [[[request URL] absoluteString] hasPrefix:needle] ) {
// create a download link from blob url
NSRange blobRange = [[[request URL] absoluteString] rangeOfString:needle];
NSString * blobURL = [[[request URL] absoluteString] substringFromIndex:blobRange.location + needle.length];
NSURLRequest *downloadURLRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:blobURL]];
NSLog(@"BLOB URL:%@", [[downloadURLRequest URL] absoluteString]);
NSURLSessionDownloadTask *downloadTask = [[NSURLSession sharedSession] downloadTaskWithRequest:downloadURLRequest
completionHandler:^(NSURL *location, __unused NSURLResponse *response, NSError *error) {
if (location) {
// get download folders
NSArray *docDirs = NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory,
NSUserDomainMask, YES);
NSString *destinationFilename = [docDirs objectAtIndex:0];
if (destinationFilename) {
destinationFilename = [destinationFilename stringByAppendingPathComponent:@"out.json"];
NSLog(@"LOCATION %@ DOWNLOAD %@", [location absoluteString], destinationFilename);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *anError = nil;
NSString *fromPath = [location path];
if ([fileManager fileExistsAtPath:destinationFilename])
[fileManager removeItemAtPath:destinationFilename error:&anError];
BOOL fileCopied = [fileManager moveItemAtPath:fromPath toPath:destinationFilename error:&anError];
if (fileCopied == NO) {
} else {
NSLog(@"Downloaded!");
}
}
} else {
NSLog(@"Error:%@", [error description]);
}
}];
[downloadTask resume];
return;
}
Basically I intercept the blob:
urls that is a typical HTML5 Blob
url, and I try to download, but - of course 😁 it does not work because that url it seems not be a valid url, so I get an error back from the file server - of coruse
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot GET /57de17ae-92bc-4553-a9d8-ac1b0f1f6c4f</pre>
</body>
</html>
So despite the fact that the code above is generally working fine for real files (i.e. having a valid URI), I was wrong about the Blob
files, since these files are not actual files, so there must be a different way to handle this...
I'm using the recent (actually not so recent) HTML5 Blob API to download a file from a JavaScript client like
When the
Blob
is not supported it uses the standard DOM way. When I run my application within MacGap2 running this code called let's say like:will lead to this error:
I'm not sure if this is connected to the secure transport due to the
NSAppTransportSecurity
, but in my case I'm creating a downloadable content on the fly, which url is onlocalhost
.I have also tried to intercept the link click through the
PolicyDelegate
, but for some reason I do not get any log here: