Commit 8adc9665 authored by Kevin McNee's avatar Kevin McNee Committed by Commit Bot

Reject portal activation when the portal contents is crashed

We already reject activation for error pages, so we now treat a renderer
crash the same. This also resolves a browser crash when attempting to
activate in this state.

Bug: 1106490
Change-Id: I569a24e27ce0128e6204c539a8e7c41041b3ae81
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2303562
Commit-Queue: Kevin McNee <mcnee@chromium.org>
Reviewed-by: default avatarLucas Gadani <lfg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#789574}
parent c1b63beb
......@@ -337,9 +337,10 @@ void Portal::Activate(blink::TransferableMessage data,
DCHECK_EQ(PAGE_TYPE_NORMAL,
predecessor_controller.GetLastCommittedEntry()->GetPageType());
// If the portal is showing an error page, reject activation.
if (portal_controller.GetLastCommittedEntry()->GetPageType() !=
PAGE_TYPE_NORMAL) {
// If the portal is crashed or is showing an error page, reject activation.
if (portal_contents_->IsCrashed() ||
portal_controller.GetLastCommittedEntry()->GetPageType() !=
PAGE_TYPE_NORMAL) {
std::move(callback).Run(
blink::mojom::PortalActivateResult::kRejectedDueToErrorInPortal);
return;
......@@ -543,6 +544,10 @@ void Portal::NavigationStateChanged(WebContents* source,
outer_contents->GetDelegate()->NavigationStateChanged(source, changed_flags);
}
bool Portal::ShouldFocusPageAfterCrash() {
return false;
}
void Portal::CanDownload(const GURL& url,
const std::string& request_method,
base::OnceCallback<void(bool)> callback) {
......
......@@ -105,6 +105,7 @@ class CONTENT_EXPORT Portal : public blink::mojom::Portal,
WebContents* GetResponsibleWebContents(WebContents* web_contents) override;
void NavigationStateChanged(WebContents* source,
InvalidateTypes changed_flags) override;
bool ShouldFocusPageAfterCrash() override;
void CanDownload(const GURL& url,
const std::string& request_method,
base::OnceCallback<void(bool)> callback) override;
......
......@@ -1894,6 +1894,68 @@ IN_PROC_BROWSER_TEST_F(PortalBrowserTest,
activated_observer.result());
}
namespace {
void CrashContents(WebContentsImpl* contents) {
#if defined(OS_WIN)
// TODO(mcnee): |CrashTab| on windows makes it look like the process
// terminated normally. For now we crash it properly here.
RenderProcessHost* rph = contents->GetMainFrame()->GetProcess();
RenderProcessHostWatcher watcher(
rph, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
EXPECT_TRUE(rph->Shutdown(RESULT_CODE_KILLED));
watcher.Wait();
EXPECT_FALSE(watcher.did_exit_normally());
#else
CrashTab(contents);
#endif
EXPECT_TRUE(contents->IsCrashed());
}
} // namespace
IN_PROC_BROWSER_TEST_F(PortalBrowserTest, RejectActivationOfCrashedPages) {
GURL main_url(embedded_test_server()->GetURL("portal.test", "/title1.html"));
ASSERT_TRUE(NavigateToURL(shell(), main_url));
WebContentsImpl* web_contents_impl =
static_cast<WebContentsImpl*>(shell()->web_contents());
RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame();
GURL portal_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
Portal* portal = CreatePortalToUrl(web_contents_impl, portal_url);
WebContentsImpl* portal_contents = portal->GetPortalContents();
CrashContents(portal_contents);
PortalActivatedObserver activated_observer(portal);
EXPECT_TRUE(
ExecJs(main_frame, "document.querySelector('portal').activate();"));
EXPECT_EQ(blink::mojom::PortalActivateResult::kRejectedDueToErrorInPortal,
activated_observer.WaitForActivateResult());
}
IN_PROC_BROWSER_TEST_F(PortalBrowserTest, ActivatePreviouslyCrashedPortal) {
GURL main_url(embedded_test_server()->GetURL("portal.test", "/title1.html"));
ASSERT_TRUE(NavigateToURL(shell(), main_url));
WebContentsImpl* web_contents_impl =
static_cast<WebContentsImpl*>(shell()->web_contents());
RenderFrameHostImpl* main_frame = web_contents_impl->GetMainFrame();
GURL portal_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
Portal* portal = CreatePortalToUrl(web_contents_impl, portal_url);
WebContentsImpl* portal_contents = portal->GetPortalContents();
CrashContents(portal_contents);
TestNavigationObserver navigation_observer(portal_contents);
EXPECT_TRUE(ExecJs(
main_frame,
JsReplace("document.querySelector('portal').src = $1;", portal_url)));
navigation_observer.Wait();
PortalActivatedObserver activated_observer(portal);
EXPECT_TRUE(
ExecJs(main_frame, "document.querySelector('portal').activate();"));
EXPECT_EQ(blink::mojom::PortalActivateResult::kPredecessorWillUnload,
activated_observer.WaitForActivateResult());
}
IN_PROC_BROWSER_TEST_F(PortalBrowserTest, CallCreateProxyAndAttachPortalTwice) {
EXPECT_TRUE(NavigateToURL(
shell(), embedded_test_server()->GetURL("portal.test", "/title1.html")));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment