diff --git a/shell/browser/api/electron_api_data_pipe_holder.cc b/shell/browser/api/electron_api_data_pipe_holder.cc index f33f1d9b85b99..67fe81959a12f 100644 --- a/shell/browser/api/electron_api_data_pipe_holder.cc +++ b/shell/browser/api/electron_api_data_pipe_holder.cc @@ -86,8 +86,11 @@ class DataPipeReader { if (result == MOJO_RESULT_OK) { // success remaining_size_ -= length; head_ += length; - if (remaining_size_ == 0) + if (remaining_size_ == 0) { OnSuccess(); + } else { + handle_watcher_.ArmOrNotify(); + } } else if (result == MOJO_RESULT_SHOULD_WAIT) { // IO pending handle_watcher_.ArmOrNotify(); } else { // error diff --git a/spec-main/api-session-spec.ts b/spec-main/api-session-spec.ts index a1be9cf2db7a7..f7817c7e03376 100644 --- a/spec-main/api-session-spec.ts +++ b/spec-main/api-session-spec.ts @@ -529,6 +529,50 @@ describe('session module', () => { }); }); + describe('ses.getBlobData2()', () => { + const scheme = 'cors-blob'; + const protocol = session.defaultSession.protocol; + const url = `${scheme}://host`; + after(async () => { + await protocol.unregisterProtocol(scheme); + }); + afterEach(closeAllWindows); + + it('returns blob data for uuid', (done) => { + const content = ` + + `; + + protocol.registerStringProtocol(scheme, (request, callback) => { + try { + if (request.method === 'GET') { + callback({ data: content, mimeType: 'text/html' }); + } else if (request.method === 'POST') { + const uuid = request.uploadData![1].blobUUID; + expect(uuid).to.be.a('string'); + session.defaultSession.getBlobData(uuid!).then(result => { + try { + const data = new Array(65_537).fill('a'); + expect(result.toString()).to.equal(data.join('')); + done(); + } catch (e) { + done(e); + } + }); + } + } catch (e) { + done(e); + } + }); + const w = new BrowserWindow({ show: false }); + w.loadURL(url); + }); + }); + describe('ses.setCertificateVerifyProc(callback)', () => { let server: http.Server;