Click to Open PDF: Fix throttle navigation-within-navigation crash.
This CL updates:
1) PDFIFrameNavigationThrottle to PostTask the navigation so that
there is no navigation-within-a-navigation antipattern.
2) Update NavigationControllerImpl so there's no crash if the subframe
has no existing navigation entry.
Bug: 924823
Change-Id: Ibc0dac995a740c3f67919789988ac4465b86fda6
Reviewed-on: https://chromium-review.googlesource.com/c/1440327
Commit-Queue: Tommy Li <[email protected]>
Reviewed-by: Lei Zhang <[email protected]>
Reviewed-by: Nasko Oskov <[email protected]>
Cr-Commit-Position: refs/heads/master@{#629001}
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 32cb4633..ad2231d4 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -2774,14 +2774,25 @@
}
std::unique_ptr<NavigationEntryImpl> entry;
+ // extra_headers in params are \n separated; navigation entries want \r\n.
+ std::string extra_headers_crlf;
+ base::ReplaceChars(params.extra_headers, "\n", "\r\n", &extra_headers_crlf);
// For subframes, create a pending entry with a corresponding frame entry.
if (!node->IsMainFrame()) {
- DCHECK(GetLastCommittedEntry());
-
- // Create an identical NavigationEntry with a new FrameNavigationEntry for
- // the target subframe.
- entry = GetLastCommittedEntry()->Clone();
+ if (GetLastCommittedEntry()) {
+ // Create an identical NavigationEntry with a new FrameNavigationEntry for
+ // the target subframe.
+ entry = GetLastCommittedEntry()->Clone();
+ } else {
+ // If there's no last committed entry, create an entry for about:blank
+ // with a subframe entry for our destination.
+ // TODO(creis): Ensure this case can't exist in https://crbug.com/524208.
+ entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry(
+ GURL(url::kAboutBlankURL), params.referrer, params.transition_type,
+ params.is_renderer_initiated, extra_headers_crlf, browser_context_,
+ blob_url_loader_factory));
+ }
entry->AddOrUpdateFrameEntry(
node, -1, -1, nullptr,
@@ -2790,10 +2801,6 @@
PageState(), "GET", -1, blob_url_loader_factory);
} else {
// Otherwise, create a pending entry for the main frame.
-
- // extra_headers in params are \n separated; navigation entries want \r\n.
- std::string extra_headers_crlf;
- base::ReplaceChars(params.extra_headers, "\n", "\r\n", &extra_headers_crlf);
entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry(
params.url, params.referrer, params.transition_type,
params.is_renderer_initiated, extra_headers_crlf, browser_context_,