Skip to content

Commit d2f2555

Browse files
author
Tyschenko
committed
Update Blob files downloading implementation to cover more websites
1 parent f88bb05 commit d2f2555

File tree

5 files changed

+25
-21
lines changed

5 files changed

+25
-21
lines changed

android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.facebook.react.views.scroll.ScrollEventType;
4747
import com.reactnativecommunity.webview.events.TopCustomMenuSelectionEvent;
4848
import com.reactnativecommunity.webview.events.TopMessageEvent;
49+
import com.reactnativecommunity.webview.extension.file.BlobFileDownloader;
4950

5051
import org.json.JSONException;
5152
import org.json.JSONObject;
@@ -338,6 +339,10 @@ public void callInjectedJavaScript() {
338339
}
339340
}
340341

342+
public void injectBlobFileDownloaderScript() {
343+
evaluateJavascriptWithFallback(BlobFileDownloader.Companion.getBlobFileInterceptor());
344+
}
345+
341346
public void callInjectedJavaScriptBeforeContentLoaded() {
342347
if (getSettings().getJavaScriptEnabled() &&
343348
injectedJSBeforeContentLoaded != null &&

android/src/main/java/com/reactnativecommunity/webview/RNCWebViewClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public void onPageFinished(WebView webView, String url) {
7474

7575
reactWebView.callInjectedJavaScript();
7676

77+
reactWebView.injectBlobFileDownloaderScript();
78+
7779
emitFinishEvent(webView, url);
7880
}
7981
}

android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManagerImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class RNCWebViewManagerImpl(private val newArch: Boolean = false) {
124124
return@DownloadListener
125125
}
126126
if (url.startsWith("blob:")) {
127-
webView.evaluateJavascriptWithFallback(BlobFileDownloader.getBase64StringFromBlobUrl(url))
127+
// Handled in RNCWebView.injectBlobFileDownloaderScript()
128128
return@DownloadListener
129129
}
130130
webView.setIgnoreErrFailedForThisURL(url)

android/src/main/java/com/reactnativecommunity/webview/extension/file/Base64FileDownloader.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ internal object Base64FileDownloader {
8080

8181

8282
private fun getMimeTypeAndFileExtension(header: String): Pair<String, String> {
83-
val mimeType = Regex("data:(.*?);base64").find(header)?.groupValues?.get(1) ?: "application/octet-stream"
83+
val mimeType = Regex("data:([^;]+)").find(header)?.groupValues?.get(1) ?: "application/octet-stream"
8484
val extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType) ?: "bin"
8585
return mimeType to extension
8686
}

android/src/main/java/com/reactnativecommunity/webview/extension/file/BlobFileDownloader.kt

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,21 @@ internal class BlobFileDownloader(
2828
companion object {
2929
const val JS_INTERFACE_TAG: String = "BlobFileDownloader"
3030

31-
fun getBase64StringFromBlobUrl(blobUrl: String): String {
32-
return """
33-
javascript: var xhr = new XMLHttpRequest();
34-
xhr.open('GET', '$blobUrl', true);
35-
xhr.responseType = 'blob';
36-
xhr.onload = function(e) {
37-
if (this.status == 200) {
38-
var blobFile = this.response;
39-
var reader = new FileReader();
40-
reader.readAsDataURL(blobFile);
41-
reader.onloadend = function() {
42-
var base64 = reader.result;
43-
${JS_INTERFACE_TAG}.getBase64FromBlobData(base64);
44-
}
45-
}
46-
};
47-
xhr.send();
48-
""".trimIndent()
49-
}
31+
fun getBlobFileInterceptor(): String =
32+
"""
33+
(function() {
34+
const originalCreateObjectURL = URL.createObjectURL;
35+
URL.createObjectURL = function(blob) {
36+
const url = originalCreateObjectURL.call(URL, blob);
37+
const reader = new FileReader();
38+
reader.readAsDataURL(blob);
39+
reader.onloadend = function() {
40+
const base64 = reader.result;
41+
${JS_INTERFACE_TAG}.getBase64FromBlobData(base64);
42+
};
43+
return url;
44+
};
45+
})();
46+
""".trimIndent()
5047
}
5148
}

0 commit comments

Comments
 (0)