Repository navigation
fix: revoke Blob URLs created by p5.File - #9155
Conversation
|
Hi, I'd like to take this on. |
|
@rk-3001 i think you should read contributor guidelines first. |
Vaivaswat2244
left a comment
There was a problem hiding this comment.
Thanks for the pr @slash-init . Matches what we discussed on the issue, left a few comments.
de025d3 to
6cbdcea
Compare
| this._userNode = node; | ||
| this._curElement = null; | ||
| this._elements = []; | ||
| this._blobUrls = new Set(); |
There was a problem hiding this comment.
Does this need to be on the p5 instance? Can it not be fully handled by p5.File itself? For cleaning up when the sketch is removed, use the remove lifecycle hook which is designed for this kind of use.
There was a problem hiding this comment.
@limzykenneth Thanks for the feedback! I looked through the lifecycle code and I think I understand the direction now: move the Blob URL cleanup into p5.File and use the existing remove lifecycle hook, rather than keeping _blobUrls on the p5 instance.
The one thing I'm still unsure about is how you'd like the File to keep track of which p5 instance it belongs to. Right now _load() gets pInst explicitly for that, but from your comment on dom.js, it sounds like you'd prefer not to pass it through like this.
I could move the cleanup into a single remove hook, but I don't want to introduce another registry or ownership mechanism if there's already a pattern in p5.js that I'm missing.
Is there a particular approach you had in mind for handling the per-instance cleanup here?
There was a problem hiding this comment.
It is a bit abstract for me to think about without actually writing the code so the explanation here may be a bit abstract as well. Passing pInst to File._load in this case could possibly work since it is a static function with no side effect. Another option if at all possible is to handle the object URL somewhere where this points to the p5 instance, that can be in lifecycle hooks or more likely a p5 function call such as createFileInput, eg.
const handleFileSelect = function (event) {
for (const file of event.target.files) {
File._load(file, trackObjectURL);
}
};
// Deliberate arrow function to keep reference to `this`
const trackObjectURL = (callback) => (blob) => {
if(blob instanceof Blob){
this._blobURLs.push(blob);
}
callback(blob);
};Hopefully that made sense, let me know if not and I can try to flesh out the idea more.
There was a problem hiding this comment.
@limzykenneth
Made the changes based on your feedback.
Moved the Blob URL cleanup into the remove lifecycle hook, removed the pInst plumbing from File._load(), and used the callback approach to track Blob-backed files per p5 instance. Also switched p5.File to p5.registerAddon().
Would love a feedback.
|
Looks good. Thanks! |
Resolves #9134
Changes:
p5.Fileobjects with Blob URLs on their owning p5 instance.removelifecycle hook.p5.File.revoke()for explicitly releasing a file’s Blob URL.p5.File.revoke()idempotent.createFileInput()andElement.drop()without passingpInstthroughFile._load().p5.Fileaddon throughp5.registerAddon().PR Checklist
npm run lintpasses