fix: do not mark navigations interupted with same-document navigations as aborted (#18109)
* fix: do not mark navigations interupted with same-document navigations as aborted * spec: add tests for the loadURL promise
This commit is contained in:
parent
99d4537075
commit
636273b6cb
2 changed files with 28 additions and 1 deletions
|
@ -86,10 +86,16 @@ const NavigationController = (function () {
|
||||||
let navigationStarted = false
|
let navigationStarted = false
|
||||||
const navigationListener = (event, url, isSameDocument, isMainFrame, frameProcessId, frameRoutingId, navigationId) => {
|
const navigationListener = (event, url, isSameDocument, isMainFrame, frameProcessId, frameRoutingId, navigationId) => {
|
||||||
if (isMainFrame) {
|
if (isMainFrame) {
|
||||||
if (navigationStarted) {
|
if (navigationStarted && !isSameDocument) {
|
||||||
// the webcontents has started another unrelated navigation in the
|
// the webcontents has started another unrelated navigation in the
|
||||||
// main frame (probably from the app calling `loadURL` again); reject
|
// main frame (probably from the app calling `loadURL` again); reject
|
||||||
// the promise
|
// the promise
|
||||||
|
// We should only consider the request aborted if the "navigation" is
|
||||||
|
// actually navigating and not simply transitioning URL state in the
|
||||||
|
// current context. E.g. pushState and `location.hash` changes are
|
||||||
|
// considered navigation events but are triggered with isSameDocument.
|
||||||
|
// We can ignore these to allow virtual routing on page load as long
|
||||||
|
// as the routing does not leave the document
|
||||||
return rejectAndCleanup(-3, 'ERR_ABORTED', url)
|
return rejectAndCleanup(-3, 'ERR_ABORTED', url)
|
||||||
}
|
}
|
||||||
navigationStarted = true
|
navigationStarted = true
|
||||||
|
|
|
@ -289,6 +289,27 @@ describe('BrowserWindow module', () => {
|
||||||
w.loadURL(`data:image/png;base64,${data}`)
|
w.loadURL(`data:image/png;base64,${data}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should return a promise', () => {
|
||||||
|
const p = w.loadURL('about:blank')
|
||||||
|
expect(p).to.have.property('then')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return a promise that resolves', async () => {
|
||||||
|
expect(w.loadURL('about:blank')).to.eventually.be.fulfilled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return a promise that rejects on a load failure', async () => {
|
||||||
|
const data = Buffer.alloc(2 * 1024 * 1024).toString('base64')
|
||||||
|
const p = w.loadURL(`data:image/png;base64,${data}`)
|
||||||
|
await expect(p).to.eventually.be.rejected()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should return a promise that resolves even if pushState occurs during navigation', async () => {
|
||||||
|
const data = Buffer.alloc(2 * 1024 * 1024).toString('base64')
|
||||||
|
const p = w.loadURL('data:text/html,<script>window.history.pushState({}, "/foo")</script>')
|
||||||
|
await expect(p).to.eventually.be.fulfilled()
|
||||||
|
})
|
||||||
|
|
||||||
describe('POST navigations', () => {
|
describe('POST navigations', () => {
|
||||||
afterEach(() => { w.webContents.session.webRequest.onBeforeSendHeaders(null) })
|
afterEach(() => { w.webContents.session.webRequest.onBeforeSendHeaders(null) })
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue