Merge pull request #5199 from Mr0grog/5183-disambiguate-loading-from-main-frame-loading
Add `isLoadingMainFrame()` to WebContents
This commit is contained in:
commit
aa29dc0c8a
6 changed files with 88 additions and 1 deletions
|
@ -793,6 +793,14 @@ bool WebContents::IsLoading() const {
|
||||||
return web_contents()->IsLoading();
|
return web_contents()->IsLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WebContents::IsLoadingMainFrame() const {
|
||||||
|
// Comparing site instances works because Electron always creates a new site
|
||||||
|
// instance when navigating, regardless of origin. See AtomBrowserClient.
|
||||||
|
return (web_contents()->GetLastCommittedURL().is_empty() ||
|
||||||
|
web_contents()->GetSiteInstance() !=
|
||||||
|
web_contents()->GetPendingSiteInstance()) && IsLoading();
|
||||||
|
}
|
||||||
|
|
||||||
bool WebContents::IsWaitingForResponse() const {
|
bool WebContents::IsWaitingForResponse() const {
|
||||||
return web_contents()->IsWaitingForResponse();
|
return web_contents()->IsWaitingForResponse();
|
||||||
}
|
}
|
||||||
|
@ -1195,6 +1203,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
|
||||||
.SetMethod("_getURL", &WebContents::GetURL)
|
.SetMethod("_getURL", &WebContents::GetURL)
|
||||||
.SetMethod("getTitle", &WebContents::GetTitle)
|
.SetMethod("getTitle", &WebContents::GetTitle)
|
||||||
.SetMethod("isLoading", &WebContents::IsLoading)
|
.SetMethod("isLoading", &WebContents::IsLoading)
|
||||||
|
.SetMethod("isLoadingMainFrame", &WebContents::IsLoadingMainFrame)
|
||||||
.SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse)
|
.SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse)
|
||||||
.SetMethod("_stop", &WebContents::Stop)
|
.SetMethod("_stop", &WebContents::Stop)
|
||||||
.SetMethod("_goBack", &WebContents::GoBack)
|
.SetMethod("_goBack", &WebContents::GoBack)
|
||||||
|
|
|
@ -62,6 +62,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
|
||||||
GURL GetURL() const;
|
GURL GetURL() const;
|
||||||
base::string16 GetTitle() const;
|
base::string16 GetTitle() const;
|
||||||
bool IsLoading() const;
|
bool IsLoading() const;
|
||||||
|
bool IsLoadingMainFrame() const;
|
||||||
bool IsWaitingForResponse() const;
|
bool IsWaitingForResponse() const;
|
||||||
void Stop();
|
void Stop();
|
||||||
void ReloadIgnoringCache();
|
void ReloadIgnoringCache();
|
||||||
|
|
|
@ -353,6 +353,10 @@ Returns the title of the current web page.
|
||||||
|
|
||||||
Returns whether web page is still loading resources.
|
Returns whether web page is still loading resources.
|
||||||
|
|
||||||
|
### `webContents.isLoadingMainFrame()`
|
||||||
|
|
||||||
|
Returns whether the main frame (and not just iframes or frames within it) is still loading.
|
||||||
|
|
||||||
### `webContents.isWaitingForResponse()`
|
### `webContents.isWaitingForResponse()`
|
||||||
|
|
||||||
Returns whether the web page is waiting for a first-response from the main
|
Returns whether the web page is waiting for a first-response from the main
|
||||||
|
|
|
@ -116,7 +116,7 @@ let wrapWebContents = function (webContents) {
|
||||||
callback = hasUserGesture
|
callback = hasUserGesture
|
||||||
hasUserGesture = false
|
hasUserGesture = false
|
||||||
}
|
}
|
||||||
if (this.getURL() && !this.isLoading()) {
|
if (this.getURL() && !this.isLoadingMainFrame()) {
|
||||||
return asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture)
|
return asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture)
|
||||||
} else {
|
} else {
|
||||||
return this.once('did-finish-load', asyncWebFrameMethods.bind(this, requestId, 'executeJavaScript', callback, code, hasUserGesture))
|
return this.once('did-finish-load', asyncWebFrameMethods.bind(this, requestId, 'executeJavaScript', callback, code, hasUserGesture))
|
||||||
|
|
|
@ -335,6 +335,7 @@ var registerWebViewElement = function () {
|
||||||
'loadURL',
|
'loadURL',
|
||||||
'getTitle',
|
'getTitle',
|
||||||
'isLoading',
|
'isLoading',
|
||||||
|
'isLoadingMainFrame',
|
||||||
'isWaitingForResponse',
|
'isWaitingForResponse',
|
||||||
'stop',
|
'stop',
|
||||||
'reload',
|
'reload',
|
||||||
|
|
|
@ -4,6 +4,7 @@ const assert = require('assert')
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
|
const http = require('http')
|
||||||
|
|
||||||
const remote = require('electron').remote
|
const remote = require('electron').remote
|
||||||
const screen = require('electron').screen
|
const screen = require('electron').screen
|
||||||
|
@ -18,6 +19,23 @@ const isCI = remote.getGlobal('isCi')
|
||||||
describe('browser-window module', function () {
|
describe('browser-window module', function () {
|
||||||
var fixtures = path.resolve(__dirname, 'fixtures')
|
var fixtures = path.resolve(__dirname, 'fixtures')
|
||||||
var w = null
|
var w = null
|
||||||
|
var server
|
||||||
|
|
||||||
|
before(function (done) {
|
||||||
|
server = http.createServer(function (req, res) {
|
||||||
|
function respond() { res.end(''); }
|
||||||
|
setTimeout(respond, req.url.includes('slow') ? 200 : 0)
|
||||||
|
});
|
||||||
|
server.listen(0, '127.0.0.1', function () {
|
||||||
|
server.url = 'http://127.0.0.1:' + server.address().port
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
after(function () {
|
||||||
|
server.close()
|
||||||
|
server = null
|
||||||
|
})
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
if (w != null) {
|
if (w != null) {
|
||||||
|
@ -634,6 +652,44 @@ describe('browser-window module', function () {
|
||||||
assert.equal(w.isResizable(), true)
|
assert.equal(w.isResizable(), true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('loading main frame state', function () {
|
||||||
|
it('is true when the main frame is loading', function (done) {
|
||||||
|
w.webContents.on('did-start-loading', function() {
|
||||||
|
assert.equal(w.webContents.isLoadingMainFrame(), true)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
w.webContents.loadURL(server.url)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('is false when only a subframe is loading', function (done) {
|
||||||
|
w.webContents.once('did-finish-load', function() {
|
||||||
|
assert.equal(w.webContents.isLoadingMainFrame(), false)
|
||||||
|
w.webContents.on('did-start-loading', function() {
|
||||||
|
assert.equal(w.webContents.isLoadingMainFrame(), false)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
w.webContents.executeJavaScript(`
|
||||||
|
var iframe = document.createElement('iframe')
|
||||||
|
iframe.src = '${server.url}/page2'
|
||||||
|
document.body.appendChild(iframe)
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
w.webContents.loadURL(server.url)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('is true when navigating to pages from the same origin', function (done) {
|
||||||
|
w.webContents.once('did-finish-load', function() {
|
||||||
|
assert.equal(w.webContents.isLoadingMainFrame(), false)
|
||||||
|
w.webContents.on('did-start-loading', function() {
|
||||||
|
assert.equal(w.webContents.isLoadingMainFrame(), true)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
w.webContents.loadURL(`${server.url}/page2`)
|
||||||
|
})
|
||||||
|
w.webContents.loadURL(server.url)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('window states (excluding Linux)', function () {
|
describe('window states (excluding Linux)', function () {
|
||||||
|
@ -798,6 +854,22 @@ describe('browser-window module', function () {
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('works after page load and during subframe load', function (done) {
|
||||||
|
w.webContents.once('did-finish-load', function() {
|
||||||
|
// initiate a sub-frame load, then try and execute script during it
|
||||||
|
w.webContents.executeJavaScript(`
|
||||||
|
var iframe = document.createElement('iframe')
|
||||||
|
iframe.src = '${server.url}/slow'
|
||||||
|
document.body.appendChild(iframe)
|
||||||
|
`, function() {
|
||||||
|
w.webContents.executeJavaScript(`console.log('hello')`, function() {
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
w.loadURL(server.url)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('deprecated options', function () {
|
describe('deprecated options', function () {
|
||||||
|
|
Loading…
Reference in a new issue