Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass large blob or file from chrome extension

I try to write an extension caching some large media files used on my website so you can locally cache those files when the extension is installed:

  1. I pass the URLs via chrome.runtime.sendMessage to the extension (works)
  2. fetch the media file via XMLHttpRequest in the background page (works)
  3. store the file using FileSystem API (works)
  4. get a File object and convert it to a URL using URL.createObjectURL (works)
  5. return the URL to the webpage (error)

Unfortunately the URL can not be used on the webpage. I get the following error:

Not allowed to load local resource: blob:chrome-extension%3A//hlcoamoijhlmhjjxxxbl/e66a4ebc-1787-47e9-aaaa-f4236b710bda

What is the best way to pass a large file object from an extension to the webpage?

like image 757
tom_ma Avatar asked May 24 '14 17:05

tom_ma


People also ask

Can a Chrome extension steal data?

Yes, it can. Extensions asks for permission(s) just before you install them. Permission like tabs, read and change all your data.., etc.

What is blob in Chrome?

Blobs are created in a renderer process, where their data is temporarily held for the browser (while Javascript execution can continue). When the browser has enough memory quota for the blob, it requests the data from the renderer. All blob data is transported from the renderer to the browser.

Can browser extensions access hard drive?

You will not have any execute permission on the root or anywhere nor will you have any read or write permission outside of the storage location. However, extensions can still be malicious if they gather information from a user of a web page (I am sure that Google can filter some suspicious extensions).

How big can Chrome extensions be?

Based on testing, both years ago and again today, the maximum width and height of the extension popup UI is width: 800px and height: 600px.


1 Answers

You're almost there.

After creating the blob:-URL on the background page and passing it to the content script, don't forward it to the web page. Instead, retrieve the blob using XMLHttpRequest, create a new blob:-URL, then send it to the web page.

// assuming that you've got a valid blob:chrome-extension-URL...
var blobchromeextensionurlhere = 'blob:chrome-extension....';
var x = new XMLHttpRequest();
x.open('GET', blobchromeextensionurlhere);
x.responseType = 'blob';
x.onload = function() {
    var url = URL.createObjectURL(x.response);
    // Example: blob:http%3A//example.com/17e9d36c-f5cd-48e6-b6b9-589890de1d23
    // Now pass url to the page, e.g. using postMessage
};
x.send();

If your current setup does not use content scripts, but e.g. the webRequest API to redirect request to the cached result, then another option is to use data-URIs (a File or Blob can be converted to a data-URI using <FileReader>.readAsDataURL. Data-URIs cannot be read using XMLHttpRequest, but this will be possible in future versions of Chrome (http://crbug.com/308768).

like image 115
Rob W Avatar answered Oct 10 '22 08:10

Rob W