fix: crash when calling non-reentrant function in loadURL
(#40143)
This commit is contained in:
parent
563c370d51
commit
86df4db6f1
2 changed files with 28 additions and 2 deletions
|
@ -33,6 +33,7 @@
|
||||||
#include "components/security_state/content/content_utils.h"
|
#include "components/security_state/content/content_utils.h"
|
||||||
#include "components/security_state/core/security_state.h"
|
#include "components/security_state/core/security_state.h"
|
||||||
#include "content/browser/renderer_host/frame_tree_node.h" // nogncheck
|
#include "content/browser/renderer_host/frame_tree_node.h" // nogncheck
|
||||||
|
#include "content/browser/renderer_host/navigation_controller_impl.h" // nogncheck
|
||||||
#include "content/browser/renderer_host/render_frame_host_manager.h" // nogncheck
|
#include "content/browser/renderer_host/render_frame_host_manager.h" // nogncheck
|
||||||
#include "content/browser/renderer_host/render_widget_host_impl.h" // nogncheck
|
#include "content/browser/renderer_host/render_widget_host_impl.h" // nogncheck
|
||||||
#include "content/browser/renderer_host/render_widget_host_view_base.h" // nogncheck
|
#include "content/browser/renderer_host/render_widget_host_view_base.h" // nogncheck
|
||||||
|
@ -2384,8 +2385,20 @@ void WebContents::LoadURL(const GURL& url,
|
||||||
params.transition_type = ui::PageTransitionFromInt(
|
params.transition_type = ui::PageTransitionFromInt(
|
||||||
ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
|
ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
|
||||||
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
|
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
|
||||||
// Discard non-committed entries to ensure that we don't re-use a pending
|
|
||||||
// entry
|
// It's not safe to start a new navigation or otherwise discard the current
|
||||||
|
// one while the call that started it is still on the stack. See
|
||||||
|
// http://crbug.com/347742.
|
||||||
|
auto& ctrl_impl = static_cast<content::NavigationControllerImpl&>(
|
||||||
|
web_contents()->GetController());
|
||||||
|
if (ctrl_impl.in_navigate_to_pending_entry()) {
|
||||||
|
Emit("did-fail-load", static_cast<int>(net::ERR_FAILED),
|
||||||
|
net::ErrorToShortString(net::ERR_FAILED), url.possibly_invalid_spec(),
|
||||||
|
true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Discard non-committed entries to ensure we don't re-use a pending entry.
|
||||||
web_contents()->GetController().DiscardNonCommittedEntries();
|
web_contents()->GetController().DiscardNonCommittedEntries();
|
||||||
web_contents()->GetController().LoadURLWithParams(params);
|
web_contents()->GetController().LoadURLWithParams(params);
|
||||||
|
|
||||||
|
|
|
@ -431,6 +431,19 @@ describe('webContents module', () => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fails if loadURL is called inside a non-reentrant critical section', (done) => {
|
||||||
|
w.webContents.once('did-fail-load', (_event, _errorCode, _errorDescription, validatedURL) => {
|
||||||
|
expect(validatedURL).to.contain('blank.html');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
w.webContents.once('did-start-loading', () => {
|
||||||
|
w.loadURL(`file://${fixturesPath}/pages/blank.html`);
|
||||||
|
});
|
||||||
|
|
||||||
|
w.loadURL('data:text/html,<h1>HELLO</h1>');
|
||||||
|
});
|
||||||
|
|
||||||
it('sets appropriate error information on rejection', async () => {
|
it('sets appropriate error information on rejection', async () => {
|
||||||
let err: any;
|
let err: any;
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in a new issue