fix: crash when renderer process crashes while webview is reloading (#46735)
WebView uses WebContentsViewChildFrame, which doesn't have a Focus impl and triggers a fatal NOTREACHED.
This commit is contained in:
parent
37f8db15e9
commit
3e78bbde6a
3 changed files with 31 additions and 0 deletions
|
@ -4004,6 +4004,14 @@ void WebContents::ExitPictureInPicture() {
|
||||||
PictureInPictureWindowManager::GetInstance()->ExitPictureInPicture();
|
PictureInPictureWindowManager::GetInstance()->ExitPictureInPicture();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool WebContents::ShouldFocusPageAfterCrash(content::WebContents* source) {
|
||||||
|
// WebView uses WebContentsViewChildFrame, which doesn't have a Focus impl
|
||||||
|
// and triggers a fatal NOTREACHED.
|
||||||
|
if (is_guest())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void WebContents::DevToolsSaveToFile(const std::string& url,
|
void WebContents::DevToolsSaveToFile(const std::string& url,
|
||||||
const std::string& content,
|
const std::string& content,
|
||||||
bool save_as,
|
bool save_as,
|
||||||
|
|
|
@ -709,6 +709,7 @@ class WebContents final : public ExclusiveAccessContext,
|
||||||
content::PictureInPictureResult EnterPictureInPicture(
|
content::PictureInPictureResult EnterPictureInPicture(
|
||||||
content::WebContents* web_contents) override;
|
content::WebContents* web_contents) override;
|
||||||
void ExitPictureInPicture() override;
|
void ExitPictureInPicture() override;
|
||||||
|
bool ShouldFocusPageAfterCrash(content::WebContents* source) override;
|
||||||
|
|
||||||
// InspectableWebContentsDelegate:
|
// InspectableWebContentsDelegate:
|
||||||
void DevToolsSaveToFile(const std::string& url,
|
void DevToolsSaveToFile(const std::string& url,
|
||||||
|
|
|
@ -1895,6 +1895,28 @@ describe('<webview> tag', function () {
|
||||||
|
|
||||||
expect(channel).to.equal('onbeforeunload');
|
expect(channel).to.equal('onbeforeunload');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not crash when renderer process crashes', async function () {
|
||||||
|
// It takes more time to wait for the rendering process to crash
|
||||||
|
this.timeout(120000);
|
||||||
|
await loadWebView(w, {
|
||||||
|
nodeintegration: 'on',
|
||||||
|
webpreferences: 'contextIsolation=no',
|
||||||
|
src: blankPageUrl
|
||||||
|
});
|
||||||
|
// Create a crash in the rendering process of a webview
|
||||||
|
await w.executeJavaScript(`new Promise((resolve, reject) => {
|
||||||
|
webview.addEventListener('render-process-gone', (e) => resolve({...e}), {once: true})
|
||||||
|
webview.executeJavaScript('process.crash()', true)
|
||||||
|
})`);
|
||||||
|
// Reload the webview and the main process will not crash.
|
||||||
|
await w.executeJavaScript(`new Promise((resolve, reject) => {
|
||||||
|
webview.reload()
|
||||||
|
webview.addEventListener('did-finish-load', () => {
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
})`);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('<webview>.goForward()', () => {
|
describe('<webview>.goForward()', () => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue